[Libreoffice-commits] core.git: vcl/quartz
Tor Lillqvist
tml at collabora.com
Wed Dec 11 14:56:07 PST 2013
vcl/quartz/ctlayout.cxx | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
New commits:
commit b200f8d73c7ae1561f410ed7857d0c4f7642d051
Author: Tor Lillqvist <tml at collabora.com>
Date: Thu Dec 12 00:33:38 2013 +0200
Fix the iOS coloured text problem
The eventual text colour is not known yet when LayoutText() is
called. So we need to re-do the layout and justification in DrawText()
in case we have a text colour.
For some reason this is needed only on iOS. On OS X, the original code
manages to display coloured text correctly. But then, on iOS a virtual
device is used, and who knows what other strange things going on. Some
of the scary warnings printed make you a tad unsure everything is
working correcly... (Like "SdrPageView::DrawLayer: Creating temporary
SdrPageWindow (ObjectContact), this should never be needed (!)")
Change-Id: Ide99c163dea0f758a373c8dab9c54681ff57f624
diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx
index 56d8696..b1ce5fb 100644
--- a/vcl/quartz/ctlayout.cxx
+++ b/vcl/quartz/ctlayout.cxx
@@ -64,6 +64,8 @@ private:
// mutable members since these details are all lazy initialized
mutable double mfCachedWidth; // cached value of resulting typographical width
+ mutable float mfAdjustedLineLength;
+
// x-offset relative to layout origin
// currently only used in RTL-layouts
mutable double mfBaseAdv;
@@ -75,6 +77,7 @@ CTLayout::CTLayout( const CoreTextStyle* pTextStyle )
, mpCTLine( NULL )
, mnCharCount( 0 )
, mfCachedWidth( -1 )
+, mfAdjustedLineLength( 0 )
, mfBaseAdv( 0 )
{
}
@@ -159,6 +162,7 @@ void CTLayout::AdjustLayout( ImplLayoutArgs& rArgs )
CFRelease( mpCTLine );
mpCTLine = pNewCTLine;
mfCachedWidth = nPixelWidth;
+ mfAdjustedLineLength = nPixelWidth - fTrailingSpace;
}
// When drawing right aligned text, rounding errors in the position returned by
@@ -221,7 +225,36 @@ void CTLayout::DrawText( SalGraphics& rGraphics ) const
}
CGContextSetTextPosition( rAquaGraphics.mrContext, aTextPos.x, aTextPos.y );
+#ifdef MACOSX
+ // For some reason on OS X the problem with text colour being out of sync
+ // does not seem to occur.
CTLineDraw( mpCTLine, rAquaGraphics.mrContext );
+#else
+ if( CFDictionaryGetValue( mpTextStyle->GetStyleDict(), kCTFontAttributeName) )
+ {
+ // We did likely not know the correct intended colour of the
+ // text in LayoutText(), so have to redo layout and justify.
+ CFStringRef aCFText = CFAttributedStringGetString( mpAttrString );
+ CFAttributedStringRef pAttrString = CFAttributedStringCreate( NULL, aCFText, mpTextStyle->GetStyleDict() );
+ CTLineRef pCTLine = CTLineCreateWithAttributedString( pAttrString );
+ CFRelease( pAttrString );
+ if( mfAdjustedLineLength > 0 )
+ {
+ CTLineRef pNewCTLine = CTLineCreateJustifiedLine( pCTLine, 1.0, mfAdjustedLineLength );
+ CFRelease( pCTLine );
+ pCTLine = pNewCTLine;
+ }
+ CTLineDraw( pCTLine, rAquaGraphics.mrContext );
+ CFRelease( pCTLine );
+ }
+ else
+ {
+ // FIXME: can the colour be wrong also the other way around:
+ // some leftover wrong colour was used in LayoutText(), but
+ // then here the style does not actually contain any colour?
+ CTLineDraw( mpCTLine, rAquaGraphics.mrContext );
+ }
+#endif
#ifndef IOS
// request an update of the changed window area
if( rAquaGraphics.IsWindowGraphics() )
More information about the Libreoffice-commits
mailing list