summaryrefslogtreecommitdiff
path: root/vcl/coretext
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/coretext')
-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();