summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2013-06-14 19:06:34 +0200
committerKhaled Hosny <khaledhosny@eglug.org>2013-06-16 15:47:55 +0000
commit59d09b026f3672455d15531d28024492ba5a927f (patch)
tree5580d2a74d9f9f7ad5b78eb55d0faffcbb30def6
parent67aa2ec2133bb5ba681c9a9339f362a5829f903d (diff)
Fix PDF export with fallback fonts in Core Text
We need to pass the real font used to layout the glyphs in case it differs from the requested font, otherwise we end with garbage in PDF files. Change-Id: I9caa8e60429e45ee864f5347fd9392f5e440864e Reviewed-on: https://gerrit.libreoffice.org/4301 Reviewed-by: Khaled Hosny <khaledhosny@eglug.org> Tested-by: Khaled Hosny <khaledhosny@eglug.org>
-rw-r--r--vcl/coretext/ctfonts.cxx39
-rw-r--r--vcl/coretext/ctfonts.hxx19
-rw-r--r--vcl/coretext/ctlayout.cxx12
-rw-r--r--vcl/coretext/salgdi2.cxx1
4 files changed, 47 insertions, 24 deletions
diff --git a/vcl/coretext/ctfonts.cxx b/vcl/coretext/ctfonts.cxx
index 9c58891c0b7c..ab738d9ae88e 100644
--- a/vcl/coretext/ctfonts.cxx
+++ b/vcl/coretext/ctfonts.cxx
@@ -33,22 +33,6 @@
// =======================================================================
-// CoreText specific physically available font face
-class CTFontData
-: public ImplMacFontData
-{
-public:
- explicit CTFontData( const ImplDevFontAttributes&, sal_IntPtr nFontId );
- virtual ~CTFontData( void );
- virtual PhysicalFontFace* Clone( void ) const;
-
- virtual ImplMacTextStyle* CreateMacTextStyle( const FontSelectPattern& ) const;
- virtual ImplFontEntry* CreateFontInstance( /*const*/ FontSelectPattern& ) const;
- virtual int GetFontTable( const char pTagName[5], unsigned char* ) const;
-};
-
-// =======================================================================
-
class CTFontList
: public SystemFontList
{
@@ -327,10 +311,8 @@ int CTFontData::GetFontTable( const char pTagName[5], unsigned char* pResultBuf
// =======================================================================
-static void CTFontEnumCallBack( const void* pValue, void* pContext )
+ImplDevFontAttributes DevFontFromCTFontDescriptor( CTFontDescriptorRef pFD, bool* bFontEnabled )
{
- CTFontDescriptorRef pFD = static_cast<CTFontDescriptorRef>(pValue);
-
// all CoreText fonts are device fonts that can rotate just fine
ImplDevFontAttributes rDFA;
rDFA.mbOrientation = true;
@@ -358,9 +340,12 @@ static void CTFontEnumCallBack( const void* pValue, void* pContext )
rDFA.SetStyleName( GetOUString( pStyleName ) );
// get font-enabled status
- int bFontEnabled = FALSE;
- CFNumberRef pFontEnabled = (CFNumberRef)CTFontDescriptorCopyAttribute( pFD, kCTFontEnabledAttribute );
- CFNumberGetValue( pFontEnabled, kCFNumberIntType, &bFontEnabled );
+ if( bFontEnabled ) {
+ int bEnabled = FALSE;
+ CFNumberRef pEnabled = (CFNumberRef)CTFontDescriptorCopyAttribute( pFD, kCTFontEnabledAttribute );
+ CFNumberGetValue( pEnabled, kCFNumberIntType, &bEnabled );
+ *bFontEnabled = bEnabled;
+ }
// get font attributes
CFDictionaryRef pAttrDict = (CFDictionaryRef)CTFontDescriptorCopyAttribute( pFD, kCTFontTraitsAttribute );
@@ -419,6 +404,16 @@ static void CTFontEnumCallBack( const void* pValue, void* pContext )
// TODO? also use the HEAD table if available to get more attributes
// CFDataRef CTFontCopyTable( CTFontRef, kCTFontTableHead, /*kCTFontTableOptionNoOptions*/kCTFontTableOptionExcludeSynthetic );
+ return rDFA;
+}
+
+static void CTFontEnumCallBack( const void* pValue, void* pContext )
+{
+ CTFontDescriptorRef pFD = static_cast<CTFontDescriptorRef>(pValue);
+
+ bool bFontEnabled;
+ ImplDevFontAttributes rDFA = DevFontFromCTFontDescriptor( pFD, &bFontEnabled );
+
if( bFontEnabled)
{
const sal_IntPtr nFontId = (sal_IntPtr)pValue;
diff --git a/vcl/coretext/ctfonts.hxx b/vcl/coretext/ctfonts.hxx
index d80a5660bd7c..f4a2147cf26e 100644
--- a/vcl/coretext/ctfonts.hxx
+++ b/vcl/coretext/ctfonts.hxx
@@ -46,5 +46,22 @@ private:
CFMutableDictionaryRef GetStyleDict( void ) const { return mpStyleDict; }
};
-// =======================================================================
+// CoreText specific physically available font face
+class CTFontData
+: public ImplMacFontData
+{
+public:
+ explicit CTFontData( const ImplDevFontAttributes&, sal_IntPtr nFontId );
+ explicit CTFontData( CTFontDescriptorRef pFontDesc );
+ virtual ~CTFontData( void );
+ virtual PhysicalFontFace* Clone( void ) const;
+ virtual ImplMacTextStyle* CreateMacTextStyle( const FontSelectPattern& ) const;
+ virtual ImplFontEntry* CreateFontInstance( /*const*/ FontSelectPattern& ) const;
+ virtual int GetFontTable( const char pTagName[5], unsigned char* ) const;
+};
+
+SystemFontList* GetCoretextFontList(void);
+ImplDevFontAttributes DevFontFromCTFontDescriptor( CTFontDescriptorRef, bool* );
+
+// =======================================================================
diff --git a/vcl/coretext/ctlayout.cxx b/vcl/coretext/ctlayout.cxx
index 0334cffe8a4b..18df73e55a82 100644
--- a/vcl/coretext/ctlayout.cxx
+++ b/vcl/coretext/ctlayout.cxx
@@ -293,6 +293,18 @@ int CTLayout::GetNextGlyphs( int nLen, sal_GlyphId* pGlyphIDs, Point& rPos, int&
}
const PhysicalFontFace* pFallbackFont = NULL;
+ if( pFallbackFonts ) {
+ CFDictionaryRef pRunAttributes = CTRunGetAttributes( pGlyphRun );
+ CTFontRef pRunFont = (CTFontRef)CFDictionaryGetValue( pRunAttributes, kCTFontAttributeName );
+
+ CFDictionaryRef pAttributes = mpTextStyle->GetStyleDict();
+ CTFontRef pFont = (CTFontRef)CFDictionaryGetValue( pAttributes, kCTFontAttributeName );
+ if ( !CFEqual( pRunFont, pFont ) ) {
+ CTFontDescriptorRef pFontDesc = CTFontCopyFontDescriptor( pRunFont );
+ ImplDevFontAttributes rDevFontAttr = DevFontFromCTFontDescriptor( pFontDesc, NULL );
+ pFallbackFont = new CTFontData( rDevFontAttr, (sal_IntPtr)pFontDesc );
+ }
+ }
// get the details for each interesting glyph
// TODO: handle nLen>1
diff --git a/vcl/coretext/salgdi2.cxx b/vcl/coretext/salgdi2.cxx
index 2f7da5bab0e0..8e98f847d98c 100644
--- a/vcl/coretext/salgdi2.cxx
+++ b/vcl/coretext/salgdi2.cxx
@@ -422,7 +422,6 @@ void AquaSalGraphics::GetDevFontList( ImplDevFontList* pFontList )
// through it as should be all event handlers
SalData* pSalData = GetSalData();
- SystemFontList* GetCoretextFontList(void); // forward declaration
if( !pSalData->mpFontList )
pSalData->mpFontList = GetCoretextFontList();