summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2019-09-03 14:40:42 +0200
committerKhaled Hosny <khaledhosny@eglug.org>2019-09-11 12:40:33 +0200
commitac9d7d4157813fcf43dd41043981c4bb27d2cc33 (patch)
tree597ec10353b7f08a6aa26c6e71d713fcf05d98b3
parentDrop SalGraphics::GetGlyphWidths() (diff)
downloadcore-private/khaledhosny/vcl-cleanup-font.tar.gz
core-private/khaledhosny/vcl-cleanup-font.zip
Consolidate GetFontCapabilities() private/khaledhosny/vcl-cleanup-font
All implementations were basically doing the same thing. Move to PhysicalFontFace and use HarfBuzz API to get the raw OpeenType table data. Change-Id: Ia5ac0d1ba6299f86e90e1b0dac34ba7672855ec0
-rw-r--r--vcl/inc/PhysicalFontFace.hxx4
-rw-r--r--vcl/inc/qt5/Qt5FontFace.hxx4
-rw-r--r--vcl/inc/quartz/salgdi.h4
-rw-r--r--vcl/inc/unx/glyphcache.hxx1
-rw-r--r--vcl/inc/win/salgdi.h8
-rw-r--r--vcl/qt5/Qt5FontFace.cxx26
-rw-r--r--vcl/qt5/Qt5Graphics_Text.cxx3
-rw-r--r--vcl/quartz/salgdi.cxx32
-rw-r--r--vcl/source/font/PhysicalFontFace.cxx28
-rw-r--r--vcl/unx/generic/gdi/cairotextrender.cxx2
-rw-r--r--vcl/unx/generic/glyphs/freetype_glyphcache.cxx19
-rw-r--r--vcl/unx/generic/print/genpspgraphics.cxx2
-rw-r--r--vcl/win/gdi/salfont.cxx30
13 files changed, 37 insertions, 126 deletions
diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 3992bb91bf41..679420a05fd1 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -22,6 +22,7 @@
#include <hb.h>
+#include <vcl/fontcapabilities.hxx>
#include <salhelper/simplereferenceobject.hxx>
#include <rtl/ref.hxx>
#include <vcl/dllapi.h>
@@ -70,6 +71,7 @@ public:
sal_Int32 CompareIgnoreSize( const PhysicalFontFace& ) const;
const FontCharMapRef& GetCharMap() const;
+ bool GetCapabilities(vcl::FontCapabilities &rCapabilities) const;
hb_face_t* GetHbFace() const;
virtual hb_blob_t* GetHbTable(hb_tag_t nTag) const = 0;
@@ -84,6 +86,8 @@ protected:
mutable hb_face_t* mpHbFace;
mutable FontCharMapRef mxCharMap;
+ mutable bool mbCapabilitiesRead;
+ mutable vcl::FontCapabilities maCapabilities;
};
#endif // INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
diff --git a/vcl/inc/qt5/Qt5FontFace.hxx b/vcl/inc/qt5/Qt5FontFace.hxx
index a179438cf2a5..03884fc31df9 100644
--- a/vcl/inc/qt5/Qt5FontFace.hxx
+++ b/vcl/inc/qt5/Qt5FontFace.hxx
@@ -42,8 +42,6 @@ public:
int GetFontTable(const char pTagName[5], unsigned char*) const;
- bool GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities) const;
-
rtl::Reference<LogicalFontInstance>
CreateFontInstance(const FontSelectPattern& rFSD) const override;
@@ -55,8 +53,6 @@ protected:
private:
const QString m_aFontId;
- mutable vcl::FontCapabilities m_aFontCapabilities;
- mutable bool m_bFontCapabilitiesRead;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 3be470f0caf6..540d695a3a11 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -67,16 +67,12 @@ public:
int GetFontTable( uint32_t nTagCode, unsigned char* ) const;
int GetFontTable( const char pTagName[5], unsigned char* ) const;
- bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
-
rtl::Reference<LogicalFontInstance> CreateFontInstance(const FontSelectPattern&) const override;
hb_blob_t* GetHbTable(hb_tag_t nTag) const override;
private:
const sal_IntPtr mnFontId;
- mutable vcl::FontCapabilities maFontCapabilities;
- mutable bool mbFontCapabilitiesRead;
};
class CoreTextStyle final : public LogicalFontInstance
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index c072752db6a7..12800ae0458c 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -107,7 +107,6 @@ public:
void GetFontMetric(ImplFontMetricDataRef const &) const;
const unsigned char* GetTable( const char* pName, sal_uLong* pLength ) const;
- bool GetFontCapabilities(vcl::FontCapabilities &) const;
bool GetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool) const;
bool GetGlyphOutline(sal_GlyphId, basegfx::B2DPolyPolygon&, bool) const;
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 0cc2fd05ba2d..5eeb0747c253 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -71,24 +71,16 @@ public:
BYTE GetCharSet() const { return meWinCharSet; }
BYTE GetPitchAndFamily() const { return mnPitchAndFamily; }
- bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
-
hb_blob_t* GetHbTable(hb_tag_t nTag) const override;
private:
sal_IntPtr mnId;
- // some members that are initialized lazily when the font gets selected into a HDC
- mutable bool mbFontCapabilitiesRead;
- mutable vcl::FontCapabilities maFontCapabilities;
-
BYTE meWinCharSet;
BYTE mnPitchAndFamily;
bool mbAliasSymbolsHigh;
bool mbAliasSymbolsLow;
- void GetFontCapabilities( HDC hDC ) const;
-
mutable HDC mhDC;
};
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index 4c4bbb7ef6de..dcf7cbf6611c 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -128,7 +128,6 @@ Qt5FontFace* Qt5FontFace::fromQFontDatabase(const QString& aFamily, const QStrin
Qt5FontFace::Qt5FontFace(const FontAttributes& rFA, const QString& rFontID)
: PhysicalFontFace(rFA)
, m_aFontId(rFontID)
- , m_bFontCapabilitiesRead(false)
{
}
@@ -140,31 +139,6 @@ Qt5FontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
return new Qt5Font(*this, rFSD);
}
-bool Qt5FontFace::GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities) const
-{
- // read this only once per font
- if (m_bFontCapabilitiesRead)
- {
- rFontCapabilities = m_aFontCapabilities;
- return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
- }
- m_bFontCapabilitiesRead = true;
-
- QFont aFont;
- aFont.fromString(m_aFontId);
- QRawFont aRawFont(QRawFont::fromFont(aFont));
- QByteArray aOS2Table = aRawFont.fontTable("OS/2");
- if (!aOS2Table.isEmpty())
- {
- vcl::getTTCoverage(m_aFontCapabilities.oUnicodeRange, m_aFontCapabilities.oCodePageRange,
- reinterpret_cast<const unsigned char*>(aOS2Table.data()),
- aOS2Table.size());
- }
-
- rFontCapabilities = m_aFontCapabilities;
- return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
-}
-
hb_blob_t* Qt5FontFace::GetHbTable(hb_tag_t nTag) const
{
char pName[5];
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 63072b1ed740..13a559214218 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -78,8 +78,7 @@ bool Qt5Graphics::GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities)
{
if (!m_pTextStyle[0])
return false;
- return static_cast<const Qt5FontFace*>(m_pTextStyle[0]->GetFontFace())
- ->GetFontCapabilities(rFontCapabilities);
+ return m_pTextStyle[0]->GetFontFace()->GetCapabilities(rFontCapabilities);
}
void Qt5Graphics::GetDevFontList(PhysicalFontCollection* pPFC)
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 2bc08551c1cc..de35edf51341 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -99,7 +99,6 @@ bool CoreTextGlyphFallbackSubstititution::FindFontSubstitute(FontSelectPattern&
CoreTextFontFace::CoreTextFontFace( const FontAttributes& rDFA, sal_IntPtr nFontId )
: PhysicalFontFace( rDFA )
, mnFontId( nFontId )
- , mbFontCapabilitiesRead( false )
{
}
@@ -112,35 +111,6 @@ sal_IntPtr CoreTextFontFace::GetFontId() const
return mnFontId;
}
-bool CoreTextFontFace::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const
-{
- // read this only once per font
- if( mbFontCapabilitiesRead )
- {
- rFontCapabilities = maFontCapabilities;
- return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
- }
- mbFontCapabilitiesRead = true;
-
- int nBufSize = GetFontTable( "OS/2", nullptr );
- if( nBufSize > 0 )
- {
- // allocate a buffer for the OS/2 raw data
- std::vector<unsigned char> aBuffer( nBufSize );
- // get the OS/2 raw data
- const int nRawLength = GetFontTable( "OS/2", aBuffer.data() );
- if( nRawLength > 0 )
- {
- const unsigned char* pOS2Table = aBuffer.data();
- vcl::getTTCoverage( maFontCapabilities.oUnicodeRange,
- maFontCapabilities.oCodePageRange,
- pOS2Table, nRawLength);
- }
- }
- rFontCapabilities = maFontCapabilities;
- return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
-}
-
AquaSalGraphics::AquaSalGraphics()
: mpXorEmulation( nullptr )
, mnXorMode( 0 )
@@ -483,7 +453,7 @@ bool AquaSalGraphics::GetFontCapabilities(vcl::FontCapabilities &rFontCapabiliti
if (!mpTextStyle[0])
return false;
- return static_cast<const CoreTextFontFace*>(mpTextStyle[0]->GetFontFace())->GetFontCapabilities(rFontCapabilities);
+ return mpTextStyle[0]->GetFontFace()->GetCapabilities(rFontCapabilities);
}
// fake a SFNT font directory entry for a font table
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index 997b1c155160..305a06a4edcf 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -27,6 +27,7 @@
#include <fontselect.hxx>
#include <impfontcharmap.hxx>
+#include <sft.hxx>
#include <PhysicalFontFace.hxx>
PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
@@ -34,6 +35,7 @@ PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
, mnWidth(0)
, mnHeight(0)
, mpHbFace(nullptr)
+ , mbCapabilitiesRead(false)
{
// StarSymbol is a unicode font, but it still deserves the symbol flag
if( !IsSymbolFont() )
@@ -248,4 +250,30 @@ const FontCharMapRef& PhysicalFontFace::GetCharMap() const
return mxCharMap;
}
+bool PhysicalFontFace::GetCapabilities(vcl::FontCapabilities &rCapabilities) const
+{
+ // Read this only once.
+ if (mbCapabilitiesRead)
+ {
+ rCapabilities = maCapabilities;
+ return rCapabilities.oUnicodeRange || rCapabilities.oCodePageRange;
+ }
+
+ mbCapabilitiesRead = true;
+
+ hb_blob_t* pBlob = hb_face_reference_table(mpHbFace, HB_TAG('O', 'S', '/', '2'));
+ const unsigned char* pData = reinterpret_cast<const unsigned char*>(hb_blob_get_data(pBlob, nullptr));
+ size_t nSize = hb_blob_get_length(pBlob);
+ if (nSize > 0)
+ {
+ vcl::getTTCoverage(maCapabilities.oUnicodeRange,
+ maCapabilities.oCodePageRange,
+ pData, nSize);
+ }
+ hb_blob_destroy(pBlob);
+
+ rCapabilities = maCapabilities;
+ return rCapabilities.oUnicodeRange || rCapabilities.oCodePageRange;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index cc63b05ad394..410ff9366cdc 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -378,7 +378,7 @@ bool CairoTextRender::GetFontCapabilities(vcl::FontCapabilities &rGetImplFontCap
{
if (!mpFreetypeFont[0])
return false;
- return mpFreetypeFont[0]->GetFontCapabilities(rGetImplFontCapabilities);
+ return mpFreetypeFont[0]->GetFontInstance()->GetFontFace()->GetCapabilities(rGetImplFontCapabilities);
}
// SalGraphics
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index d52da62da4c0..fda97f4a0c87 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -706,25 +706,6 @@ bool FreetypeFont::GetAntialiasAdvice() const
return !mpFontInstance->GetFontSelectPattern().mbNonAntialiased && (mnPrioAntiAlias > 0);
}
-bool FreetypeFont::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const
-{
- bool bRet = false;
-
- sal_uLong nLength = 0;
-
- // load OS/2 table
- const FT_Byte* pOS2 = mpFontInfo->GetTable("OS/2", &nLength);
- if (pOS2)
- {
- bRet = vcl::getTTCoverage(
- rFontCapabilities.oUnicodeRange,
- rFontCapabilities.oCodePageRange,
- pOS2, nLength);
- }
-
- return bRet;
-}
-
// outline stuff
class PolyArgs
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index a8a08f263ab3..e7e3cce5c17a 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -614,7 +614,7 @@ bool GenPspGraphics::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilitie
{
if (!m_pFreetypeFont[0])
return false;
- return m_pFreetypeFont[0]->GetFontCapabilities(rFontCapabilities);
+ return m_pFreetypeFont[0]->GetFontInstance()->GetFontFace()->GetCapabilities(rFontCapabilities);
}
void GenPspGraphics::SetFont(LogicalFontInstance *pFontInstance, int nFallbackLevel)
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index f9b7646bdd7f..ddd4599c3b82 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -585,7 +585,6 @@ WinFontFace::WinFontFace( const FontAttributes& rDFS,
BYTE eWinCharSet, BYTE nPitchAndFamily )
: PhysicalFontFace( rDFS ),
mnId( 0 ),
- mbFontCapabilitiesRead( false ),
meWinCharSet( eWinCharSet ),
mnPitchAndFamily( nPitchAndFamily ),
mbAliasSymbolsHigh( false ),
@@ -656,33 +655,6 @@ void WinFontFace::UpdateFromHDC( HDC hDC ) const
return;
mhDC = hDC;
- GetFontCapabilities( hDC );
-}
-
-bool WinFontFace::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const
-{
- rFontCapabilities = maFontCapabilities;
- return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
-}
-
-void WinFontFace::GetFontCapabilities( HDC hDC ) const
-{
- // read this only once per font
- if( mbFontCapabilitiesRead )
- return;
-
- mbFontCapabilitiesRead = true;
-
- // OS/2 table
- const DWORD OS2Tag = CalcTag( "OS/2" );
- DWORD nLength = ::GetFontData( hDC, OS2Tag, 0, nullptr, 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.oUnicodeRange, maFontCapabilities.oCodePageRange, pTable, nLength);
- }
}
void WinSalGraphics::SetTextColor( Color nColor )
@@ -949,7 +921,7 @@ bool WinSalGraphics::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilitie
{
if (!mpWinFontEntry[0])
return false;
- return mpWinFontEntry[0]->GetFontFace()->GetFontCapabilities(rFontCapabilities);
+ return mpWinFontEntry[0]->GetFontFace()->GetCapabilities(rFontCapabilities);
}
static int CALLBACK SalEnumFontsProcExW( const LOGFONTW* lpelfe,