diff options
author | Tor Lillqvist <tml@iki.fi> | 2013-06-19 15:12:30 +0300 |
---|---|---|
committer | Tor Lillqvist <tml@iki.fi> | 2013-06-19 15:15:00 +0300 |
commit | b9c46f46cebc0ebed5a91f8fbb9d0a01366f1f77 (patch) | |
tree | b6dd1ad35ad8c3e93334237d35b49c33d872c1a5 | |
parent | a662d427108d781122f979392ce544017d14fc17 (diff) |
fdo#63616: Fix GetBoundRect for rotated text in CoreText backend
Change-Id: I8c9ee84afd71481c2c6b002265b86e048f369f5c
-rw-r--r-- | vcl/coretext/ctlayout.cxx | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/vcl/coretext/ctlayout.cxx b/vcl/coretext/ctlayout.cxx index e2a118b1e089..1e89a39e4ac6 100644 --- a/vcl/coretext/ctlayout.cxx +++ b/vcl/coretext/ctlayout.cxx @@ -433,18 +433,39 @@ bool CTLayout::GetBoundRect( SalGraphics& rGraphics, Rectangle& rVCLRect ) const return false; #endif + CGContextSaveGState( rAquaGraphics.mrContext ); + CGContextScaleCTM( rAquaGraphics.mrContext, 1.0, -1.0 ); + CGContextSetShouldAntialias( rAquaGraphics.mrContext, !rAquaGraphics.mbNonAntialiasedText ); + + const Point aVclPos = GetDrawPosition( Point(mnBaseAdv,0) ); + CGPoint aTextPos = { (CGFloat) +aVclPos.X(), (CGFloat) -aVclPos.Y() }; + + if( mpTextStyle->mfFontRotation != 0.0 ) + { + const CGFloat fRadians = mpTextStyle->mfFontRotation; + CGContextRotateCTM( rAquaGraphics.mrContext, +fRadians ); + + const CGAffineTransform aInvMatrix = CGAffineTransformMakeRotation( -fRadians ); + aTextPos = CGPointApplyAffineTransform( aTextPos, aInvMatrix ); + } + + CGContextSetTextPosition( rAquaGraphics.mrContext, aTextPos.x, aTextPos.y ); CGRect aMacRect = CTLineGetImageBounds( mpCTLine, rAquaGraphics.mrContext ); - CGPoint aMacPos = CGContextGetTextPosition( rAquaGraphics.mrContext ); - aMacRect.origin.x -= aMacPos.x; - aMacRect.origin.y -= aMacPos.y; - const Point aPos = GetDrawPosition( Point(mnBaseAdv, 0) ); + if( mpTextStyle->mfFontRotation != 0.0 ) + { + const CGFloat fRadians = mpTextStyle->mfFontRotation; + const CGAffineTransform aMatrix = CGAffineTransformMakeRotation( +fRadians ); + aMacRect = CGRectApplyAffineTransform( aMacRect, aMatrix ); + } + + CGContextRestoreGState( rAquaGraphics.mrContext ); + + rVCLRect.Left() = aVclPos.X() + aMacRect.origin.x; + rVCLRect.Right() = aVclPos.X() + (aMacRect.origin.x + aMacRect.size.width); + rVCLRect.Bottom() = aVclPos.Y() - (aMacRect.origin.y); + rVCLRect.Top() = aVclPos.Y() - (aMacRect.origin.y + aMacRect.size.height); - // CoreText top-bottom are vertically flipped from a VCL aspect - rVCLRect.Left() = aPos.X() + aMacRect.origin.x; - rVCLRect.Right() = aPos.X() + (aMacRect.origin.x + aMacRect.size.width); - rVCLRect.Bottom() = aPos.Y() - aMacRect.origin.y; - rVCLRect.Top() = aPos.Y() - (aMacRect.origin.y + aMacRect.size.height); return true; } |