diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-02-28 16:57:28 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-03-01 20:38:55 +0000 |
commit | b610ea59875a876712b1c57702eae615e424267a (patch) | |
tree | ea8132eee89bdb2078fb81707d758f20e4bbc307 /vcl/aqua | |
parent | 687456967ede128c0334536a116bba8699420b7e (diff) |
Get better hints as to what script a font is likely tuned for
Diffstat (limited to 'vcl/aqua')
-rw-r--r-- | vcl/aqua/inc/salgdi.h | 8 | ||||
-rw-r--r-- | vcl/aqua/source/gdi/salgdi.cxx | 68 |
2 files changed, 46 insertions, 30 deletions
diff --git a/vcl/aqua/inc/salgdi.h b/vcl/aqua/inc/salgdi.h index 8b2a9564bea3..ad6b92225a8e 100644 --- a/vcl/aqua/inc/salgdi.h +++ b/vcl/aqua/inc/salgdi.h @@ -61,7 +61,7 @@ public: virtual sal_IntPtr GetFontId() const; ImplFontCharMap* GetImplFontCharMap() const; - bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; bool HasChar( sal_uInt32 cChar ) const; void ReadOs2Table() const; @@ -71,12 +71,12 @@ public: private: const ATSUFontID mnFontId; mutable ImplFontCharMap* mpCharMap; - mutable FontLayoutCapabilities maFontLayoutCapabilities; + mutable vcl::FontCapabilities maFontCapabilities; mutable bool mbOs2Read; // true if OS2-table related info is valid mutable bool mbHasOs2Table; mutable bool mbCmapEncodingRead; // true if cmap encoding of Mac font is read mutable bool mbHasCJKSupport; // #i78970# CJK fonts need extra leading - mutable bool mbFontLayoutCapabilitiesRead; + mutable bool mbFontCapabilitiesRead; }; // abstracting quartz color instead of having to use an CGFloat[] array @@ -286,7 +286,7 @@ public: virtual ULONG GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ); // get the repertoire of the current font virtual ImplFontCharMap* GetImplFontCharMap() const; - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; // graphics must fill supplied font list virtual void GetDevFontList( ImplDevFontList* ); // graphics should call ImplAddDevFontSubstitute on supplied diff --git a/vcl/aqua/source/gdi/salgdi.cxx b/vcl/aqua/source/gdi/salgdi.cxx index e0f6d55a2088..7b8e41584a30 100644 --- a/vcl/aqua/source/gdi/salgdi.cxx +++ b/vcl/aqua/source/gdi/salgdi.cxx @@ -73,7 +73,7 @@ ImplMacFontData::ImplMacFontData( const ImplDevFontAttributes& rDFA, ATSUFontID , mbHasOs2Table( false ) , mbCmapEncodingRead( false ) , mbHasCJKSupport( false ) -, mbFontLayoutCapabilitiesRead( false ) +, mbFontCapabilitiesRead( false ) {} // ----------------------------------------------------------------------- @@ -158,37 +158,53 @@ ImplFontCharMap* ImplMacFontData::GetImplFontCharMap() const return mpCharMap; } -bool ImplMacFontData::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities) const +bool ImplMacFontData::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { // read this only once per font - if( mbFontLayoutCapabilitiesRead ) + if( mbFontCapabilitiesRead ) { - rFontLayoutCapabilities = maFontLayoutCapabilities; - return !rFontLayoutCapabilities.empty(); + rFontCapabilities = maFontCapabilities; + return !rFontCapabilities.maUnicodeRange.empty() || !rFontCapabilities.maCodePageRange.empty(); } - mbFontLayoutCapabilitiesRead = true; + mbFontCapabilitiesRead = true; // prepare to get the GSUB table raw data ATSFontRef rFont = FMGetATSFontRefFromFont( mnFontId ); ByteCount nBufSize = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("GSUB"), 0, 0, NULL, &nBufSize ); - if( eStatus != noErr ) - return false; - - // allocate a buffer for the GSUB raw data - ByteVector aBuffer( nBufSize ); - - // get the GSUB raw data - ByteCount nRawLength = 0; - eStatus = ATSFontGetTable( rFont, GetTag("GSUB"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); - if( eStatus != noErr ) - return false; - - const unsigned char* pGSUBTable = &aBuffer[0]; - vcl::getTTFontLayoutCapabilities(maFontLayoutCapabilities, pGSUBTable); - rFontLayoutCapabilities = maFontLayoutCapabilities; - - return !rFontLayoutCapabilities.empty(); + OSStatus eStatus; + eStatus = ATSFontGetTable( rFont, GetTag("GSUB"), 0, 0, NULL, &nBufSize ); + if( eStatus == noErr ) + { + // allocate a buffer for the GSUB raw data + ByteVector aBuffer( nBufSize ); + // get the GSUB raw data + ByteCount nRawLength = 0; + eStatus = ATSFontGetTable( rFont, GetTag("GSUB"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); + if( eStatus == noErr ) + { + const unsigned char* pGSUBTable = &aBuffer[0]; + vcl::getTTScripts(maFontCapabilities.maGSUBScriptTags, pGSUBTable, nRawLength); + } + } + eStatus = ATSFontGetTable( rFont, GetTag("OS/2"), 0, 0, NULL, &nBufSize ); + if( eStatus == noErr ) + { + // allocate a buffer for the GSUB 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 ); + if( eStatus == noErr ) + { + const unsigned char* pOS2Table = &aBuffer[0]; + vcl::getTTCoverage( + maFontCapabilities.maUnicodeRange, + maFontCapabilities.maCodePageRange, + pOS2Table, nRawLength); + } + } + rFontCapabilities = maFontCapabilities; + return !rFontCapabilities.maUnicodeRange.empty() || !rFontCapabilities.maCodePageRange.empty(); } // ----------------------------------------------------------------------- @@ -2018,12 +2034,12 @@ ImplFontCharMap* AquaSalGraphics::GetImplFontCharMap() const return mpMacFontData->GetImplFontCharMap(); } -bool AquaSalGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities) const +bool AquaSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { if( !mpMacFontData ) return false; - return mpMacFontData->GetImplFontLayoutCapabilities(rFontLayoutCapabilities); + return mpMacFontData->GetImplFontCapabilities(rFontCapabilities); } // ----------------------------------------------------------------------- |