solenv/inc/minor.mk | 2 +- vcl/aqua/source/gdi/ctlayout.cxx | 29 ++++++++++++++++------------- vcl/source/gdi/dibtools.cxx | 11 +++++++---- 3 files changed, 24 insertions(+), 18 deletions(-)
New commits: commit 472884c5fd8f6008ca98f88d8a7b14eec5518117 Author: Herbert Dürr <h...@apache.org> Date: Thu Apr 10 09:33:57 2014 +0000 #i124617# make CoreText tolerate PDF-export's unexpected font switches For some documents it was observed that the PDF-export switches the font after text layout and before text drawing/measuring. This use case is quite atrocious and unexpected and crashed our CoreText glue code. The other platforms survive it though; to minimize the risk to them only the CoreText glue gets adapted to survive this scenario. diff --git a/vcl/aqua/source/gdi/ctlayout.cxx b/vcl/aqua/source/gdi/ctlayout.cxx index 4aa5112..6005b15 100644 --- a/vcl/aqua/source/gdi/ctlayout.cxx +++ b/vcl/aqua/source/gdi/ctlayout.cxx @@ -52,9 +52,8 @@ public: virtual void Simplify( bool bIsBase ); private: - const CTTextStyle* const mpTextStyle; - // CoreText specific objects + CFMutableDictionaryRef mpStyleDict; CFAttributedStringRef mpAttrString; CTLineRef mpCTLine; @@ -67,6 +66,9 @@ private: // in these cases the font scale becomes something bigger than 1.0 float mfFontScale; // TODO: does CoreText have a font size limit? + CGFloat mfFontRotation; // text direction angle (in radians) + CGFloat mfFontStretch; <1.0: font is squeezed, >1.0 font is stretched + // cached details about the resulting layout // mutable members since these details are all lazy initialized mutable double mfCachedWidth; // cached value of resulting typographical width @@ -79,17 +81,19 @@ private: // ======================================================================= CTLayout::CTLayout( const CTTextStyle* pTextStyle ) -: mpTextStyle( pTextStyle ) +: mpStyleDict( pTextStyle->GetStyleDict() ) , mpAttrString( NULL ) , mpCTLine( NULL ) , mnCharCount( 0 ) , mnTrailingSpaceCount( 0 ) , mfTrailingSpaceWidth( 0.0 ) , mfFontScale( pTextStyle->mfFontScale ) +, mfFontRotation( pTextStyle->mfFontRotation ) +, mfFontStretch( pTextStyle->mfFontStretch ) , mfCachedWidth( -1 ) , mnBaseAdv( 0 ) { - CFRetain( mpTextStyle->GetStyleDict() ); + CFRetain( mpStyleDict ); } // ----------------------------------------------------------------------- @@ -100,7 +104,7 @@ CTLayout::~CTLayout() CFRelease( mpCTLine ); if( mpAttrString ) CFRelease( mpAttrString ); - CFRelease( mpTextStyle->GetStyleDict() ); + CFRelease( mpStyleDict ); } // ----------------------------------------------------------------------- @@ -131,7 +135,7 @@ bool CTLayout::LayoutText( ImplLayoutArgs& rArgs ) } // create the CoreText line layout using the requested text style - mpAttrString = CFAttributedStringCreate( NULL, aCFText, mpTextStyle->GetStyleDict() ); + mpAttrString = CFAttributedStringCreate( NULL, aCFText, mpStyleDict ); mpCTLine = CTLineCreateWithAttributedString( mpAttrString ); CFRelease( aCFText); @@ -201,7 +205,7 @@ void CTLayout::AdjustLayout( ImplLayoutArgs& rArgs ) CFRelease( mpCTLine ); CFStringRef aCFText = CFStringCreateWithCharactersNoCopy( NULL, rArgs.mpStr + mnMinCharPos, mnCharCount - mnTrailingSpaceCount, kCFAllocatorNull ); - CFAttributedStringRef pAttrStr = CFAttributedStringCreate( NULL, aCFText, mpTextStyle->GetStyleDict() ); + CFAttributedStringRef pAttrStr = CFAttributedStringCreate( NULL, aCFText, mpStyleDict ); mpCTLine = CTLineCreateWithAttributedString( pAttrStr ); CFRelease( aCFText); CFRelease( pAttrStr ); @@ -249,12 +253,11 @@ void CTLayout::DrawText( SalGraphics& rGraphics ) const const Point aVclPos = GetDrawPosition( Point(mnBaseAdv,0) ); CGPoint aTextPos = { +aVclPos.X()/mfFontScale, -aVclPos.Y()/mfFontScale }; - if( mpTextStyle->mfFontRotation != 0.0 ) + if( mfFontRotation != 0.0 ) { - const CGFloat fRadians = mpTextStyle->mfFontRotation; - CGContextRotateCTM( rAquaGraphics.mrContext, +fRadians ); + CGContextRotateCTM( rAquaGraphics.mrContext, +mfFontRotation ); - const CGAffineTransform aInvMatrix = CGAffineTransformMakeRotation( -fRadians ); + const CGAffineTransform aInvMatrix = CGAffineTransformMakeRotation( -mfFontRotation ); aTextPos = CGPointApplyAffineTransform( aTextPos, aInvMatrix ); } @@ -353,12 +356,12 @@ int CTLayout::GetNextGlyphs( int nLen, sal_GlyphId* pOutGlyphIds, Point& rPos, i // convert glyph details for VCL *(pOutGlyphIds++) = pCGGlyphIdx[ nSubIndex ]; if( pGlyphAdvances ) - *(pGlyphAdvances++) = pCGGlyphAdvs[ nSubIndex ].width; + *(pGlyphAdvances++) = mfFontStretch * pCGGlyphAdvs[ nSubIndex ].width; if( pCharIndexes ) *(pCharIndexes++) = pCGGlyphStrIdx[ nSubIndex] + mnMinCharPos; if( !nCount++ ) { const CGPoint& rCurPos = pCGGlyphPos[ nSubIndex ]; - rPos = GetDrawPosition( Point( mfFontScale * rCurPos.x, mfFontScale * rCurPos.y) ); + rPos = GetDrawPosition( Point( mfFontScale * mfFontStretch * rCurPos.x, mfFontScale * rCurPos.y) ); } } nSubIndex = 0; // prepare for the next glyph run commit 4d57671f3bdd9628cd21d0991e50a96b10abf63a Author: Oliver-Rainer Wittmann <o...@apache.org> Date: Thu Apr 10 08:47:58 2014 +0000 124639: correct consideration of not provided header offset when checking certain read header data diff --git a/vcl/source/gdi/dibtools.cxx b/vcl/source/gdi/dibtools.cxx index d4ea127..503ccf9 100755 --- a/vcl/source/gdi/dibtools.cxx +++ b/vcl/source/gdi/dibtools.cxx @@ -615,12 +615,15 @@ bool ImplReadDIBBody( SvStream& rIStm, Bitmap& rBmp, Bitmap* pBmpAlpha, sal_uLon { DIBV5Header aHeader; const sal_uLong nStmPos = rIStm.Tell(); - bool bRet(false); - bool bTopDown(false); + bool bRet( false ); + bool bTopDown( false ); - if(ImplReadDIBInfoHeader(rIStm, aHeader, bTopDown) && aHeader.nWidth && aHeader.nHeight && aHeader.nBitCount) + if ( ImplReadDIBInfoHeader( rIStm, aHeader, bTopDown ) + && aHeader.nWidth != 0 + && aHeader.nHeight != 0 + && aHeader.nBitCount != 0 ) { - if (aHeader.nSize > nOffset) + if ( nOffset > 0 && aHeader.nSize > nOffset ) { // Header size claims to extend into the image data. // Looks like an error. commit b85ed2610713a082bf2f17171177695557e86575 Author: Oliver-Rainer Wittmann <o...@apache.org> Date: Thu Apr 10 08:05:53 2014 +0000 really completing 'adapt build meta data for better differentiation to 4.1' diff --git a/solenv/inc/minor.mk b/solenv/inc/minor.mk index 397a1e1..cdc095a 100644 --- a/solenv/inc/minor.mk +++ b/solenv/inc/minor.mk @@ -22,4 +22,4 @@ RSCVERSION=420 RSCREVISION=420m1(Build:9800) BUILD=9800 LAST_MINOR=m1 -SOURCEVERSION=AOO410 +SOURCEVERSION=AOO420
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits