Modified: openoffice/trunk/main/vcl/aqua/source/gdi/salgdi.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/aqua/source/gdi/salgdi.cxx?rev=1560749&r1=1560748&r2=1560749&view=diff ============================================================================== --- openoffice/trunk/main/vcl/aqua/source/gdi/salgdi.cxx (original) +++ openoffice/trunk/main/vcl/aqua/source/gdi/salgdi.cxx Thu Jan 23 17:00:44 2014 @@ -19,8 +19,6 @@ * *************************************************************/ - - // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" @@ -46,25 +44,43 @@ #include "aqua/salbmp.h" #include "aqua/salframe.h" #include "aqua/salcolorutils.hxx" +#ifdef USE_ATSU #include "atsfonts.hxx" +#else // !USE_ATSU +#include "ctfonts.hxx" +#endif #include "fontsubset.hxx" #include "impfont.hxx" #include "sallayout.hxx" #include "sft.hxx" - using namespace vcl; -//typedef unsigned char Boolean; // copied from MacTypes.h, should be properly included -typedef std::vector<unsigned char> ByteVector; +// ======================================================================= +SystemFontList::~SystemFontList( void ) +{} // ======================================================================= -ImplMacFontData::ImplMacFontData( const ImplDevFontAttributes& rDFA, ATSUFontID nFontId ) -: ImplFontData( rDFA, 0 ) -, mnFontId( nFontId ) +ImplMacTextStyle::ImplMacTextStyle( const ImplFontSelectData& rReqFont ) +: mpFontData( (ImplMacFontData*)rReqFont.mpFontData ) +, mfFontScale( 1.0 ) +, mfFontStretch( 1.0 ) +, mfFontRotation( 0.0 ) +{} + +// ----------------------------------------------------------------------- + +ImplMacTextStyle::~ImplMacTextStyle( void ) +{} + +// ======================================================================= + +ImplMacFontData::ImplMacFontData( const ImplDevFontAttributes& rDFA, sal_IntPtr nFontId ) +: ImplFontData( rDFA, 0 ) +, mnFontId( nFontId ) , mpCharMap( NULL ) , mbOs2Read( false ) , mbHasOs2Table( false ) @@ -74,43 +90,43 @@ ImplMacFontData::ImplMacFontData( const // ----------------------------------------------------------------------- -ImplMacFontData::~ImplMacFontData() +ImplMacFontData::ImplMacFontData( const ImplMacFontData& rSrc ) +: ImplFontData( rSrc) +, mnFontId( rSrc.mnFontId) +, mpCharMap( rSrc.mpCharMap) +, mbOs2Read( rSrc.mbOs2Read) +, mbHasOs2Table( rSrc.mbHasOs2Table) +, mbCmapEncodingRead( rSrc.mbCmapEncodingRead) +, mbHasCJKSupport( rSrc.mbHasCJKSupport) { if( mpCharMap ) - mpCharMap->DeReference(); + mpCharMap->AddReference(); } // ----------------------------------------------------------------------- -sal_IntPtr ImplMacFontData::GetFontId() const +ImplMacFontData::~ImplMacFontData() { - return (sal_IntPtr)mnFontId; + if( mpCharMap ) + mpCharMap->DeReference(); } // ----------------------------------------------------------------------- -ImplFontData* ImplMacFontData::Clone() const +sal_IntPtr ImplMacFontData::GetFontId() const { - ImplMacFontData* pClone = new ImplMacFontData(*this); - if( mpCharMap ) - mpCharMap->AddReference(); - return pClone; + return reinterpret_cast<sal_IntPtr>( mnFontId); } // ----------------------------------------------------------------------- ImplFontEntry* ImplMacFontData::CreateFontInstance(ImplFontSelectData& rFSD) const { - return new ImplFontEntry(rFSD); + return new ImplFontEntry(rFSD); } // ----------------------------------------------------------------------- -inline FourCharCode GetTag(const char aTagName[5]) -{ - return (aTagName[0]<<24)+(aTagName[1]<<16)+(aTagName[2]<<8)+(aTagName[3]); -} - static unsigned GetUShort( const unsigned char* p ){return((p[0]<<8)+p[1]);} static unsigned GetUInt( const unsigned char* p ) { return((p[0]<<24)+(p[1]<<16)+(p[2]<<8)+p[3]);} @@ -125,27 +141,23 @@ const ImplFontCharMap* ImplMacFontData:: mpCharMap->AddReference(); // get the CMAP byte size - ATSFontRef rFont = FMGetATSFontRefFromFont( mnFontId ); - ByteCount nBufSize = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, 0, NULL, &nBufSize ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::GetImplFontCharMap : ATSFontGetTable1 failed!\n"); - if( eStatus != noErr ) - return mpCharMap; - // allocate a buffer for the CMAP raw data - ByteVector aBuffer( nBufSize ); + const int nBufSize = GetFontTable( "cmap", NULL ); + DBG_ASSERT( (nBufSize > 0), "ImplMacFontData::GetImplFontCharMap : FontGetTable1 failed!\n"); + if( nBufSize <= 0 ) + return mpCharMap; // get the CMAP raw data - ByteCount nRawLength = 0; - eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::GetImplFontCharMap : ATSFontGetTable2 failed!\n"); - if( eStatus != noErr ) + ByteVector aBuffer( nBufSize ); + const int nRawSize = GetFontTable( "cmap", &aBuffer[0] ); + DBG_ASSERT( (nRawSize > 0), "ImplMacFontData::GetImplFontCharMap : ATSFontGetTable2 failed!\n"); + if( nRawSize <= 0 ) return mpCharMap; - DBG_ASSERT( (nBufSize==nRawLength), "ImplMacFontData::GetImplFontCharMap : ByteCount mismatch!\n"); + DBG_ASSERT( (nBufSize==nRawSize), "ImplMacFontData::GetImplFontCharMap : ByteCount mismatch!\n"); // parse the CMAP CmapResult aCmapResult; - if( ParseCMAP( &aBuffer[0], nRawLength, aCmapResult ) ) + if( ParseCMAP( &aBuffer[0], nRawSize, aCmapResult ) ) { // create the matching charmap mpCharMap->DeReference(); @@ -164,25 +176,21 @@ void ImplMacFontData::ReadOs2Table( void if( mbOs2Read ) return; mbOs2Read = true; + mbHasOs2Table = false; // prepare to get the OS/2 table raw data - ATSFontRef rFont = FMGetATSFontRefFromFont( mnFontId ); - ByteCount nBufSize = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("OS/2"), 0, 0, NULL, &nBufSize ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::ReadOs2Table : ATSFontGetTable1 failed!\n"); - if( eStatus != noErr ) + const int nBufSize = GetFontTable( "OS/2", NULL ); + DBG_ASSERT( (nBufSize > 0), "ImplMacFontData::ReadOs2Table : FontGetTable1 failed!\n"); + if( nBufSize <= 0 ) return; - // allocate a buffer for the OS/2 raw data - ByteVector aBuffer( nBufSize ); - // get the OS/2 raw data - ByteCount nRawLength = 0; - eStatus = ATSFontGetTable( rFont, GetTag("OS/2"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::ReadOs2Table : ATSFontGetTable2 failed!\n"); - if( eStatus != noErr ) + ByteVector aBuffer( nBufSize ); + const int nRawSize = GetFontTable( "cmap", &aBuffer[0] ); + DBG_ASSERT( (nRawSize > 0), "ImplMacFontData::ReadOs2Table : ATSFontGetTable2 failed!\n"); + if( nRawSize <= 0 ) return; - DBG_ASSERT( (nBufSize==nRawLength), "ImplMacFontData::ReadOs2Table : ByteCount mismatch!\n"); + DBG_ASSERT( (nBufSize == nRawSize), "ImplMacFontData::ReadOs2Table : ByteCount mismatch!\n"); mbHasOs2Table = true; // parse the OS/2 raw data @@ -190,63 +198,53 @@ void ImplMacFontData::ReadOs2Table( void // check if the fonts needs the "CJK extra leading" heuristic const unsigned char* pOS2map = &aBuffer[0]; - const sal_uInt32 nVersion = GetUShort( pOS2map ); - if( nVersion >= 0x0001 ) - { - sal_uInt32 ulUnicodeRange2 = GetUInt( pOS2map + 46 ); - if( ulUnicodeRange2 & 0x2DF00000 ) - mbHasCJKSupport = true; - } + const sal_uInt32 nVersion = GetUShort( pOS2map ); + if( nVersion >= 0x0001 ) + { + const sal_uInt32 ulUnicodeRange2 = GetUInt( pOS2map + 46 ); + if( ulUnicodeRange2 & 0x2DF00000 ) + mbHasCJKSupport = true; + } } void ImplMacFontData::ReadMacCmapEncoding( void ) const { - // read this only once per font - if( mbCmapEncodingRead ) - return; - mbCmapEncodingRead = true; - - ATSFontRef rFont = FMGetATSFontRefFromFont( mnFontId ); - ByteCount nBufSize = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, 0, NULL, &nBufSize ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::ReadMacCmapEncoding : ATSFontGetTable1 failed!\n"); - if( eStatus != noErr ) - return; - - ByteVector aBuffer( nBufSize ); - - ByteCount nRawLength = 0; - eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); - DBG_ASSERT( (eStatus==noErr), "ImplMacFontData::ReadMacCmapEncoding : ATSFontGetTable2 failed!\n"); - if( eStatus != noErr ) - return; - DBG_ASSERT( (nBufSize==nRawLength), "ImplMacFontData::ReadMacCmapEncoding : ByteCount mismatch!\n"); + // read this only once per font + if( mbCmapEncodingRead ) + return; + mbCmapEncodingRead = true; - const unsigned char* pCmap = &aBuffer[0]; + const int nBufSize = GetFontTable( "cmap", NULL ); + if( nBufSize <= 0 ) + return; - if (nRawLength < 24 ) - return; - if( GetUShort( pCmap ) != 0x0000 ) - return; + // get the CMAP raw data + ByteVector aBuffer( nBufSize ); + const int nRawSize = GetFontTable( "cmap", &aBuffer[0] ); + if( nRawSize < 24 ) + return; - // check if the fonts needs the "CJK extra leading" heuristic - int nSubTables = GetUShort( pCmap + 2 ); + const unsigned char* pCmap = &aBuffer[0]; + if( GetUShort( pCmap ) != 0x0000 ) + return; - for( const unsigned char* p = pCmap + 4; --nSubTables >= 0; p += 8 ) - { - int nPlatform = GetUShort( p ); - if( nPlatform == kFontMacintoshPlatform ) { - int nEncoding = GetUShort (p + 2 ); - if( nEncoding == kFontJapaneseScript || - nEncoding == kFontTraditionalChineseScript || - nEncoding == kFontKoreanScript || - nEncoding == kFontSimpleChineseScript ) - { - mbHasCJKSupport = true; - break; - } - } - } + // check if the fonts needs the "CJK extra leading" heuristic + int nSubTables = GetUShort( pCmap + 2 ); + for( const unsigned char* p = pCmap + 4; --nSubTables >= 0; p += 8 ) + { + int nPlatform = GetUShort( p ); + if( nPlatform == kFontMacintoshPlatform ) { + const int nEncoding = GetUShort (p + 2 ); + if( nEncoding == kFontJapaneseScript || + nEncoding == kFontTraditionalChineseScript || + nEncoding == kFontKoreanScript || + nEncoding == kFontSimpleChineseScript ) + { + mbHasCJKSupport = true; + break; + } + } + } } // ----------------------------------------------------------------------- @@ -254,8 +252,8 @@ void ImplMacFontData::ReadMacCmapEncodin bool ImplMacFontData::HasCJKSupport( void ) const { ReadOs2Table(); - if( !mbHasOs2Table ) - ReadMacCmapEncoding(); + if( !mbHasOs2Table ) + ReadMacCmapEncoding(); return mbHasCJKSupport; } @@ -277,59 +275,51 @@ AquaSalGraphics::AquaSalGraphics() , mxClipPath( NULL ) , maLineColor( COL_WHITE ) , maFillColor( COL_BLACK ) - , mpMacFontData( NULL ) - , mnATSUIRotation( 0 ) - , mfFontScale( 1.0 ) - , mfFontStretch( 1.0 ) + , mpMacFontData( NULL ) + , mpMacTextStyle( NULL ) + , maTextColor( COL_BLACK ) , mbNonAntialiasedText( false ) , mbPrinter( false ) , mbVirDev( false ) , mbWindow( false ) -{ - // create the style object for font attributes - ATSUCreateStyle( &maATSUStyle ); -} +{} // ----------------------------------------------------------------------- AquaSalGraphics::~AquaSalGraphics() { -/* - if( mnUpdateGraphicsEvent ) - { - Application::RemoveUserEvent( mnUpdateGraphicsEvent ); - } -*/ - CGPathRelease( mxClipPath ); - ATSUDisposeStyle( maATSUStyle ); + CGPathRelease( mxClipPath ); + + delete mpMacTextStyle; if( mpXorEmulation ) delete mpXorEmulation; if( mxLayer ) - CGLayerRelease( mxLayer ); + CGLayerRelease( mxLayer ); else if( mrContext && mbWindow ) { // destroy backbuffer bitmap context that we created ourself CGContextRelease( mrContext ); mrContext = NULL; - // memory is freed automatically by maOwnContextMemory + // memory is freed automatically by maOwnContextMemory } } bool AquaSalGraphics::supportsOperation( OutDevSupportType eType ) const { - bool bRet = false; - switch( eType ) - { - case OutDevSupport_TransparentRect: - case OutDevSupport_B2DClip: - case OutDevSupport_B2DDraw: - bRet = true; - break; - default: break; - } - return bRet; + bool bRet = false; + switch( eType ) + { + case OutDevSupport_TransparentRect: + case OutDevSupport_B2DClip: + case OutDevSupport_B2DDraw: + bRet = true; + break; + default: + break; + } + return bRet; } // ======================================================================= @@ -1599,73 +1589,23 @@ bool AquaSalGraphics::drawAlphaRect( lon // restore state CGContextRestoreGState(mrContext); RefreshRect( aRect ); - return true; + return true; } // ----------------------------------------------------------------------- void AquaSalGraphics::SetTextColor( SalColor nSalColor ) { - RGBColor color; - color.red = (unsigned short) ( SALCOLOR_RED(nSalColor) * 65535.0 / 255.0 ); - color.green = (unsigned short) ( SALCOLOR_GREEN(nSalColor) * 65535.0 / 255.0 ); - color.blue = (unsigned short) ( SALCOLOR_BLUE(nSalColor) * 65535.0 / 255.0 ); - - ATSUAttributeTag aTag = kATSUColorTag; - ByteCount aValueSize = sizeof( color ); - ATSUAttributeValuePtr aValue = &color; - - OSStatus err = ATSUSetAttributes( maATSUStyle, 1, &aTag, &aValueSize, &aValue ); - DBG_ASSERT( (err==noErr), "AquaSalGraphics::SetTextColor() : Could not set font attributes!\n"); - if( err != noErr ) - return; + maTextColor = RGBAColor( nSalColor ); + if( mpMacTextStyle) + mpMacTextStyle->SetTextColor( maTextColor ); } // ----------------------------------------------------------------------- -void AquaSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLevel ) +void AquaSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int /*nFallbackLevel*/ ) { - (void)nFallbackLevel; // glyph-fallback on ATSU is done differently -> no fallback level - - // get the ATSU font metrics (in point units) - // of the font that has eventually been size-limited - - ATSUFontID fontId; - OSStatus err = ATSUGetAttribute( maATSUStyle, kATSUFontTag, sizeof(ATSUFontID), &fontId, 0 ); - DBG_ASSERT( (err==noErr), "AquaSalGraphics::GetFontMetric() : could not get font id\n"); - - ATSFontMetrics aMetrics; - ATSFontRef rFont = FMGetATSFontRefFromFont( fontId ); - err = ATSFontGetHorizontalMetrics ( rFont, kATSOptionFlagsDefault, &aMetrics ); - DBG_ASSERT( (err==noErr), "AquaSalGraphics::GetFontMetric() : could not get font metrics\n"); - if( err != noErr ) - return; - - // all ATS fonts are scalable fonts - pMetric->mbScalableFont = true; - // TODO: check if any kerning is possible - pMetric->mbKernableFont = true; - - // convert into VCL font metrics (in unscaled pixel units) - - Fixed ptSize; - err = ATSUGetAttribute( maATSUStyle, kATSUSizeTag, sizeof(Fixed), &ptSize, 0); - DBG_ASSERT( (err==noErr), "AquaSalGraphics::GetFontMetric() : could not get font size\n"); - const double fPointSize = Fix2X( ptSize ); - - // convert quartz units to pixel units - // please see the comment in AquaSalGraphics::SetFont() for details - const double fPixelSize = (mfFontScale * mfFakeDPIScale * fPointSize); - pMetric->mnAscent = static_cast<long>(+aMetrics.ascent * fPixelSize + 0.5); - pMetric->mnDescent = static_cast<long>(-aMetrics.descent * fPixelSize + 0.5); - const long nExtDescent = static_cast<long>((-aMetrics.descent + aMetrics.leading) * fPixelSize + 0.5); - pMetric->mnExtLeading = nExtDescent - pMetric->mnDescent; - pMetric->mnIntLeading = 0; - // ATSFontMetrics.avgAdvanceWidth is obsolete, so it is usually set to zero - // since ImplFontMetricData::mnWidth is only used for stretching/squeezing fonts - // setting this width to the pixel height of the fontsize is good enough - // it also makes the calculation of the stretch factor simple - pMetric->mnWidth = static_cast<long>(mfFontStretch * fPixelSize + 0.5); + mpMacTextStyle->GetFontMetric( mfFakeDPIScale, *pMetric ); } // ----------------------------------------------------------------------- @@ -1748,19 +1688,26 @@ void AquaSalGraphics::GetDevFontList( Im { DBG_ASSERT( pFontList, "AquaSalGraphics::GetDevFontList(NULL) !"); - AddLocalTempFontDirs(); + AddLocalTempFontDirs(); // The idea is to cache the list of system fonts once it has been generated. // SalData seems to be a good place for this caching. However we have to // carefully make the access to the font list thread-safe. If we register // a font-change event handler to update the font list in case fonts have // changed on the system we have to lock access to the list. The right - // way to do that is the solar mutex since GetDevFontList is protected - // through it as should be all event handlers + // way to do that is the solar mutex since GetDevFontList is protected + // through it as should be all event handlers SalData* pSalData = GetSalData(); - if (pSalData->mpFontList == NULL) - pSalData->mpFontList = new SystemFontList(); +#ifdef USE_ATSU + SystemFontList* GetAtsFontList(void); // forward declaration + if( !pSalData->mpFontList ) + pSalData->mpFontList = GetAtsFontList(); +#else + SystemFontList* GetCoretextFontList(void); // forward declaration + if( !pSalData->mpFontList ) + pSalData->mpFontList = GetCoretextFontList(); +#endif // DISABLE_ATSUI // Copy all ImplFontData objects contained in the SystemFontList pSalData->mpFontList->AnnounceFonts( *pFontList ); @@ -1810,71 +1757,6 @@ bool AquaSalGraphics::AddTempDevFont( Im // ----------------------------------------------------------------------- -// callbacks from ATSUGlyphGetCubicPaths() fore GetGlyphOutline() -struct GgoData { basegfx::B2DPolygon maPolygon; basegfx::B2DPolyPolygon* mpPolyPoly; }; - -static OSStatus GgoLineToProc( const Float32Point* pPoint, void* pData ) -{ - basegfx::B2DPolygon& rPolygon = static_cast<GgoData*>(pData)->maPolygon; - const basegfx::B2DPoint aB2DPoint( pPoint->x, pPoint->y ); - rPolygon.append( aB2DPoint ); - return noErr; -} - -static OSStatus GgoCurveToProc( const Float32Point* pCP1, const Float32Point* pCP2, - const Float32Point* pPoint, void* pData ) -{ - basegfx::B2DPolygon& rPolygon = static_cast<GgoData*>(pData)->maPolygon; - const sal_uInt32 nPointCount = rPolygon.count(); - const basegfx::B2DPoint aB2DControlPoint1( pCP1->x, pCP1->y ); - rPolygon.setNextControlPoint( nPointCount-1, aB2DControlPoint1 ); - const basegfx::B2DPoint aB2DEndPoint( pPoint->x, pPoint->y ); - rPolygon.append( aB2DEndPoint ); - const basegfx::B2DPoint aB2DControlPoint2( pCP2->x, pCP2->y ); - rPolygon.setPrevControlPoint( nPointCount, aB2DControlPoint2 ); - return noErr; -} - -static OSStatus GgoClosePathProc( void* pData ) -{ - GgoData* pGgoData = static_cast<GgoData*>(pData); - basegfx::B2DPolygon& rPolygon = pGgoData->maPolygon; - if( rPolygon.count() > 0 ) - pGgoData->mpPolyPoly->append( rPolygon ); - rPolygon.clear(); - return noErr; -} - -static OSStatus GgoMoveToProc( const Float32Point* pPoint, void* pData ) -{ - GgoClosePathProc( pData ); - OSStatus eStatus = GgoLineToProc( pPoint, pData ); - return eStatus; -} - -bool AquaSalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& rPolyPoly ) -{ - GgoData aGgoData; - aGgoData.mpPolyPoly = &rPolyPoly; - rPolyPoly.clear(); - - ATSUStyle rATSUStyle = maATSUStyle; // TODO: handle glyph fallback when CWS pdffix02 is integrated - OSStatus eGgoStatus = noErr; - OSStatus eStatus = ATSUGlyphGetCubicPaths( rATSUStyle, aGlyphId, - GgoMoveToProc, GgoLineToProc, GgoCurveToProc, GgoClosePathProc, - &aGgoData, &eGgoStatus ); - if( (eStatus != noErr) ) // TODO: why is (eGgoStatus!=noErr) when curves are involved? - return false; - - GgoClosePathProc( &aGgoData ); - if( mfFontScale != 1.0 ) { - rPolyPoly.transform(basegfx::tools::createScaleB2DHomMatrix(+mfFontScale, +mfFontScale)); - } - return true; -} - -// ----------------------------------------------------------------------- - long AquaSalGraphics::GetGraphicsWidth() const { long w = 0; @@ -1896,20 +1778,16 @@ long AquaSalGraphics::GetGraphicsWidth() bool AquaSalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect ) { - ATSUStyle rATSUStyle = maATSUStyle; // TODO: handle glyph fallback - ATSGlyphScreenMetrics aGlyphMetrics; - GlyphID nAtsGlyphId = aGlyphId; - OSStatus eStatus = ATSUGlyphGetScreenMetrics( rATSUStyle, - 1, &nAtsGlyphId, 0, FALSE, !mbNonAntialiasedText, &aGlyphMetrics ); - if( eStatus != noErr ) - return false; + const bool bRC = mpMacTextStyle->GetGlyphBoundRect( aGlyphId, rRect ); + return bRC; +} - const long nMinX = (long)(+aGlyphMetrics.topLeft.x * mfFontScale - 0.5); - const long nMaxX = (long)(aGlyphMetrics.width * mfFontScale + 0.5) + nMinX; - const long nMinY = (long)(-aGlyphMetrics.topLeft.y * mfFontScale - 0.5); - const long nMaxY = (long)(aGlyphMetrics.height * mfFontScale + 0.5) + nMinY; - rRect = Rectangle( nMinX, nMinY, nMaxX, nMaxY ); - return true; +// ----------------------------------------------------------------------- + +bool AquaSalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolygon& rPolyPoly ) +{ + const bool bRC = mpMacTextStyle->GetGlyphOutline( aGlyphId, rPolyPoly ); + return bRC; } // ----------------------------------------------------------------------- @@ -1922,138 +1800,40 @@ void AquaSalGraphics::GetDevFontSubstLis // ----------------------------------------------------------------------- void AquaSalGraphics::DrawServerFontLayout( const ServerFontLayout& ) -{ -} +{} // ----------------------------------------------------------------------- sal_uInt16 AquaSalGraphics::SetFont( ImplFontSelectData* pReqFont, int /*nFallbackLevel*/ ) { - if( !pReqFont ) - { - ATSUClearStyle( maATSUStyle ); - mpMacFontData = NULL; - return 0; - } + // release the text style + delete mpMacTextStyle; + mpMacTextStyle = NULL; - // store the requested device font entry - const ImplMacFontData* pMacFont = static_cast<const ImplMacFontData*>( pReqFont->mpFontData ); - mpMacFontData = pMacFont; - - // convert pixel units (as seen by upper layers) to typographic point units - double fScaledAtsHeight = pReqFont->mfExactHeight; - // avoid Fixed16.16 overflows by limiting the ATS font size - static const float fMaxAtsHeight = 144.0; - if( fScaledAtsHeight <= fMaxAtsHeight ) - mfFontScale = 1.0; - else - { - mfFontScale = fScaledAtsHeight / fMaxAtsHeight; - fScaledAtsHeight = fMaxAtsHeight; - } - Fixed fFixedSize = FloatToFixed( fScaledAtsHeight ); - // enable bold-emulation if needed - Boolean bFakeBold = FALSE; - if( (pReqFont->GetWeight() >= WEIGHT_BOLD) - && (pMacFont->GetWeight() < WEIGHT_SEMIBOLD) ) - bFakeBold = TRUE; - // enable italic-emulation if needed - Boolean bFakeItalic = FALSE; - if( ((pReqFont->GetSlant() == ITALIC_NORMAL) || (pReqFont->GetSlant() == ITALIC_OBLIQUE)) - && !((pMacFont->GetSlant() == ITALIC_NORMAL) || (pMacFont->GetSlant() == ITALIC_OBLIQUE)) ) - bFakeItalic = TRUE; - - // enable/disable antialiased text - mbNonAntialiasedText = pReqFont->mbNonAntialiased; - UInt32 nStyleRenderingOptions = kATSStyleNoOptions; - if( pReqFont->mbNonAntialiased ) - nStyleRenderingOptions |= kATSStyleNoAntiAliasing; - - // set horizontal/vertical mode - ATSUVerticalCharacterType aVerticalCharacterType = kATSUStronglyHorizontal; - if( pReqFont->mbVertical ) - aVerticalCharacterType = kATSUStronglyVertical; - - // prepare ATS-fontid as type matching to the kATSUFontTag request - ATSUFontID nFontID = static_cast<ATSUFontID>(pMacFont->GetFontId()); - - // update ATSU style attributes with requested font parameters - // TODO: no need to set styles which are already defaulted - - const ATSUAttributeTag aTag[] = - { - kATSUFontTag, - kATSUSizeTag, - kATSUQDBoldfaceTag, - kATSUQDItalicTag, - kATSUStyleRenderingOptionsTag, - kATSUVerticalCharacterTag - }; - - const ByteCount aValueSize[] = - { - sizeof(ATSUFontID), - sizeof(fFixedSize), - sizeof(bFakeBold), - sizeof(bFakeItalic), - sizeof(nStyleRenderingOptions), - sizeof(aVerticalCharacterType) - }; - - const ATSUAttributeValuePtr aValue[] = - { - &nFontID, - &fFixedSize, - &bFakeBold, - &bFakeItalic, - &nStyleRenderingOptions, - &aVerticalCharacterType - }; - - static const int nTagCount = sizeof(aTag) / sizeof(*aTag); - OSStatus eStatus = ATSUSetAttributes( maATSUStyle, nTagCount, - aTag, aValueSize, aValue ); - // reset ATSUstyle if there was an error - if( eStatus != noErr ) - { - DBG_WARNING( "AquaSalGraphics::SetFont() : Could not set font attributes!\n"); - ATSUClearStyle( maATSUStyle ); - mpMacFontData = NULL; - return 0; - } + // handle NULL request meaning: release-font-resources request + if( !pReqFont ) + { + mpMacFontData = NULL; + return 0; + } - // prepare font stretching - const ATSUAttributeTag aMatrixTag = kATSUFontMatrixTag; - if( (pReqFont->mnWidth == 0) || (pReqFont->mnWidth == pReqFont->mnHeight) ) - { - mfFontStretch = 1.0; - ATSUClearAttributes( maATSUStyle, 1, &aMatrixTag ); - } - else - { - mfFontStretch = (float)pReqFont->mnWidth / pReqFont->mnHeight; - CGAffineTransform aMatrix = CGAffineTransformMakeScale( mfFontStretch, 1.0F ); - const ATSUAttributeValuePtr aAttr = &aMatrix; - const ByteCount aMatrixBytes = sizeof(aMatrix); - eStatus = ATSUSetAttributes( maATSUStyle, 1, &aMatrixTag, &aMatrixBytes, &aAttr ); - DBG_ASSERT( (eStatus==noErr), "AquaSalGraphics::SetFont() : Could not set font matrix\n"); - } - - // prepare font rotation - mnATSUIRotation = FloatToFixed( pReqFont->mnOrientation / 10.0 ); - -#if OSL_DEBUG_LEVEL > 3 - fprintf( stderr, "SetFont to (\"%s\", \"%s\", fontid=%d) for (\"%s\" \"%s\" weight=%d, slant=%d size=%dx%d orientation=%d)\n", - ::rtl::OUStringToOString( pMacFont->GetFamilyName(), RTL_TEXTENCODING_UTF8 ).getStr(), - ::rtl::OUStringToOString( pMacFont->GetStyleName(), RTL_TEXTENCODING_UTF8 ).getStr(), - (int)nFontID, - ::rtl::OUStringToOString( pReqFont->GetFamilyName(), RTL_TEXTENCODING_UTF8 ).getStr(), - ::rtl::OUStringToOString( pReqFont->GetStyleName(), RTL_TEXTENCODING_UTF8 ).getStr(), - pReqFont->GetWeight(), - pReqFont->GetSlant(), - pReqFont->mnHeight, - pReqFont->mnWidth, - pReqFont->mnOrientation); + // update the text style + mpMacFontData = static_cast<const ImplMacFontData*>( pReqFont->mpFontData ); + mpMacTextStyle = mpMacFontData->CreateMacTextStyle( *pReqFont ); + mpMacTextStyle->SetTextColor( maTextColor ); + +#if (OSL_DEBUG_LEVEL > 3) + fprintf( stderr, "SetFont to (\"%s\", \"%s\", fontid=%d) for (\"%s\" \"%s\" weight=%d, slant=%d size=%dx%d orientation=%d)\n", + ::rtl::OUStringToOString( mpMacFontData->GetFamilyName(), RTL_TEXTENCODING_UTF8 ).getStr(), + ::rtl::OUStringToOString( mpMacFontData->GetStyleName(), RTL_TEXTENCODING_UTF8 ).getStr(), + (int)pMacFont->GetFontId(), + ::rtl::OUStringToOString( mpMacFontData->GetFamilyName(), RTL_TEXTENCODING_UTF8 ).getStr(), + ::rtl::OUStringToOString( mpMacFontData->GetStyleName(), RTL_TEXTENCODING_UTF8 ).getStr(), + pReqFont->GetWeight(), + pReqFont->GetSlant(), + pReqFont->mnHeight, + pReqFont->mnWidth, + pReqFont->mnOrientation); #endif return 0; @@ -2061,6 +1841,14 @@ sal_uInt16 AquaSalGraphics::SetFont( Imp // ----------------------------------------------------------------------- +SalLayout* AquaSalGraphics::GetTextLayout( ImplLayoutArgs& /*rArgs*/, int /*nFallbackLevel*/ ) +{ + SalLayout* pSalLayout = mpMacTextStyle->GetTextLayout(); + return pSalLayout; +} + +// ----------------------------------------------------------------------- + const ImplFontCharMap* AquaSalGraphics::GetImplFontCharMap() const { if( !mpMacFontData ) @@ -2073,17 +1861,17 @@ const ImplFontCharMap* AquaSalGraphics:: // fake a SFNT font directory entry for a font table // see http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html#Directory -static void FakeDirEntry( FourCharCode eFCC, ByteCount nOfs, ByteCount nLen, +static void FakeDirEntry( const char aTag[5], ByteCount nOfs, ByteCount nLen, const unsigned char* /*pData*/, unsigned char*& rpDest ) { // write entry tag - rpDest[ 0] = (char)(eFCC >> 24); - rpDest[ 1] = (char)(eFCC >> 16); - rpDest[ 2] = (char)(eFCC >> 8); - rpDest[ 3] = (char)(eFCC >> 0); + rpDest[ 0] = aTag[0]; + rpDest[ 1] = aTag[1]; + rpDest[ 2] = aTag[2]; + rpDest[ 3] = aTag[3]; // TODO: get entry checksum and write it - // not too important since the subsetter doesn't care currently - // for( pData+nOfs ... pData+nOfs+nLen ) + // not too important since the subsetter doesn't care currently + // for( pData+nOfs ... pData+nOfs+nLen ) // write entry offset rpDest[ 8] = (char)(nOfs >> 24); rpDest[ 9] = (char)(nOfs >> 16); @@ -2098,88 +1886,82 @@ static void FakeDirEntry( FourCharCode e rpDest += 16; } +// fake a TTF or CFF font as directly accessing font file is not possible +// when only the fontid is known. This approach also handles *.dfont fonts. static bool GetRawFontData( const ImplFontData* pFontData, ByteVector& rBuffer, bool* pJustCFF ) { const ImplMacFontData* pMacFont = static_cast<const ImplMacFontData*>(pFontData); - const ATSUFontID nFontId = static_cast<ATSUFontID>(pMacFont->GetFontId()); - ATSFontRef rFont = FMGetATSFontRefFromFont( nFontId ); - ByteCount nCffLen = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, 0, NULL, &nCffLen); + // short circuit for CFF-only fonts + const int nCffSize = pMacFont->GetFontTable( "CFF ", NULL); if( pJustCFF != NULL ) { - *pJustCFF = (eStatus == noErr) && (nCffLen > 0); - if( *pJustCFF ) + *pJustCFF = (nCffSize > 0); + if( *pJustCFF) { - rBuffer.resize( nCffLen ); - eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, nCffLen, (void*)&rBuffer[0], &nCffLen); - if( (eStatus != noErr) || (nCffLen <= 0) ) + rBuffer.resize( nCffSize); + const int nCffRead = pMacFont->GetFontTable( "CFF ", &rBuffer[0]); + if( nCffRead != nCffSize) return false; return true; } } // get font table availability and size in bytes - ByteCount nHeadLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("head"), 0, 0, NULL, &nHeadLen); - if( (eStatus != noErr) || (nHeadLen <= 0) ) - return false; - ByteCount nMaxpLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("maxp"), 0, 0, NULL, &nMaxpLen); - if( (eStatus != noErr) || (nMaxpLen <= 0) ) - return false; - ByteCount nCmapLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, 0, NULL, &nCmapLen); - if( (eStatus != noErr) || (nCmapLen <= 0) ) - return false; - ByteCount nNameLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("name"), 0, 0, NULL, &nNameLen); - if( (eStatus != noErr) || (nNameLen <= 0) ) - return false; - ByteCount nHheaLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("hhea"), 0, 0, NULL, &nHheaLen); - if( (eStatus != noErr) || (nHheaLen <= 0) ) - return false; - ByteCount nHmtxLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("hmtx"), 0, 0, NULL, &nHmtxLen); - if( (eStatus != noErr) || (nHmtxLen <= 0) ) - return false; - - // get the glyph outline tables - ByteCount nLocaLen = 0; - ByteCount nGlyfLen = 0; - if( (eStatus != noErr) || (nCffLen <= 0) ) + const int nHeadSize = pMacFont->GetFontTable( "head", NULL); + if( nHeadSize <= 0) + return false; + const int nMaxpSize = pMacFont->GetFontTable( "maxp", NULL); + if( nMaxpSize <= 0) + return false; + const int nCmapSize = pMacFont->GetFontTable( "cmap", NULL); + if( nCmapSize <= 0) + return false; + const int nNameSize = pMacFont->GetFontTable( "name", NULL); + if( nNameSize <= 0) + return false; + const int nHheaSize = pMacFont->GetFontTable( "hhea", NULL); + if( nHheaSize <= 0) + return false; + const int nHmtxSize = pMacFont->GetFontTable( "hmtx", NULL); + if( nHmtxSize <= 0) + return false; + + // get the ttf-glyf outline tables + int nLocaSize = 0; + int nGlyfSize = 0; + if( nCffSize <= 0) { - eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, 0, NULL, &nLocaLen); - if( (eStatus != noErr) || (nLocaLen <= 0) ) + nLocaSize = pMacFont->GetFontTable( "loca", NULL); + if( nLocaSize <= 0) return false; - eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, 0, NULL, &nGlyfLen); - if( (eStatus != noErr) || (nGlyfLen <= 0) ) + nGlyfSize = pMacFont->GetFontTable( "glyf", NULL); + if( nGlyfSize <= 0) return false; } - ByteCount nPrepLen=0, nCvtLen=0, nFpgmLen=0; - if( nGlyfLen ) // TODO: reduce PDF size by making hint subsetting optional + int nPrepSize = 0, nCvtSize = 0, nFpgmSize = 0; + if( nGlyfSize) // TODO: reduce PDF size by making hint subsetting optional { - eStatus = ATSFontGetTable( rFont, GetTag("prep"), 0, 0, NULL, &nPrepLen); - eStatus = ATSFontGetTable( rFont, GetTag("cvt "), 0, 0, NULL, &nCvtLen); - eStatus = ATSFontGetTable( rFont, GetTag("fpgm"), 0, 0, NULL, &nFpgmLen); + nPrepSize = pMacFont->GetFontTable( "prep", NULL); + nCvtSize = pMacFont->GetFontTable( "cvt ", NULL); + nFpgmSize = pMacFont->GetFontTable( "fpgm", NULL); } // prepare a byte buffer for a fake font int nTableCount = 7; - nTableCount += (nPrepLen>0) + (nCvtLen>0) + (nFpgmLen>0) + (nGlyfLen>0); - const ByteCount nFdirLen = 12 + 16*nTableCount; - ByteCount nTotalLen = nFdirLen; - nTotalLen += nHeadLen + nMaxpLen + nNameLen + nCmapLen; - if( nGlyfLen ) - nTotalLen += nLocaLen + nGlyfLen; + nTableCount += (nPrepSize>0) + (nCvtSize>0) + (nFpgmSize>0) + (nGlyfSize>0); + const ByteCount nFdirSize = 12 + 16*nTableCount; + ByteCount nTotalSize = nFdirSize; + nTotalSize += nHeadSize + nMaxpSize + nNameSize + nCmapSize; + if( nGlyfSize ) + nTotalSize += nLocaSize + nGlyfSize; else - nTotalLen += nCffLen; - nTotalLen += nHheaLen + nHmtxLen; - nTotalLen += nPrepLen + nCvtLen + nFpgmLen; - rBuffer.resize( nTotalLen ); + nTotalSize += nCffSize; + nTotalSize += nHheaSize + nHmtxSize; + nTotalSize += nPrepSize + nCvtSize + nFpgmSize; + rBuffer.resize( nTotalSize ); // fake a SFNT font directory header if( nTableCount < 16 ) @@ -2194,57 +1976,69 @@ static bool GetRawFontData( const ImplFo } // get font table raw data and update the fake directory entries - ByteCount nOfs = nFdirLen; + ByteCount nOfs = nFdirSize; unsigned char* pFakeEntry = &rBuffer[12]; - eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, nCmapLen, (void*)&rBuffer[nOfs], &nCmapLen); - FakeDirEntry( GetTag("cmap"), nOfs, nCmapLen, &rBuffer[0], pFakeEntry ); - nOfs += nCmapLen; - if( nCvtLen ) { - eStatus = ATSFontGetTable( rFont, GetTag("cvt "), 0, nCvtLen, (void*)&rBuffer[nOfs], &nCvtLen); - FakeDirEntry( GetTag("cvt "), nOfs, nCvtLen, &rBuffer[0], pFakeEntry ); - nOfs += nCvtLen; - } - if( nFpgmLen ) { - eStatus = ATSFontGetTable( rFont, GetTag("fpgm"), 0, nFpgmLen, (void*)&rBuffer[nOfs], &nFpgmLen); - FakeDirEntry( GetTag("fpgm"), nOfs, nFpgmLen, &rBuffer[0], pFakeEntry ); - nOfs += nFpgmLen; - } - if( nCffLen ) { - eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, nCffLen, (void*)&rBuffer[nOfs], &nCffLen); - FakeDirEntry( GetTag("CFF "), nOfs, nCffLen, &rBuffer[0], pFakeEntry ); - nOfs += nGlyfLen; + if( nCmapSize != pMacFont->GetFontTable( "cmap", &rBuffer[nOfs])) + return false; + FakeDirEntry( "cmap", nOfs, nCmapSize, &rBuffer[0], pFakeEntry ); + nOfs += nCmapSize; + if( nCvtSize ) { + if( nCvtSize != pMacFont->GetFontTable( "cvt ", &rBuffer[nOfs])) + return false; + FakeDirEntry( "cvt ", nOfs, nCvtSize, &rBuffer[0], pFakeEntry ); + nOfs += nCvtSize; + } + if( nFpgmSize ) { + if( nFpgmSize != pMacFont->GetFontTable( "fpgm", &rBuffer[nOfs])) + return false; + FakeDirEntry( "fpgm", nOfs, nFpgmSize, &rBuffer[0], pFakeEntry ); + nOfs += nFpgmSize; + } + if( nCffSize ) { + if( nCffSize != pMacFont->GetFontTable( "CFF ", &rBuffer[nOfs])) + return false; + FakeDirEntry( "CFF ", nOfs, nCffSize, &rBuffer[0], pFakeEntry ); + nOfs += nGlyfSize; } else { - eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, nGlyfLen, (void*)&rBuffer[nOfs], &nGlyfLen); - FakeDirEntry( GetTag("glyf"), nOfs, nGlyfLen, &rBuffer[0], pFakeEntry ); - nOfs += nGlyfLen; - eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, nLocaLen, (void*)&rBuffer[nOfs], &nLocaLen); - FakeDirEntry( GetTag("loca"), nOfs, nLocaLen, &rBuffer[0], pFakeEntry ); - nOfs += nLocaLen; - } - eStatus = ATSFontGetTable( rFont, GetTag("head"), 0, nHeadLen, (void*)&rBuffer[nOfs], &nHeadLen); - FakeDirEntry( GetTag("head"), nOfs, nHeadLen, &rBuffer[0], pFakeEntry ); - nOfs += nHeadLen; - eStatus = ATSFontGetTable( rFont, GetTag("hhea"), 0, nHheaLen, (void*)&rBuffer[nOfs], &nHheaLen); - FakeDirEntry( GetTag("hhea"), nOfs, nHheaLen, &rBuffer[0], pFakeEntry ); - nOfs += nHheaLen; - eStatus = ATSFontGetTable( rFont, GetTag("hmtx"), 0, nHmtxLen, (void*)&rBuffer[nOfs], &nHmtxLen); - FakeDirEntry( GetTag("hmtx"), nOfs, nHmtxLen, &rBuffer[0], pFakeEntry ); - nOfs += nHmtxLen; - eStatus = ATSFontGetTable( rFont, GetTag("maxp"), 0, nMaxpLen, (void*)&rBuffer[nOfs], &nMaxpLen); - FakeDirEntry( GetTag("maxp"), nOfs, nMaxpLen, &rBuffer[0], pFakeEntry ); - nOfs += nMaxpLen; - eStatus = ATSFontGetTable( rFont, GetTag("name"), 0, nNameLen, (void*)&rBuffer[nOfs], &nNameLen); - FakeDirEntry( GetTag("name"), nOfs, nNameLen, &rBuffer[0], pFakeEntry ); - nOfs += nNameLen; - if( nPrepLen ) { - eStatus = ATSFontGetTable( rFont, GetTag("prep"), 0, nPrepLen, (void*)&rBuffer[nOfs], &nPrepLen); - FakeDirEntry( GetTag("prep"), nOfs, nPrepLen, &rBuffer[0], pFakeEntry ); - nOfs += nPrepLen; + if( nGlyfSize != pMacFont->GetFontTable( "glyf", &rBuffer[nOfs])) + return false; + FakeDirEntry( "glyf", nOfs, nGlyfSize, &rBuffer[0], pFakeEntry ); + nOfs += nGlyfSize; + if( nLocaSize != pMacFont->GetFontTable( "loca", &rBuffer[nOfs])) + return false; + FakeDirEntry( "loca", nOfs, nLocaSize, &rBuffer[0], pFakeEntry ); + nOfs += nLocaSize; + } + if( nHeadSize != pMacFont->GetFontTable( "head", &rBuffer[nOfs])) + return false; + FakeDirEntry( "head", nOfs, nHeadSize, &rBuffer[0], pFakeEntry ); + nOfs += nHeadSize; + if( nHheaSize != pMacFont->GetFontTable( "hhea", &rBuffer[nOfs])) + return false; + FakeDirEntry( "hhea", nOfs, nHheaSize, &rBuffer[0], pFakeEntry ); + nOfs += nHheaSize; + if( nHmtxSize != pMacFont->GetFontTable( "hmtx", &rBuffer[nOfs])) + return false; + FakeDirEntry( "hmtx", nOfs, nHmtxSize, &rBuffer[0], pFakeEntry ); + nOfs += nHmtxSize; + if( nMaxpSize != pMacFont->GetFontTable( "maxp", &rBuffer[nOfs])) + return false; + FakeDirEntry( "maxp", nOfs, nMaxpSize, &rBuffer[0], pFakeEntry ); + nOfs += nMaxpSize; + if( nNameSize != pMacFont->GetFontTable( "name", &rBuffer[nOfs])) + return false; + FakeDirEntry( "name", nOfs, nNameSize, &rBuffer[0], pFakeEntry ); + nOfs += nNameSize; + if( nPrepSize ) { + if( nPrepSize != pMacFont->GetFontTable( "prep", &rBuffer[nOfs])) + return false; + FakeDirEntry( "prep", nOfs, nPrepSize, &rBuffer[0], pFakeEntry ); + nOfs += nPrepSize; } - DBG_ASSERT( (nOfs==nTotalLen), "AquaSalGraphics::CreateFontSubset (nOfs!=nTotalLen)"); + DBG_ASSERT( (nOfs==nTotalSize), "AquaSalGraphics::CreateFontSubset (nOfs!=nTotalSize)"); - return sal_True; + return true; } sal_Bool AquaSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, @@ -2270,7 +2064,7 @@ sal_Bool AquaSalGraphics::CreateFontSubs if( bCffOnly ) { // provide the raw-CFF data to the subsetter - ByteCount nCffLen = aBuffer.size(); + const ByteCount nCffLen = aBuffer.size(); rInfo.LoadFont( FontSubsetInfo::CFF_FONT, &aBuffer[0], nCffLen ); // NOTE: assuming that all glyphids requested on Aqua are fully translated @@ -2298,9 +2092,9 @@ sal_Bool AquaSalGraphics::CreateFontSubs ::GetTTGlobalFontInfo( pSftFont, &aTTInfo ); rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; rInfo.m_aPSName = String( aTTInfo.psname, RTL_TEXTENCODING_UTF8 ); - rInfo.m_aFontBBox = Rectangle( Point( aTTInfo.xMin, aTTInfo.yMin ), + rInfo.m_aFontBBox = Rectangle( Point( aTTInfo.xMin, aTTInfo.yMin ), Point( aTTInfo.xMax, aTTInfo.yMax ) ); - rInfo.m_nCapHeight = aTTInfo.yMax; // Well ... + rInfo.m_nCapHeight = aTTInfo.yMax; // Well ... rInfo.m_nAscent = aTTInfo.winAscent; rInfo.m_nDescent = aTTInfo.winDescent; // mac fonts usually do not have an OS2-table @@ -2317,7 +2111,7 @@ sal_Bool AquaSalGraphics::CreateFontSubs // subset glyphs and get their properties // take care that subset fonts require the NotDef glyph in pos 0 int nOrigCount = nGlyphCount; - sal_uInt16 aShortIDs[ 256 ]; + sal_uInt16 aShortIDs[ 256 ]; sal_uInt8 aTempEncs[ 256 ]; int nNotDef = -1; @@ -2389,7 +2183,7 @@ void AquaSalGraphics::GetGlyphWidths( co rUnicodeEnc.clear(); if( pFontData->IsSubsettable() ) - { + { ByteVector aBuffer; if( !GetRawFontData( pFontData, aBuffer, NULL ) ) return; @@ -2469,7 +2263,7 @@ void AquaSalGraphics::GetGlyphWidths( co const Ucs2SIntMap* AquaSalGraphics::GetFontEncodingVector( const ImplFontData*, const Ucs2OStrMap** /*ppNonEncoded*/ ) { - return NULL; + return NULL; } // ----------------------------------------------------------------------- @@ -2480,14 +2274,14 @@ const void* AquaSalGraphics::GetEmbedFon FontSubsetInfo&, long* /*pDataLen*/ ) { - return NULL; + return NULL; } // ----------------------------------------------------------------------- void AquaSalGraphics::FreeEmbedFontData( const void* pData, long /*nDataLen*/ ) { - // TODO: implementing this only makes sense when the implementation of + // TODO: implementing this only makes sense when the implementation of // AquaSalGraphics::GetEmbedFontData() returns non-NULL (void)pData; DBG_ASSERT( (pData!=NULL), "AquaSalGraphics::FreeEmbedFontData() is not implemented\n"); @@ -2498,11 +2292,12 @@ void AquaSalGraphics::FreeEmbedFontData( SystemFontData AquaSalGraphics::GetSysFontData( int /* nFallbacklevel */ ) const { SystemFontData aSysFontData; - OSStatus err; aSysFontData.nSize = sizeof( SystemFontData ); +#ifdef USE_ATSU // NOTE: Native ATSU font fallbacks are used, not the VCL fallbacks. ATSUFontID fontId; + OSStatus err; err = ATSUGetAttribute( maATSUStyle, kATSUFontTag, sizeof(fontId), &fontId, 0 ); if (err) fontId = 0; aSysFontData.aATSUFontID = (void *) fontId; @@ -2524,6 +2319,7 @@ SystemFontData AquaSalGraphics::GetSysFo } else { aSysFontData.bVerticalCharacterType = false; } +#endif // USE_ATSU aSysFontData.bAntialias = !mbNonAntialiasedText; @@ -2753,4 +2549,3 @@ bool XorEmulation::UpdateTarget() } // ======================================================================= -
Modified: openoffice/trunk/main/vcl/source/gdi/outdev3.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/gdi/outdev3.cxx?rev=1560749&r1=1560748&r2=1560749&view=diff ============================================================================== --- openoffice/trunk/main/vcl/source/gdi/outdev3.cxx (original) +++ openoffice/trunk/main/vcl/source/gdi/outdev3.cxx Thu Jan 23 17:00:44 2014 @@ -6043,6 +6043,14 @@ SalLayout* OutputDevice::ImplLayout( con ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nMinIndex, nLen, nPixelWidth, pDXArray ); +#ifdef MACOSX + // CoreText layouts are immutable and already contain the text color + // so we need to provide the color already for the layout request + // even if this layout will never be drawn + if( mbInitTextColor ) + const_cast<OutputDevice&>(*this).ImplInitTextColor(); +#endif + // get matching layout object for base font SalLayout* pSalLayout = NULL; if( mpPDFWriter )
