fdo#63616: Fix GetBoundRect for rotated text in CoreText backend
Change-Id: I8c9ee84afd71481c2c6b002265b86e048f369f5c
This commit is contained in:
parent
a662d42710
commit
b9c46f46ce
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user