summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-06-19 15:12:30 +0300
committerTor Lillqvist <tml@iki.fi>2013-06-19 15:15:00 +0300
commitb9c46f46cebc0ebed5a91f8fbb9d0a01366f1f77 (patch)
treeb6dd1ad35ad8c3e93334237d35b49c33d872c1a5
parenta662d427108d781122f979392ce544017d14fc17 (diff)
fdo#63616: Fix GetBoundRect for rotated text in CoreText backend
Change-Id: I8c9ee84afd71481c2c6b002265b86e048f369f5c
-rw-r--r--vcl/coretext/ctlayout.cxx39
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;
}