diff options
-rw-r--r-- | vcl/inc/PhysicalFontFace.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/qt5/Qt5FontFace.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/quartz/salgdi.h | 4 | ||||
-rw-r--r-- | vcl/inc/unx/glyphcache.hxx | 1 | ||||
-rw-r--r-- | vcl/inc/win/salgdi.h | 8 | ||||
-rw-r--r-- | vcl/qt5/Qt5FontFace.cxx | 26 | ||||
-rw-r--r-- | vcl/qt5/Qt5Graphics_Text.cxx | 3 | ||||
-rw-r--r-- | vcl/quartz/salgdi.cxx | 32 | ||||
-rw-r--r-- | vcl/source/font/PhysicalFontFace.cxx | 28 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/cairotextrender.cxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/glyphs/freetype_glyphcache.cxx | 19 | ||||
-rw-r--r-- | vcl/unx/generic/print/genpspgraphics.cxx | 2 | ||||
-rw-r--r-- | vcl/win/gdi/salfont.cxx | 30 |
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, |