summaryrefslogtreecommitdiffstats
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-02-28 16:57:28 +0000
committerCaolán McNamara <caolanm@redhat.com>2011-03-01 20:38:55 +0000
commitb610ea59875a876712b1c57702eae615e424267a (patch)
treeea8132eee89bdb2078fb81707d758f20e4bbc307 /vcl
parentconst static data (diff)
downloadcore-b610ea59875a876712b1c57702eae615e424267a.tar.gz
core-b610ea59875a876712b1c57702eae615e424267a.zip
Get better hints as to what script a font is likely tuned for
Diffstat (limited to 'vcl')
-rw-r--r--vcl/aqua/inc/salgdi.h8
-rw-r--r--vcl/aqua/source/gdi/salgdi.cxx68
-rw-r--r--vcl/inc/sft.hxx8
-rw-r--r--vcl/inc/vcl/glyphcache.hxx7
-rw-r--r--vcl/inc/vcl/outdev.hxx5
-rw-r--r--vcl/inc/vcl/salgdi.hxx2
-rw-r--r--vcl/prj/d.lst1
-rw-r--r--vcl/source/fontsubset/gsub.cxx18
-rw-r--r--vcl/source/fontsubset/sft.cxx48
-rw-r--r--vcl/source/gdi/outdev3.cxx6
-rw-r--r--vcl/source/glyphs/gcach_ftyp.cxx32
-rw-r--r--vcl/source/glyphs/gcach_ftyp.hxx2
-rw-r--r--vcl/unx/headless/svpgdi.hxx2
-rw-r--r--vcl/unx/headless/svppspgraphics.cxx6
-rw-r--r--vcl/unx/headless/svppspgraphics.hxx2
-rw-r--r--vcl/unx/headless/svptext.cxx6
-rw-r--r--vcl/unx/inc/pspgraphics.h2
-rw-r--r--vcl/unx/inc/salgdi.h2
-rw-r--r--vcl/unx/source/gdi/pspgraphics.cxx6
-rw-r--r--vcl/unx/source/gdi/salgdi3.cxx6
-rw-r--r--vcl/win/inc/salgdi.h10
-rw-r--r--vcl/win/source/gdi/salgdi3.cxx47
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);
}
// -----------------------------------------------------------------------