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 | |
parent | 687456967ede128c0334536a116bba8699420b7e (diff) |
Get better hints as to what script a font is likely tuned for
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/aqua/inc/salgdi.h | 8 | ||||
-rw-r--r-- | vcl/aqua/source/gdi/salgdi.cxx | 68 | ||||
-rw-r--r-- | vcl/inc/sft.hxx | 8 | ||||
-rw-r--r-- | vcl/inc/vcl/glyphcache.hxx | 7 | ||||
-rw-r--r-- | vcl/inc/vcl/outdev.hxx | 5 | ||||
-rw-r--r-- | vcl/inc/vcl/salgdi.hxx | 2 | ||||
-rw-r--r-- | vcl/prj/d.lst | 1 | ||||
-rw-r--r-- | vcl/source/fontsubset/gsub.cxx | 18 | ||||
-rw-r--r-- | vcl/source/fontsubset/sft.cxx | 48 | ||||
-rw-r--r-- | vcl/source/gdi/outdev3.cxx | 6 | ||||
-rw-r--r-- | vcl/source/glyphs/gcach_ftyp.cxx | 32 | ||||
-rw-r--r-- | vcl/source/glyphs/gcach_ftyp.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/headless/svpgdi.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/headless/svppspgraphics.cxx | 6 | ||||
-rw-r--r-- | vcl/unx/headless/svppspgraphics.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/headless/svptext.cxx | 6 | ||||
-rw-r--r-- | vcl/unx/inc/pspgraphics.h | 2 | ||||
-rw-r--r-- | vcl/unx/inc/salgdi.h | 2 | ||||
-rw-r--r-- | vcl/unx/source/gdi/pspgraphics.cxx | 6 | ||||
-rw-r--r-- | vcl/unx/source/gdi/salgdi3.cxx | 6 | ||||
-rw-r--r-- | vcl/win/inc/salgdi.h | 10 | ||||
-rw-r--r-- | vcl/win/source/gdi/salgdi3.cxx | 47 |
22 files changed, 177 insertions, 117 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); } // ----------------------------------------------------------------------- diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx index 33577d959ea7..0ba501e976b1 100644 --- a/vcl/inc/sft.hxx +++ b/vcl/inc/sft.hxx @@ -71,7 +71,7 @@ #include <vector> -typedef std::vector< sal_uInt32 > FontLayoutCapabilities; +#include "vcl/fontcapabilities.hxx" namespace vcl { @@ -303,7 +303,11 @@ namespace vcl int OpenTTFontFile(const char *fname, sal_uInt32 facenum, TrueTypeFont** ttf); #endif - void getTTFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities, const unsigned char* pTable); + void getTTScripts(std::vector< sal_uInt32 > &rScriptTags, const unsigned char* pTable, size_t nLength); + bool getTTCoverage( + boost::dynamic_bitset<sal_uInt32> &rUnicodeCoverage, + boost::dynamic_bitset<sal_uInt32> &rCodePageCoverage, + const unsigned char* pTable, size_t nLength); /** * TrueTypeFont destructor. Deallocates the memory. diff --git a/vcl/inc/vcl/glyphcache.hxx b/vcl/inc/vcl/glyphcache.hxx index 5137324a99be..c28a3bfef3dd 100644 --- a/vcl/inc/vcl/glyphcache.hxx +++ b/vcl/inc/vcl/glyphcache.hxx @@ -57,7 +57,10 @@ class CmapResult; class ServerFontLayout; #include <vcl/sallayout.hxx> -typedef std::vector< sal_uInt32 > FontLayoutCapabilities; +namespace vcl +{ + struct FontCapabilities; +} // ======================================================================= @@ -194,7 +197,7 @@ public: virtual ULONG GetKernPairs( ImplKernPairData** ) const { return 0; } virtual int GetGlyphKernValue( int, int ) const { return 0; } virtual bool GetFontCodeRanges( CmapResult& ) const { return false; } - virtual bool GetFontLayoutCapabilities(FontLayoutCapabilities &) const { return false; } + virtual bool GetFontCapabilities(vcl::FontCapabilities &) const { return false; } Point TransformPoint( const Point& ) const; GlyphData& GetGlyphData( int nGlyphIndex ); diff --git a/vcl/inc/vcl/outdev.hxx b/vcl/inc/vcl/outdev.hxx index 7ba4ecba7311..e61b05eddc02 100644 --- a/vcl/inc/vcl/outdev.hxx +++ b/vcl/inc/vcl/outdev.hxx @@ -104,13 +104,12 @@ namespace awt { typedef std::vector< Rectangle > MetricVector; -typedef std::vector< sal_uInt32 > FontLayoutCapabilities; - namespace vcl { class PDFWriterImpl; class ExtOutDevData; class ITextLayout; + struct FontCapabilities; } #define OUTDEV_BUFFER_SIZE 128 @@ -1074,7 +1073,7 @@ public: FontMetric GetFontMetric() const; FontMetric GetFontMetric( const Font& rFont ) const; BOOL GetFontCharMap( FontCharMap& rFontCharMap ) const; - bool GetFontLayoutCapabilities( FontLayoutCapabilities& rFontLayoutCapabilities ) const; + bool GetFontCapabilities( vcl::FontCapabilities& rFontCapabilities ) const; xub_StrLen HasGlyphs( const Font& rFont, const String& rStr, xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN ) const; diff --git a/vcl/inc/vcl/salgdi.hxx b/vcl/inc/vcl/salgdi.hxx index 07e323c6a084..20220151cafc 100644 --- a/vcl/inc/vcl/salgdi.hxx +++ b/vcl/inc/vcl/salgdi.hxx @@ -242,7 +242,7 @@ public: // get the repertoire of the current font virtual ImplFontCharMap* GetImplFontCharMap() const = 0; // get the layout capabilities of the current font - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const = 0; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const = 0; // graphics must fill supplied font list virtual void GetDevFontList( ImplDevFontList* ) = 0; // graphics should call ImplAddDevFontSubstitute on supplied diff --git a/vcl/prj/d.lst b/vcl/prj/d.lst index b0e1aa2cd807..c184c1d2cb2b 100644 --- a/vcl/prj/d.lst +++ b/vcl/prj/d.lst @@ -45,6 +45,7 @@ mkdir: %_DEST%\inc%_EXT%\vcl ..\inc\vcl\floatwin.hxx %_DEST%\inc%_EXT%\vcl\floatwin.hxx ..\inc\vcl\fntstyle.hxx %_DEST%\inc%_EXT%\vcl\fntstyle.hxx ..\inc\vcl\font.hxx %_DEST%\inc%_EXT%\vcl\font.hxx +..\inc\vcl\fontcapabilities.hxx %_DEST%\inc%_EXT%\vcl\fontcapabilities.hxx ..\inc\vcl\fontcvt.hxx %_DEST%\inc%_EXT%\vcl\fontcvt.hxx ..\inc\vcl\gdimtf.hxx %_DEST%\inc%_EXT%\vcl\gdimtf.hxx ..\inc\vcl\gfxlink.hxx %_DEST%\inc%_EXT%\vcl\gfxlink.hxx diff --git a/vcl/source/fontsubset/gsub.cxx b/vcl/source/fontsubset/gsub.cxx index e27b91d0e5a2..c2b0310c7ca9 100644 --- a/vcl/source/fontsubset/gsub.cxx +++ b/vcl/source/fontsubset/gsub.cxx @@ -358,24 +358,6 @@ int HasVerticalGSUB( struct _TrueTypeFont* pTTFile ) return pGlyphSubstitution ? +1 : 0; } -void getTTFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities, const unsigned char* pBase) -{ - // parse GSUB/GPOS header - const FT_Byte* pGsubHeader = pBase; - pGsubHeader+=4; - const USHORT nOfsScriptList = NEXT_UShort(pGsubHeader); - - // parse Script Table - const FT_Byte* pScriptHeader = pBase + nOfsScriptList; - const USHORT nCntScript = NEXT_UShort(pScriptHeader); - for( USHORT nScriptIndex = 0; nScriptIndex < nCntScript; ++nScriptIndex ) - { - sal_uInt32 nTag = NEXT_Long(pScriptHeader); - pScriptHeader += 2; - rFontLayoutCapabilities.push_back(nTag); // e.g. hani/arab/kana/hang - } -} - } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx index 3c40b962a9b8..1bf8d638d9d5 100644 --- a/vcl/source/fontsubset/sft.cxx +++ b/vcl/source/fontsubset/sft.cxx @@ -2727,6 +2727,54 @@ void DisposeNameRecords(NameRecord* nr, int n) free(nr); } +bool getTTCoverage( + boost::dynamic_bitset<sal_uInt32> &rUnicodeRange, + boost::dynamic_bitset<sal_uInt32> &rCodePageRange, + const unsigned char* pTable, size_t nLength) +{ + bool bRet = false; + sal_uInt16 nVersion = GetUInt16(pTable, 0, 1); + // parse OS/2 header + if ( nVersion >= 0x0001 && nLength >= 58 ) + { + rUnicodeRange.append(GetUInt32(pTable, 42, 1)); + rUnicodeRange.append(GetUInt32(pTable, 46, 1)); + rUnicodeRange.append(GetUInt32(pTable, 50, 1)); + rUnicodeRange.append(GetUInt32(pTable, 54, 1)); + bRet = true; + if (nLength >= 86) + { + rCodePageRange.append(GetUInt32(pTable, 78, 1)); + rCodePageRange.append(GetUInt32(pTable, 82, 1)); + } + } + return bRet; +} + +void getTTScripts(std::vector< sal_uInt32 > &rScriptTags, const unsigned char* pTable, size_t nLength) +{ + if (nLength < 6) + return; + + // parse GSUB/GPOS header + const sal_uInt16 nOfsScriptList = GetUInt16(pTable, 4, 1); + + // parse Script Table + const sal_uInt16 nCntScript = GetUInt16(pTable, nOfsScriptList, 1); + sal_uInt32 nCurrentPos = nOfsScriptList+2; + for( sal_uInt16 nScriptIndex = 0; + nScriptIndex < nCntScript && nLength >= 6; ++nScriptIndex, + nLength-=6 ) + { + sal_uInt32 nTag = GetUInt32(pTable, nCurrentPos, 1); + nCurrentPos+=6; + rScriptTags.push_back(nTag); // e.g. hani/arab/kana/hang + } + + std::sort(rScriptTags.begin(), rScriptTags.end()); + rScriptTags.erase(std::unique(rScriptTags.begin(), rScriptTags.end()), rScriptTags.end()); +} + } // namespace vcl /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx index 72155e588a05..b41fa00c95ff 100644 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -7911,10 +7911,8 @@ BOOL OutputDevice::GetTextOutline( PolyPolygon& rPolyPoly, return TRUE; } -bool OutputDevice::GetFontLayoutCapabilities( FontLayoutCapabilities& rFontLayoutCapabilities ) const +bool OutputDevice::GetFontCapabilities( FontCapabilities& rFontCapabilities ) const { - rFontLayoutCapabilities.clear(); - // we need a graphics if( !mpGraphics && !ImplGetGraphics() ) return false; @@ -7926,7 +7924,7 @@ bool OutputDevice::GetFontLayoutCapabilities( FontLayoutCapabilities& rFontLayou if( !mpFontEntry ) return false; - return mpGraphics->GetImplFontLayoutCapabilities(rFontLayoutCapabilities); + return mpGraphics->GetImplFontCapabilities(rFontCapabilities); } // ----------------------------------------------------------------------- diff --git a/vcl/source/glyphs/gcach_ftyp.cxx b/vcl/source/glyphs/gcach_ftyp.cxx index 914ed1cb10c1..cc798549b48c 100644 --- a/vcl/source/glyphs/gcach_ftyp.cxx +++ b/vcl/source/glyphs/gcach_ftyp.cxx @@ -1764,29 +1764,27 @@ bool FreetypeServerFont::GetFontCodeRanges( CmapResult& rResult ) const return true; } -bool FreetypeServerFont::GetFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities) const +bool FreetypeServerFont::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { - rFontLayoutCapabilities.clear(); + bool bRet = false; ULONG nLength = 0; - const FT_Byte* pBase; // load GSUB table - pBase = mpFontInfo->GetTable("GSUB", &nLength); - if( pBase ) - vcl::getTTFontLayoutCapabilities(rFontLayoutCapabilities, pBase); -#if 0 - //If there's any need for it, we could check the GPOS as well - // load GPOS table - pBase = mpFontInfo->GetTable("GPOS", &nLength); - if( pBase ) - vcl::getTTFontLayoutCapabilities(rFontLayoutCapabilities, pBase); -#endif + const FT_Byte* pGSUB = mpFontInfo->GetTable("GSUB", &nLength); + if (pGSUB) + vcl::getTTScripts(rFontCapabilities.maGSUBScriptTags, pGSUB, nLength); - std::sort(rFontLayoutCapabilities.begin(), rFontLayoutCapabilities.end()); - rFontLayoutCapabilities.erase(std::unique(rFontLayoutCapabilities.begin(), rFontLayoutCapabilities.end()), - rFontLayoutCapabilities.end()); + // load OS/2 table + const FT_Byte* pOS2 = mpFontInfo->GetTable("OS/2", &nLength); + if (pOS2) + { + bRet = vcl::getTTCoverage( + rFontCapabilities.maUnicodeRange, + rFontCapabilities.maCodePageRange, + pOS2, nLength); + } - return !rFontLayoutCapabilities.empty(); + return bRet; } // ----------------------------------------------------------------------- diff --git a/vcl/source/glyphs/gcach_ftyp.hxx b/vcl/source/glyphs/gcach_ftyp.hxx index b0fa5d3a5c23..f37404033611 100644 --- a/vcl/source/glyphs/gcach_ftyp.hxx +++ b/vcl/source/glyphs/gcach_ftyp.hxx @@ -205,7 +205,7 @@ protected: int ApplyGlyphTransform( int nGlyphFlags, FT_GlyphRec_*, bool ) const; virtual void InitGlyphData( int nGlyphIndex, GlyphData& ) const; virtual bool GetFontCodeRanges( CmapResult& ) const; - virtual bool GetFontLayoutCapabilities(FontLayoutCapabilities &) const; + virtual bool GetFontCapabilities(vcl::FontCapabilities &) const; bool ApplyGSUB( const ImplFontSelectData& ); virtual ServerFontLayoutEngine* GetLayoutEngine(); diff --git a/vcl/unx/headless/svpgdi.hxx b/vcl/unx/headless/svpgdi.hxx index 4bd9b3a4b222..b385d3f35b45 100644 --- a/vcl/unx/headless/svpgdi.hxx +++ b/vcl/unx/headless/svpgdi.hxx @@ -90,7 +90,7 @@ public: virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ); virtual ULONG GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ); virtual ImplFontCharMap* GetImplFontCharMap() const; - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; virtual void GetDevFontList( ImplDevFontList* ); virtual void GetDevFontSubstList( OutputDevice* ); virtual bool AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName ); diff --git a/vcl/unx/headless/svppspgraphics.cxx b/vcl/unx/headless/svppspgraphics.cxx index 07271edfcb15..c45a4e8886d0 100644 --- a/vcl/unx/headless/svppspgraphics.cxx +++ b/vcl/unx/headless/svppspgraphics.cxx @@ -696,11 +696,11 @@ ImplFontCharMap* PspGraphics::GetImplFontCharMap() const return new ImplFontCharMap( aCmapResult ); } -bool PspGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const +bool PspGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { if (!m_pServerFont[0]) - return NULL; - return !m_pServerFont[0]->GetFontLayoutCapabilities(rGetImplFontLayoutCapabilities); + return false; + return m_pServerFont[0]->GetFontCapabilities(rFontCapabilities); } USHORT PspGraphics::SetFont( ImplFontSelectData *pEntry, int nFallbackLevel ) diff --git a/vcl/unx/headless/svppspgraphics.hxx b/vcl/unx/headless/svppspgraphics.hxx index ca6bbc37d378..676e86b32f20 100644 --- a/vcl/unx/headless/svppspgraphics.hxx +++ b/vcl/unx/headless/svppspgraphics.hxx @@ -109,7 +109,7 @@ public: virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ); virtual ULONG GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ); virtual ImplFontCharMap* GetImplFontCharMap() const; - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; virtual void GetDevFontList( ImplDevFontList* ); virtual void GetDevFontSubstList( OutputDevice* ); virtual bool AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName ); diff --git a/vcl/unx/headless/svptext.cxx b/vcl/unx/headless/svptext.cxx index 8667e5302df7..6a4685165749 100644 --- a/vcl/unx/headless/svptext.cxx +++ b/vcl/unx/headless/svptext.cxx @@ -282,12 +282,12 @@ ImplFontCharMap* SvpSalGraphics::GetImplFontCharMap() const return new ImplFontCharMap( aCmapResult ); } -bool SvpSalGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const +bool SvpSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { if (!m_pServerFont[0]) - return NULL; + return false; - return !m_pServerFont[0]->GetFontLayoutCapabilities( rGetImplFontLayoutCapabilities); + return m_pServerFont[0]->GetFontCapabilities(rFontCapabilities); } // --------------------------------------------------------------------------- diff --git a/vcl/unx/inc/pspgraphics.h b/vcl/unx/inc/pspgraphics.h index 7fc18eeba2c9..1c7c3d51a785 100644 --- a/vcl/unx/inc/pspgraphics.h +++ b/vcl/unx/inc/pspgraphics.h @@ -106,7 +106,7 @@ public: virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ); virtual ULONG GetKernPairs( ULONG nMaxPairs, ImplKernPairData* ); virtual ImplFontCharMap* GetImplFontCharMap() const; - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; virtual void GetDevFontList( ImplDevFontList* ); virtual void GetDevFontSubstList( OutputDevice* ); virtual bool AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName ); diff --git a/vcl/unx/inc/salgdi.h b/vcl/unx/inc/salgdi.h index 7b3841010a90..4a9cd11f394d 100644 --- a/vcl/unx/inc/salgdi.h +++ b/vcl/unx/inc/salgdi.h @@ -257,7 +257,7 @@ public: virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ); virtual ULONG GetKernPairs( ULONG nMaxPairs, ImplKernPairData* ); virtual ImplFontCharMap* GetImplFontCharMap() const; - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; virtual void GetDevFontList( ImplDevFontList* ); virtual void GetDevFontSubstList( OutputDevice* ); virtual bool AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName ); diff --git a/vcl/unx/source/gdi/pspgraphics.cxx b/vcl/unx/source/gdi/pspgraphics.cxx index 50f6586bbf58..c4bdf66d1af6 100644 --- a/vcl/unx/source/gdi/pspgraphics.cxx +++ b/vcl/unx/source/gdi/pspgraphics.cxx @@ -780,11 +780,11 @@ ImplFontCharMap* PspGraphics::GetImplFontCharMap() const return new ImplFontCharMap( aCmapResult ); } -bool PspGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const +bool PspGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { if (!m_pServerFont[0]) - return NULL; - return !m_pServerFont[0]->GetFontLayoutCapabilities(rGetImplFontLayoutCapabilities); + return false; + return m_pServerFont[0]->GetFontCapabilities(rFontCapabilities); } USHORT PspGraphics::SetFont( ImplFontSelectData *pEntry, int nFallbackLevel ) diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx index 351d23f9033d..1b805cb2a765 100644 --- a/vcl/unx/source/gdi/salgdi3.cxx +++ b/vcl/unx/source/gdi/salgdi3.cxx @@ -1476,11 +1476,11 @@ ImplFontCharMap* X11SalGraphics::GetImplFontCharMap() const return new ImplFontCharMap( aCmapResult ); } -bool X11SalGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const +bool X11SalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rGetImplFontCapabilities) const { if (!mpServerFont[0]) - return NULL; - return !mpServerFont[0]->GetFontLayoutCapabilities(rGetImplFontLayoutCapabilities); + return false; + return mpServerFont[0]->GetFontCapabilities(rGetImplFontCapabilities); } // ---------------------------------------------------------------------------- diff --git a/vcl/win/inc/salgdi.h b/vcl/win/inc/salgdi.h index dc84bd7eee54..91516ee361d7 100644 --- a/vcl/win/inc/salgdi.h +++ b/vcl/win/inc/salgdi.h @@ -84,7 +84,7 @@ public: #endif ImplFontCharMap* GetImplFontCharMap() const; - bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + bool GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; const Ucs2SIntMap* GetEncodingVector() const { return mpEncodingVector; } void SetEncodingVector( const Ucs2SIntMap* pNewVec ) const { @@ -103,10 +103,10 @@ private: mutable bool mbHasGraphiteSupport; #endif mutable bool mbHasArabicSupport; - mutable bool mbFontLayoutCapabilitiesRead; + mutable bool mbFontCapabilitiesRead; mutable ImplFontCharMap* mpUnicodeMap; mutable const Ucs2SIntMap* mpEncodingVector; - mutable FontLayoutCapabilities maFontLayoutCapabilities; + mutable vcl::FontCapabilities maFontCapabilities; // TODO: get rid of the members below needed to work with the Win9x non-unicode API BYTE* mpFontCharSets; // all Charsets for the current font (used on W98 for kerning) @@ -117,7 +117,7 @@ private: bool mbAliasSymbolsLow; private: void ReadCmapTable( HDC ) const; - void GetFontLayoutCapabilities( HDC hDC ) const; + void GetFontCapabilities( HDC hDC ) const; void ReadOs2Table( HDC ) const; #ifdef GNG_VERT_HACK @@ -294,7 +294,7 @@ public: // get the repertoire of the current font virtual ImplFontCharMap* GetImplFontCharMap() const; // get the layout capabilities of the current font - virtual bool GetImplFontLayoutCapabilities(FontLayoutCapabilities &rGetImplFontLayoutCapabilities) const; + virtual bool GetImplFontCapabilities(vcl::FontCapabilities &rGetFontCapabilities) const; // graphics must fill supplied font list virtual void GetDevFontList( ImplDevFontList* ); // graphics should call ImplAddDevFontSubstitute on supplied diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx index a230e495d756..1c19ce7bc614 100644 --- a/vcl/win/source/gdi/salgdi3.cxx +++ b/vcl/win/source/gdi/salgdi3.cxx @@ -1107,7 +1107,7 @@ ImplWinFontData::ImplWinFontData( const ImplDevFontAttributes& rDFS, mbHasGraphiteSupport( false ), #endif mbHasArabicSupport ( false ), - mbFontLayoutCapabilitiesRead( false ), + mbFontCapabilitiesRead( false ), mbAliasSymbolsLow( false ), mbAliasSymbolsHigh( false ), mnId( 0 ), @@ -1209,10 +1209,10 @@ ImplFontCharMap* ImplWinFontData::GetImplFontCharMap() const return mpUnicodeMap; } -bool ImplWinFontData::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities) const +bool ImplWinFontData::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { - rFontLayoutCapabilities = maFontLayoutCapabilities; - return !rFontLayoutCapabilities.empty(); + rFontCapabilities = maFontCapabilities; + return !rFontCapabilities.maUnicodeRange.empty() || !rFontCapabilities.maCodePageRange.empty(); } // ----------------------------------------------------------------------- @@ -1319,25 +1319,36 @@ void ImplWinFontData::ReadCmapTable( HDC hDC ) const mpUnicodeMap = ImplFontCharMap::GetDefaultMap( bIsSymbolFont ); } -void ImplWinFontData::GetFontLayoutCapabilities( HDC hDC ) const +void ImplWinFontData::GetFontCapabilities( HDC hDC ) const { // read this only once per font - if( mbFontLayoutCapabilitiesRead ) + if( mbFontCapabilitiesRead ) return; - mbFontLayoutCapabilitiesRead = true; + mbFontCapabilitiesRead = true; - // check the existence of a GSUB table + // GSUB table + DWORD nLength; const DWORD GsubTag = CalcTag( "GSUB" ); - DWORD nLength = ::GetFontData( hDC, GsubTag, 0, NULL, 0 ); - if( (nLength == GDI_ERROR) || !nLength ) - return; - - std::vector<unsigned char> aTable( nLength ); - unsigned char* pTable = &aTable[0]; - ::GetFontData( hDC, GsubTag, 0, pTable, nLength ); + nLength = ::GetFontData( hDC, GsubTag, 0, NULL, 0 ); + if( (nLength != GDI_ERROR) & nLength ) + { + std::vector<unsigned char> aTable( nLength ); + unsigned char* pTable = &aTable[0]; + ::GetFontData( hDC, GsubTag, 0, pTable, nLength ); + vcl::getTTScripts(maFontCapabilities.maGSUBScriptTags, pTable, nLength); + } - vcl::getTTFontLayoutCapabilities(maFontLayoutCapabilities, pTable); + // OS/2 table + const DWORD OS2Tag = CalcTag( "OS/2" ); + nLength = ::GetFontData( hDC, OS2Tag, 0, NULL, 0 ); + if( (nLength != GDI_ERROR) & nLength ) + { + std::vector<unsigned char> aTable( nLength ); + unsigned char* pTable = &aTable[0]; + ::GetFontData( hDC, OS2Tag, 0, pTable, nLength ); + vcl::getTTCoverage(maFontCapabilities.maUnicodeRange, maFontCapabilities.maCodePageRange, pTable, nLength); + } } // ======================================================================= @@ -1882,11 +1893,11 @@ ImplFontCharMap* WinSalGraphics::GetImplFontCharMap() const return mpWinFontData[0]->GetImplFontCharMap(); } -bool WinSalGraphics::GetImplFontLayoutCapabilities(FontLayoutCapabilities &rFontLayoutCapabilities) const +bool WinSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { if( !mpWinFontData[0] ) return false; - return mpWinFontData[0]->GetImplFontLayoutCapabilities(rFontLayoutCapabilities); + return mpWinFontData[0]->GetImplFontCapabilities(rFontCapabilities); } // ----------------------------------------------------------------------- |