[Libreoffice-commits] core.git: Branch 'private/khaledhosny/vcl-cleanup-font' - 161 commits - accessibility/source android/source basic/inc basic/qa basic/source bin/update_pch chart2/qa chart2/source comphelper/source compilerplugins/clang compilerplugins/Makefile-clang.mk config_host.mk.in configure.ac connectivity/source cppu/source cpputools/Executable_uno.mk cui/source cui/uiconfig dbaccess/Executable_odbcconfig.mk dbaccess/inc dbaccess/Library_dbmm.mk dbaccess/Module_dbaccess.mk dbaccess/qa dbaccess/source dbaccess/uiconfig dbaccess/UIConfig_dbaccess.mk desktop/Executable_minidump_upload.mk desktop/Executable_quickstart.mk desktop/Executable_sbase.mk desktop/Executable_scalc.mk desktop/Executable_sdraw.mk desktop/Executable_simpress.mk desktop/Executable_smath.mk desktop/Executable_soffice_bin.mk desktop/Executable_soffice_com.mk desktop/Executable_soffice_exe.mk desktop/Executable_sweb.mk desktop/Executable_swriter.mk desktop/Executable_unoinfo.mk desktop/Executable_unopkg_bin.mk desktop/E xecutable_unopkg_com.mk desktop/Executable_unopkg.mk desktop/source desktop/util desktop/win32 desktop/WinResTarget_sbase.mk desktop/WinResTarget_scalc.mk desktop/WinResTarget_sdraw.mk desktop/WinResTarget_simpress.mk desktop/WinResTarget_smath.mk desktop/WinResTarget_sofficebin.mk desktop/WinResTarget_soffice.mk desktop/WinResTarget_sweb.mk desktop/WinResTarget_swriter.mk download.lst drawinglayer/source editeng/inc editeng/Library_editeng.mk editeng/source extensions/Executable_twain32shim.mk extensions/source extensions/uiconfig external/gpgmepp external/liborcus extras/source filter/source formula/source formula/uiconfig framework/inc framework/source helpcontent2 i18nlangtag/source i18npool/source idlc/inc include/basic include/com include/comphelper include/cppuhelper include/editeng include/i18nlangtag include/oox include/osl include/registry include/rtl include/sal include/sfx2 include/store include/svtools include/svx include/tools include/typelib include/uno include/unotoo ls include/vcl include/xmloff instsetoo_native/inc_openoffice ios/CustomTarget_iOS_setup.mk io/source lingucomponent/source linguistic/source lotuswordpro/source m4/l_atomic.m4 o3tl/qa odk/examples offapi/com offapi/UnoApi_offapi.mk officecfg/registry oox/inc oox/source opencl/Executable_opencltest.mk postprocess/Rdb_services.mk pyuno/Executable_python.mk pyuno/inc qadevOOo/tests registry/Executable_regmerge.mk registry/Executable_regview.mk reportbuilder/java reportdesign/source Repository.mk sal/Library_sal.mk sal/osl sax/source sc/inc scp2/AutoInstall.mk scp2/InstallModule_spsupp.mk scp2/InstallScript_setup_osl.mk scp2/Module_scp2.mk scp2/source sc/qa scripting/java sc/source sc/uiconfig sc/UIConfig_scalc.mk sdext/Executable_xpdfimport.mk sd/qa sd/sdi sd/source sfx2/classification sfx2/source shell/Executable_senddoc.mk shell/Executable_spsupp_helper.mk shell/source slideshow/source solenv/bin solenv/clang-format solenv/CompilerTest_compilerplugins_clang.mk solenv/gbuild solenv/s anitizers soltools/cpp sot/source starmath/source stoc/source svl/source svtools/Library_svt.mk svtools/source svx/Executable_gengal.mk svx/inc svx/Library_svx.mk svx/source sw/inc sw/qa sw/source sysui/desktop toolkit/source tools/qa tools/source ucb/source unotools/source vcl/Executable_ui-previewer.mk vcl/headless vcl/inc vcl/Library_vcl.mk vcl/qa vcl/qt5 vcl/quartz vcl/source vcl/StaticLibrary_fuzzerstubs.mk vcl/unx vcl/win vcl/workben winaccessibility/source wizards/com writerfilter/source writerperfect/inc writerperfect/source xmloff/inc xmloff/source xmloff/util

Tue, 03 Sep 2019 07:35:55 -0700

Rebased ref, commits from common ancestor:
commit 5b241d21b737d4f91ae4eb491b5c0d8c4043a055
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Tue Sep 3 14:40:42 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:34:40 2019 +0200

    Consolidate GetFontCapabilities()
    
    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

diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 35cbf923665d..944ecceee303 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 { return mpHbFace; }
     virtual hb_blob_t*      GetHbTable(const char* pName) = 0;
@@ -84,6 +86,8 @@ protected:
     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 14da580393d8..d57e5e450977 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 fa4e6e780a47..540a4acd2d9f 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(const char* pName) override;
 
 private:
     const sal_IntPtr                mnFontId;
-    mutable vcl::FontCapabilities   maFontCapabilities;
-    mutable bool                    mbFontCapabilitiesRead;
 };
 
 class CoreTextStyle final : public LogicalFontInstance
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index fb2f4deac56d..04dcc4738db8 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(const char* pName) 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;
-
     HDC                     mhDC;
 };
 
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index ea7770bf78a3..a7af63a4018e 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -130,7 +130,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)
 {
 }
 
@@ -142,31 +141,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(const char* pName)
 {
     QFont aFont;
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 83dea5afe8cd..1e5394561d64 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>
 
 namespace {
@@ -57,6 +58,7 @@ PhysicalFontFace::PhysicalFontFace( const FontAttributes& 
rDFA )
     : FontAttributes( rDFA )
     , mnWidth(0)
     , mnHeight(0)
+    , mbCapabilitiesRead(false)
 {
     // StarSymbol is a unicode font, but it still deserves the symbol flag
     if( !IsSymbolFont() )
@@ -257,4 +259,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/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index d33b80d8e6ee..5217fcf222b1 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -689,21 +689,7 @@ FontCharMapRef FreetypeFont::GetFontCharMap() const
 
 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;
+    return mpFontInstance->GetFontFace()->GetCapabilities(rFontCapabilities);
 }
 
 // outline stuff
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index b4ca78be9045..40012a2aa4c2 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 ),
@@ -657,33 +656,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 )
@@ -950,7 +922,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,
commit 7ba2c114309e37f815a709251f4abee349cfe6d9
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Tue Sep 3 13:21:50 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:34:39 2019 +0200

    Drop SalGraphics::GetGlyphWidths()
    
    It was used only on two places. One use is replaced with a new
    LogicalFontInstance::GetGlyphWidth() (backed by HarfBuzz font) and the
    other is replaced by getting glyph widths while subsetting the font.
    
    PDFFontCache is now unused, so dropped as well.
    
    Change-Id: I9741f17c0a5626faa952dd0d417cc786cbc877cd

diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index c8e4aa75dccb..71d3c9d8fe64 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -295,7 +295,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/source/gdi/oldprintadaptor \
     vcl/source/gdi/pdfbuildin_fonts \
     vcl/source/gdi/pdfextoutdevdata \
-    vcl/source/gdi/pdffontcache \
     vcl/source/gdi/pdfwriter \
     vcl/source/gdi/pdfwriter_impl2 \
     vcl/source/gdi/pdfwriter_impl \
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index e4b625b365cb..36e515b18518 100644
--- a/vcl/headless/svptext.cxx
+++ b/vcl/headless/svptext.cxx
@@ -84,14 +84,6 @@ void SvpSalGraphics::FreeEmbedFontData( const void* pData, 
long nLen )
     m_aTextRenderImpl.FreeEmbedFontData(pData, nLen);
 }
 
-void SvpSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
-                                   bool bVertical,
-                                   std::vector< sal_Int32 >& rWidths,
-                                   Ucs2UIntMap& rUnicodeEnc )
-{
-    m_aTextRenderImpl.GetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
-}
-
 std::unique_ptr<GenericSalLayout> SvpSalGraphics::GetTextLayout(int 
nFallbackLevel)
 {
     if (utl::ConfigManager::IsFuzzing())
diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx
index 5e234df72e0c..423dbe9fb7d0 100644
--- a/vcl/inc/fontinstance.hxx
+++ b/vcl/inc/fontinstance.hxx
@@ -71,6 +71,7 @@ public: // TODO: make data members private
     const PhysicalFontFace* GetFontFace() const { return m_pFontFace.get(); }
     const ImplFontCache* GetFontCache() const { return mpFontCache; }
 
+    double GetGlyphWidth(sal_GlyphId, bool, bool);
     bool GetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool);
     virtual bool GetGlyphOutline(sal_GlyphId, basegfx::B2DPolyPolygon&, bool) 
const = 0;
 
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index b0e4aac4adad..a132c17a26e8 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -188,10 +188,6 @@ public:
                                               ) override;
     virtual const void*     GetEmbedFontData(const PhysicalFontFace*, long* 
pDataLen) override;
     virtual void            FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
-    virtual void            GetGlyphWidths( const PhysicalFontFace*,
-                                            bool bVertical,
-                                            std::vector< sal_Int32 >& rWidths,
-                                            Ucs2UIntMap& rUnicodeEnc ) 
override;
     virtual std::unique_ptr<GenericSalLayout>
                             GetTextLayout(int nFallbackLevel) override;
     virtual void            DrawTextLayout( const GenericSalLayout& ) override;
diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx
index b379674548d5..d84bff77e662 100644
--- a/vcl/inc/impglyphitem.hxx
+++ b/vcl/inc/impglyphitem.hxx
@@ -90,6 +90,7 @@ public:
     inline bool GetGlyphBoundRect(tools::Rectangle&) const;
     inline bool GetGlyphOutline(basegfx::B2DPolyPolygon&) const;
     inline void dropGlyph();
+    inline double nativeWidth(bool bPS) const; // Unshaped width from the font.
 
     sal_GlyphId glyphId() const { return m_aGlyphId; }
     int charCount() const { return m_nCharCount; }
@@ -114,6 +115,11 @@ void GlyphItem::dropGlyph()
     m_nFlags |= GlyphItemFlags::IS_DROPPED;
 }
 
+double GlyphItem::nativeWidth(bool bPS) const
+{
+    return m_pFontInstance->GetGlyphWidth(m_aGlyphId, IsVertical(), bPS);
+}
+
 class SalLayoutGlyphsImpl : public std::vector<GlyphItem>
 {
     friend class GenericSalLayout;
diff --git a/vcl/inc/qt5/Qt5Graphics.hxx b/vcl/inc/qt5/Qt5Graphics.hxx
index a7c7aaa727ac..7d6cb63a4a77 100644
--- a/vcl/inc/qt5/Qt5Graphics.hxx
+++ b/vcl/inc/qt5/Qt5Graphics.hxx
@@ -192,9 +192,6 @@ public:
     virtual const void* GetEmbedFontData(const PhysicalFontFace*, long* 
pDataLen) override;
     virtual void FreeEmbedFontData(const void* pData, long nDataLen) override;
 
-    virtual void GetGlyphWidths(const PhysicalFontFace*, bool bVertical,
-                                std::vector<sal_Int32>& rWidths, Ucs2UIntMap& 
rUnicodeEnc) override;
-
     virtual std::unique_ptr<GenericSalLayout> GetTextLayout(int 
nFallbackLevel) override;
     virtual void DrawTextLayout(const GenericSalLayout&) override;
 };
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index a70572e2dc08..fa4e6e780a47 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -377,11 +377,6 @@ public:
     // frees the font data again
     virtual void            FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
 
-    virtual void            GetGlyphWidths( const PhysicalFontFace*,
-                                            bool bVertical,
-                                            std::vector< sal_Int32 >& rWidths,
-                                            Ucs2UIntMap& rUnicodeEnc ) 
override;
-
     virtual std::unique_ptr<GenericSalLayout>
                             GetTextLayout(int nFallbackLevel) override;
     virtual void            DrawTextLayout( const GenericSalLayout& ) override;
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index a504fb9fa071..8e7a3d3c153f 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -30,7 +30,6 @@
 
 #include <config_cairo_canvas.h>
 
-#include <map>
 #include <vector>
 
 class PhysicalFontCollection;
@@ -58,7 +57,6 @@ namespace basegfx {
 }
 
 typedef sal_Unicode sal_Ucs; // TODO: use sal_UCS4 instead of sal_Unicode
-typedef std::map< sal_Ucs, sal_uInt32 >   Ucs2UIntMap;
 
 // note: if you add any new methods to class SalGraphics using coordinates
 //       make sure they have a corresponding protected pure virtual method
@@ -179,16 +177,6 @@ public:
     // free the font data again
     virtual void                FreeEmbedFontData( const void* pData, long 
nDataLen ) = 0;
 
-    // get the same widths as in CreateFontSubset
-    // in case of an embeddable font also fill the mapping
-    // between unicode and glyph id
-    // leave widths vector and mapping untouched in case of failure
-    virtual void                GetGlyphWidths(
-                                    const PhysicalFontFace* pFont,
-                                    bool bVertical,
-                                    std::vector< sal_Int32 >& rWidths,
-                                    Ucs2UIntMap& rUnicodeEnc ) = 0;
-
     virtual std::unique_ptr<GenericSalLayout>
                                 GetTextLayout(int nFallbackLevel) = 0;
     virtual void                DrawTextLayout( const GenericSalLayout& ) = 0;
diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx
index 742d8445299b..7484a92c48a8 100644
--- a/vcl/inc/textrender.hxx
+++ b/vcl/inc/textrender.hxx
@@ -53,11 +53,6 @@ public:
 
     virtual const void*             GetEmbedFontData(const PhysicalFontFace*, 
long* pDataLen) = 0;
     virtual void                    FreeEmbedFontData( const void* pData, long 
nDataLen ) = 0;
-    virtual void                    GetGlyphWidths(
-                                        const PhysicalFontFace*,
-                                        bool bVertical,
-                                        std::vector< sal_Int32 >& rWidths,
-                                        Ucs2UIntMap& rUnicodeEnc ) = 0;
 
     virtual std::unique_ptr<GenericSalLayout>
                                     GetTextLayout(int nFallbackLevel) = 0;
diff --git a/vcl/inc/unx/cairotextrender.hxx b/vcl/inc/unx/cairotextrender.hxx
index 33b1a622945e..030f10b65de7 100644
--- a/vcl/inc/unx/cairotextrender.hxx
+++ b/vcl/inc/unx/cairotextrender.hxx
@@ -65,11 +65,6 @@ public:
 
     virtual const void*         GetEmbedFontData(const PhysicalFontFace*, 
long* pDataLen) override;
     virtual void                FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
-    virtual void                GetGlyphWidths(
-                                    const PhysicalFontFace*,
-                                    bool bVertical,
-                                    std::vector< sal_Int32 >& rWidths,
-                                    Ucs2UIntMap& rUnicodeEnc ) override;
 
     virtual std::unique_ptr<GenericSalLayout>
                                 GetTextLayout(int nFallbackLevel) override;
diff --git a/vcl/inc/unx/fontmanager.hxx b/vcl/inc/unx/fontmanager.hxx
index 8d388013144a..c20864d6c954 100644
--- a/vcl/inc/unx/fontmanager.hxx
+++ b/vcl/inc/unx/fontmanager.hxx
@@ -42,7 +42,6 @@ class FontSubsetInfo;
 class FontConfigFontOptions;
 class FontSelectPattern;
 class GenericUnixSalData;
-class PhysicalFontFace;
 
 namespace psp {
 class PPDParser;
@@ -272,10 +271,6 @@ public:
                            sal_Int32* pWidths,
                            int nGlyphs
                            );
-    void getGlyphWidths( const PhysicalFontFace* pFace,
-                         bool bVertical,
-                         std::vector< sal_Int32 >& rWidths,
-                         std::map< sal_Unicode, sal_uInt32 >& rUnicodeEnc );
 
     // font administration functions
 
diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h
index 44ca12ebc458..8f64eea4e076 100644
--- a/vcl/inc/unx/genpspgraphics.h
+++ b/vcl/inc/unx/genpspgraphics.h
@@ -55,10 +55,6 @@ public:
     static void             DoFreeEmbedFontData( const void* pData, long nLen 
);
 
     // helper methods for sharing with X11SalGraphics
-    static void             DoGetGlyphWidths( const PhysicalFontFace*,
-                                              bool bVertical,
-                                              std::vector< sal_Int32 >& 
rWidths,
-                                              Ucs2UIntMap& rUnicodeEnc );
 
     static FontAttributes Info2FontAttributes( const psp::FastPrintFontInfo& );
     static void             AnnounceFonts( PhysicalFontCollection*,
@@ -106,10 +102,6 @@ public:
                                               FontSubsetInfo& rInfo ) override;
     virtual const void*     GetEmbedFontData(const PhysicalFontFace*, long* 
pDataLen) override;
     virtual void            FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
-    virtual void            GetGlyphWidths( const PhysicalFontFace*,
-                                            bool bVertical,
-                                            std::vector< sal_Int32 >& rWidths,
-                                            Ucs2UIntMap& rUnicodeEnc ) 
override;
     virtual std::unique_ptr<GenericSalLayout>
                             GetTextLayout(int nFallbackLevel) override;
     virtual void            DrawTextLayout( const GenericSalLayout& ) override;
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index c9a9a5120a82..55bcdb7a8a55 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -135,12 +135,6 @@ public:
     virtual const void*             GetEmbedFontData(const PhysicalFontFace*, 
long* pDataLen) override;
     virtual void                    FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
 
-    virtual void                    GetGlyphWidths(
-                                        const PhysicalFontFace*,
-                                        bool bVertical,
-                                        std::vector< sal_Int32 >& rWidths,
-                                        Ucs2UIntMap& rUnicodeEnc ) override;
-
     virtual std::unique_ptr<GenericSalLayout>
                                     GetTextLayout(int nFallbackLevel) override;
     virtual void                    DrawTextLayout( const GenericSalLayout& ) 
override;
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 2eb008ad1084..fb2f4deac56d 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -370,10 +370,6 @@ public:
     virtual const void* GetEmbedFontData(const PhysicalFontFace*, long* 
pDataLen) override;
     // frees the font data again
     virtual void            FreeEmbedFontData( const void* pData, long 
nDataLen ) override;
-    virtual void            GetGlyphWidths( const PhysicalFontFace*,
-                                            bool bVertical,
-                                            std::vector< sal_Int32 >& rWidths,
-                                            Ucs2UIntMap& rUnicodeEnc ) 
override;
 
     virtual std::unique_ptr<GenericSalLayout>
                             GetTextLayout(int nFallbackLevel) override;
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 73dd374493e7..63072b1ed740 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -144,11 +144,6 @@ const void* Qt5Graphics::GetEmbedFontData(const 
PhysicalFontFace*, long* /*pData
 
 void Qt5Graphics::FreeEmbedFontData(const void* /*pData*/, long /*nDataLen*/) 
{}
 
-void Qt5Graphics::GetGlyphWidths(const PhysicalFontFace* /*pPFF*/, bool 
/*bVertical*/,
-                                 std::vector<sal_Int32>& /*rWidths*/, 
Ucs2UIntMap& /*rUnicodeEnc*/)
-{
-}
-
 class Qt5CommonSalLayout : public GenericSalLayout
 {
 public:
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index fc986eba5806..2bc08551c1cc 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -701,75 +701,6 @@ bool AquaSalGraphics::GetRawFontData( const 
PhysicalFontFace* pFontData,
     return true;
 }
 
-void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool 
bVertical,
-    std::vector< sal_Int32 >& rGlyphWidths, Ucs2UIntMap& rUnicodeEnc )
-{
-    rGlyphWidths.clear();
-    rUnicodeEnc.clear();
-
-    std::vector<unsigned char> aBuffer;
-    if( !GetRawFontData( pFontData, aBuffer, nullptr ) )
-        return;
-
-    // TODO: modernize psprint's horrible fontsubset C-API
-    // this probably only makes sense after the switch to another SCM
-    // that can preserve change history after file renames
-
-    // use the font subsetter to get the widths
-    TrueTypeFont* pSftFont = nullptr;
-    SFErrCodes nRC = ::OpenTTFontBuffer( static_cast<void*>(aBuffer.data()), 
aBuffer.size(), 0, &pSftFont);
-    if( nRC != SFErrCodes::Ok )
-        return;
-
-    const int nGlyphCount = ::GetTTGlyphCount( pSftFont );
-    if( nGlyphCount > 0 )
-    {
-        // get glyph metrics
-        rGlyphWidths.resize(nGlyphCount);
-        std::vector<sal_uInt16> aGlyphIds(nGlyphCount);
-        for( int i = 0; i < nGlyphCount; i++ )
-        {
-            aGlyphIds[i] = static_cast<sal_uInt16>(i);
-        }
-
-        std::unique_ptr<sal_uInt16[]> pGlyphMetrics = 
::GetTTSimpleGlyphMetrics( pSftFont, aGlyphIds.data(),
-                                                                               
nGlyphCount, bVertical );
-        if( pGlyphMetrics )
-        {
-            for( int i = 0; i < nGlyphCount; ++i )
-            {
-                rGlyphWidths[i] = pGlyphMetrics[i];
-            }
-            pGlyphMetrics.reset();
-        }
-
-        rtl::Reference<CoreTextFontFace> rCTFontData(new 
CoreTextFontFace(*pFontData, pFontData->GetFontId()));
-        FontCharMapRef xFCMap = rCTFontData->GetFontCharMap();
-        SAL_WARN_IF( !xFCMap.is() || !xFCMap->GetCharCount(), "vcl", "no 
charmap" );
-
-        // get unicode<->glyph encoding
-        // TODO? avoid sft mapping by using the xFCMap itself
-        int nCharCount = xFCMap->GetCharCount();
-        sal_uInt32 nChar = xFCMap->GetFirstChar();
-        for( ; --nCharCount >= 0; nChar = xFCMap->GetNextChar( nChar ) )
-        {
-            if( nChar > 0xFFFF ) // TODO: allow UTF-32 chars
-                break;
-
-            sal_Ucs nUcsChar = static_cast<sal_Ucs>(nChar);
-            sal_uInt32 nGlyph = ::MapChar( pSftFont, nUcsChar );
-            if( nGlyph > 0 )
-            {
-                rUnicodeEnc[ nUcsChar ] = nGlyph;
-            }
-        }
-
-        xFCMap = nullptr;
-    }
-
-    ::CloseTTFont( pSftFont );
-}
-
 const void* AquaSalGraphics::GetEmbedFontData(const PhysicalFontFace*, long* 
/*pDataLen*/)
 {
     return nullptr;
diff --git a/vcl/source/font/fontinstance.cxx b/vcl/source/font/fontinstance.cxx
index 07aab6c38618..2cc239362f2a 100644
--- a/vcl/source/font/fontinstance.cxx
+++ b/vcl/source/font/fontinstance.cxx
@@ -142,6 +142,22 @@ void LogicalFontInstance::IgnoreFallbackForUnicode( 
sal_UCS4 cChar, FontWeight e
         mpUnicodeFallbackList->erase( it );
 }
 
+double LogicalFontInstance::GetGlyphWidth(sal_GlyphId nID, bool bVertical, 
bool bPS)
+{
+    hb_font_t* pHbFont = GetHbFont();
+    double fWidth;
+    if (bVertical)
+        fWidth = hb_font_get_glyph_v_advance(pHbFont, nID);
+    else
+        fWidth = hb_font_get_glyph_h_advance(pHbFont, nID);
+
+    // Translate to PostScript units (standard 1/1000)
+    if (bPS)
+        fWidth = (fWidth * 1000) / hb_face_get_upem(hb_font_get_face(pHbFont));
+
+    return fWidth;
+}
+
 bool LogicalFontInstance::GetGlyphBoundRect(sal_GlyphId nID, tools::Rectangle 
&rRect, bool bVertical)
 {
     if (mpFontCache && mpFontCache->GetCachedGlyphBoundRect(this, nID, rRect))
diff --git a/vcl/source/gdi/CommonSalLayout.cxx 
b/vcl/source/gdi/CommonSalLayout.cxx
index b77eca31a389..fe768cb6dcb7 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -37,6 +37,8 @@
 
 #include <fontselect.hxx>
 
+#include <map>
+
 #if !HB_VERSION_ATLEAST(1, 1, 0)
 // Disabled Unicode compatibility decomposition, see fdo#66715
 static unsigned int unicodeDecomposeCompatibility(hb_unicode_funcs_t* 
/*ufuncs*/,
diff --git a/vcl/source/gdi/pdffontcache.cxx b/vcl/source/gdi/pdffontcache.cxx
deleted file mode 100644
index b79753c0ffb4..000000000000
--- a/vcl/source/gdi/pdffontcache.cxx
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <typeinfo>
-
-#include <sal/types.h>
-
-#include <PhysicalFontFace.hxx>
-#include <salgdi.hxx>
-
-#include "pdffontcache.hxx"
-
-using namespace vcl;
-
-PDFFontCache::FontIdentifier::FontIdentifier( const PhysicalFontFace* pFont, 
bool bVertical ) :
-    m_nFontId( pFont->GetFontId() ),
-    m_bVertical( bVertical ),
-    m_typeFontFace( const_cast<std::type_info*>(&typeid(pFont)) )
-{
-}
-
-PDFFontCache::FontData& PDFFontCache::getFont( const PhysicalFontFace* pFont, 
bool bVertical )
-{
-    FontIdentifier aId( pFont, bVertical );
-    FontToIndexMap::iterator it = m_aFontToIndex.find( aId );
-    if( it != m_aFontToIndex.end() )
-        return m_aFonts[ it->second ];
-    m_aFontToIndex[ aId ] = sal_uInt32(m_aFonts.size());
-    m_aFonts.emplace_back( );
-    return m_aFonts.back();
-}
-
-sal_Int32 PDFFontCache::getGlyphWidth( const PhysicalFontFace* pFont, 
sal_GlyphId nGlyph, bool bVertical, SalGraphics* pGraphics )
-{
-    sal_Int32 nWidth = 0;
-    FontData& rFontData( getFont( pFont, bVertical ) );
-    if( rFontData.m_nWidths.empty() )
-    {
-        pGraphics->GetGlyphWidths( pFont, bVertical, rFontData.m_nWidths, 
rFontData.m_aGlyphIdToIndex );
-    }
-    if( ! rFontData.m_nWidths.empty() )
-    {
-        if (nGlyph < rFontData.m_nWidths.size())
-            nWidth = rFontData.m_nWidths[nGlyph];
-    }
-    return nWidth;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/gdi/pdffontcache.hxx b/vcl/source/gdi/pdffontcache.hxx
deleted file mode 100644
index 79d6e96f37d6..000000000000
--- a/vcl/source/gdi/pdffontcache.hxx
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_VCL_SOURCE_GDI_PDFFONTCACHE_HXX
-#define INCLUDED_VCL_SOURCE_GDI_PDFFONTCACHE_HXX
-
-#include <typeinfo>
-
-#include <sal/types.h>
-
-#include <salgdi.hxx>
-
-namespace vcl
-{
-    class PDFFontCache
-    {
-        struct FontIdentifier
-        {
-            sal_IntPtr const      m_nFontId;
-            bool const            m_bVertical;
-            std::type_info* const m_typeFontFace;
-
-            FontIdentifier( const PhysicalFontFace*, bool bVertical );
-
-            // Less than needed for std::set and std::map
-            bool operator<( const FontIdentifier& rRight ) const
-            {
-                std::type_info *pType = rRight.m_typeFontFace;
-
-                return m_nFontId < rRight.m_nFontId ||
-                       ( m_nFontId == rRight.m_nFontId &&
-                       ( m_typeFontFace->before( *pType ) ||
-                       ( *m_typeFontFace == *pType && m_bVertical < 
rRight.m_bVertical ) ) );
-            }
-        };
-        struct FontData
-        {
-            std::vector< sal_Int32 >  m_nWidths;
-            Ucs2UIntMap  m_aGlyphIdToIndex;
-        };
-        typedef std::map< FontIdentifier, sal_uInt32 > FontToIndexMap;
-
-        std::vector< FontData >     m_aFonts;
-        FontToIndexMap              m_aFontToIndex;
-
-        FontData& getFont( const PhysicalFontFace*, bool bVertical );
-        public:
-        PDFFontCache() {}
-
-        sal_Int32 getGlyphWidth( const PhysicalFontFace*, sal_GlyphId, bool 
bVertical, SalGraphics* );
-    };
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx 
b/vcl/source/gdi/pdfwriter_impl.cxx
index cb7070c78021..065a564589fd 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -2429,17 +2429,12 @@ std::map< sal_Int32, sal_Int32 > 
PDFWriterImpl::emitSystemFont( const PhysicalFo
     aInfo.m_nCapHeight = 1000;
     aInfo.m_aFontBBox = tools::Rectangle( Point( -200, -200 ), Size( 1700, 
1700 ) );
     aInfo.m_aPSName = pFont->GetFamilyName();
-    sal_Int32 pWidths[256];
-    memset( pWidths, 0, sizeof(pWidths) );
 
     SalGraphics *pGraphics = GetGraphics();
 
     assert(pGraphics);
 
     aSubType = OString( "/TrueType" );
-    std::vector< sal_Int32 > aGlyphWidths;
-    Ucs2UIntMap aUnicodeMap;
-    pGraphics->GetGlyphWidths( pFont, false, aGlyphWidths, aUnicodeMap );
 
     OUString aTmpName;
     osl_createTempFile( nullptr, nullptr, &aTmpName.pData );
@@ -2451,17 +2446,12 @@ std::map< sal_Int32, sal_Int32 > 
PDFWriterImpl::emitSystemFont( const PhysicalFo
     memset( pEncoding, 0, sizeof( pEncoding ) );
     memset( pDuWidths, 0, sizeof( pDuWidths ) );
 
-    for( sal_Ucs c = 32; c < 256; c++ )
+    FontCharMapRef xFontCharMap = pFont->GetCharMap();
+    for( int c = 32; c < 256; c++ )
     {
         pEncoding[c] = c;
-        aGlyphIds[c] = 0;
-        if( aUnicodeMap.find( c ) != aUnicodeMap.end() )
-            pWidths[ c ] = aGlyphWidths[ aUnicodeMap[ c ] ];
-    }
-    //TODO: surely this is utterly broken because aGlyphIds is just all zeros, 
if we
-    //had the right glyphids here then I imagine we could replace pDuWidths 
with
-    //pWidths and remove pWidths assignment above. i.e. start with the glyph 
ids
-    //and map those to unicode rather than try and reverse map them ?
+        aGlyphIds[c] = xFontCharMap->GetGlyphIndex(c);
+    }
     pGraphics->CreateFontSubset( aTmpName, pFont, aGlyphIds, pEncoding, 
pDuWidths, 256, aInfo );
     osl_removeFile( aTmpName.pData );
 
@@ -2487,7 +2477,7 @@ std::map< sal_Int32, sal_Int32 > 
PDFWriterImpl::emitSystemFont( const PhysicalFo
                           "/Widths[" );
             for( int i = 32; i < 256; i++ )
             {
-                aLine.append( pWidths[i] );
+                aLine.append( pDuWidths[i] );
                 aLine.append( ((i&15) == 15) ? "\n" : " " );
             }
             aLine.append( "]\n"
@@ -6093,8 +6083,9 @@ void PDFWriterImpl::drawHorizontalGlyphs(
             const Point aThisPos = aMat.transform( rGlyphs[nPos].m_aPos );
             const Point aPrevPos = aMat.transform( rGlyphs[nPos-1].m_aPos );
             double fAdvance = aThisPos.X() - aPrevPos.X();
+            double fNativeWidth = rGlyphs[nPos-1].m_pGlyph->nativeWidth(true);
             fAdvance *= 1000.0 / nPixelFontHeight;
-            const double fAdjustment = rGlyphs[nPos-1].m_nNativeWidth - 
fAdvance + 0.5;
+            const double fAdjustment = fNativeWidth - fAdvance + 0.5;
             SAL_WARN_IF(
                 fAdjustment < SAL_MIN_INT32 || fAdjustment > SAL_MAX_INT32, 
"vcl.pdfwriter",
                 "adjustment " << fAdjustment << " outside 32-bit int");
@@ -6320,21 +6311,12 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, 
const OUString& rText, bool
         sal_Int32 nMappedFontObject;
         registerGlyph(pGlyph, pFont, aCodeUnits, nMappedGlyph, 
nMappedFontObject);
 
-        sal_Int32 nGlyphWidth = 0;
-        SalGraphics *pGraphics = GetGraphics();
-        if (pGraphics)
-            nGlyphWidth = m_aFontCache.getGlyphWidth(pFont,
-                                                     pGlyph->glyphId(),
-                                                     pGlyph->IsVertical(),
-                                                     pGraphics);
-
         int nCharPos = -1;
         if (bUseActualText || pGlyph->IsInCluster())
             nCharPos = pGlyph->charPos();
 
         aGlyphs.emplace_back(aPos,
                              pGlyph,
-                             nGlyphWidth,
                              nMappedFontObject,
                              nMappedGlyph,
                              nCharPos);
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx 
b/vcl/source/gdi/pdfwriter_impl.hxx
index 7e07d9e0d472..5ca1efc73129 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -25,6 +25,7 @@
 #include <memory>
 #include <vector>
 
+#include <salgdi.hxx>
 #include <com/sun/star/lang/Locale.hpp>
 #include <com/sun/star/util/XURLTransformer.hpp>
 #include <com/sun/star/uno/Sequence.h>
@@ -45,7 +46,6 @@
 #include <tools/stream.hxx>
 
 #include <outdata.hxx>
-#include "pdffontcache.hxx"
 #include "pdfbuildin_fonts.hxx"
 
 class StyleSettings;
@@ -564,19 +564,17 @@ public:
     struct PDFGlyph
     {
         Point const       m_aPos;
-        const GlyphItem* m_pGlyph;
-        sal_Int32 const   m_nNativeWidth;
+        const GlyphItem*  m_pGlyph;
         sal_Int32 const   m_nMappedFontId;
         sal_uInt8 const   m_nMappedGlyphId;
         int const         m_nCharPos;
 
         PDFGlyph( const Point& rPos,
                   const GlyphItem* pGlyph,
-                  sal_Int32 nNativeWidth,
                   sal_Int32 nFontId,
                   sal_uInt8 nMappedGlyphId,
                   int nCharPos )
-        : m_aPos( rPos ), m_pGlyph(pGlyph), m_nNativeWidth( nNativeWidth ),
+        : m_aPos( rPos ), m_pGlyph(pGlyph),
           m_nMappedFontId( nFontId ), m_nMappedGlyphId( nMappedGlyphId ),
           m_nCharPos(nCharPos)
         {}
@@ -674,7 +672,6 @@ private:
     FontSubsetData                      m_aSubsets;
     FontEmbedData                       m_aSystemFonts;
     sal_Int32                           m_nNextFID;
-    PDFFontCache                        m_aFontCache;
 
     static constexpr sal_Int32          g_nInheritedPageWidth = 595;  // 
default A4 in inch/72
     static constexpr sal_Int32          g_nInheritedPageHeight = 842; // 
default A4 in inch/72
diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx 
b/vcl/unx/generic/fontmanager/fontmanager.cxx
index 87c1f2b84c70..f13705377426 100644
--- a/vcl/unx/generic/fontmanager/fontmanager.cxx
+++ b/vcl/unx/generic/fontmanager/fontmanager.cxx
@@ -52,10 +52,6 @@
 #include <i18nlangtag/applelangid.hxx>
 #include <i18nlangtag/mslangid.hxx>
 
-#include <sft.hxx>
-
-#include <PhysicalFontFace.hxx>
-
 #if OSL_DEBUG_LEVEL > 1
 #include <sys/times.h>
 #include <stdio.h>
@@ -1105,59 +1101,6 @@ bool PrintFontManager::createFontSubset(
     return bSuccess;
 }
 
-void PrintFontManager::getGlyphWidths( const PhysicalFontFace* pFace,
-                                       bool bVertical,
-                                       std::vector< sal_Int32 >& rWidths,
-                                       std::map< sal_Unicode, sal_uInt32 >& 
rUnicodeEnc )
-{
-    PrintFont* pFont = getFont(pFace->GetFontId());
-    if (!pFont)
-        return;
-    TrueTypeFont* pTTFont = nullptr;
-    OString aFromFile = getFontFile( pFont );
-    if( OpenTTFontFile( aFromFile.getStr(), pFont->m_nCollectionEntry, 
&pTTFont ) != SFErrCodes::Ok )
-        return;
-    int nGlyphs = GetTTGlyphCount(pTTFont);
-    if (nGlyphs > 0)
-    {
-        rWidths.resize(nGlyphs);
-        std::vector<sal_uInt16> aGlyphIds(nGlyphs);
-        for (int i = 0; i < nGlyphs; i++)
-            aGlyphIds[i] = sal_uInt16(i);
-        std::unique_ptr<sal_uInt16[]> pMetrics = 
GetTTSimpleGlyphMetrics(pTTFont,
-                                                                 
aGlyphIds.data(),
-                                                                 nGlyphs,
-                                                                 bVertical);
-        if (pMetrics)
-        {
-            for (int i = 0; i< nGlyphs; i++)
-                rWidths[i] = pMetrics[i];
-            pMetrics.reset();
-            rUnicodeEnc.clear();
-        }
-
-        // fill the unicode map
-        FontCharMapRef xFontCharMap = pFace->GetCharMap();
-        for (sal_uInt32 cOld = 0;;)
-        {
-            // get next unicode covered by font
-            const sal_uInt32 c = xFontCharMap->GetNextChar(cOld);
-            if (c == cOld)
-                break;
-            cOld = c;
-#if 1 // TODO: remove when sal_Unicode covers all of unicode
-            if (c > sal_Unicode(~0))
-                break;
-#endif
-            // get the matching glyph index
-            const sal_GlyphId aGlyphId = xFontCharMap->GetGlyphIndex(c);
-            // update the requested map
-            rUnicodeEnc[static_cast<sal_Unicode>(c)] = aGlyphId;
-        }
-    }
-    CloseTTFont(pTTFont);
-}
-
 /// used by online unit tests via dlopen.
 extern "C" {
 SAL_DLLPUBLIC_EXPORT const char * unit_online_get_fonts(void)
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx 
b/vcl/unx/generic/gdi/cairotextrender.cxx
index 1a8157b50033..6ae134dda6e1 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -516,17 +516,4 @@ void CairoTextRender::FreeEmbedFontData( const void* 
pData, long nLen )
     GenPspGraphics::DoFreeEmbedFontData( pData, nLen );
 }
 
-void CairoTextRender::GetGlyphWidths( const PhysicalFontFace* pFont,
-                                   bool bVertical,
-                                   std::vector< sal_Int32 >& rWidths,
-                                   Ucs2UIntMap& rUnicodeEnc )
-{
-    // in this context the pFont->GetFontId() is a valid PSP
-    // font since they are the only ones left after the PDF
-    // export has filtered its list of subsettable fonts (for
-    // which this method was created). The correct way would
-    // be to have the GlyphCache search for the PhysicalFontFace pFont
-    GenPspGraphics::DoGetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/gdi/font.cxx b/vcl/unx/generic/gdi/font.cxx
index 29b0f4daa715..b1d0be68bc22 100644
--- a/vcl/unx/generic/gdi/font.cxx
+++ b/vcl/unx/generic/gdi/font.cxx
@@ -143,12 +143,4 @@ void X11SalGraphics::FreeEmbedFontData( const void* pData, 
long nLen )
     mxTextRenderImpl->FreeEmbedFontData(pData, nLen);
 }
 
-void X11SalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
-                                   bool bVertical,
-                                   std::vector< sal_Int32 >& rWidths,
-                                   Ucs2UIntMap& rUnicodeEnc )
-{
-    mxTextRenderImpl->GetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index b00409a78e5d..d33b80d8e6ee 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -42,7 +42,6 @@
 
 #include <langboost.hxx>
 #include <PhysicalFontCollection.hxx>
-#include <sft.hxx>
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx 
b/vcl/unx/generic/print/genpspgraphics.cxx
index 30e040a50134..ec84c2baa9a1 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -764,23 +764,6 @@ bool GenPspGraphics::CreateFontSubset(
     return bSuccess;
 }
 
-void GenPspGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
-                                  bool bVertical,
-                                  std::vector< sal_Int32 >& rWidths,
-                                  Ucs2UIntMap& rUnicodeEnc )
-{
-    GenPspGraphics::DoGetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
-}
-
-void GenPspGraphics::DoGetGlyphWidths( const PhysicalFontFace* pFont,
-                                    bool bVertical,
-                                    std::vector< sal_Int32 >& rWidths,
-                                    Ucs2UIntMap& rUnicodeEnc )
-{
-    psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
-    rMgr.getGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
-}
-
 FontAttributes GenPspGraphics::Info2FontAttributes( const 
psp::FastPrintFontInfo& rInfo )
 {
     FontAttributes aDFA;
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 0b4511c89c1a..b4ca78be9045 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1652,75 +1652,4 @@ void WinSalGraphics::FreeEmbedFontData( const void* 
pData, long /*nLen*/ )
     delete[] static_cast<char const *>(pData);
 }
 
-void WinSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
-                                     bool bVertical,
-                                     std::vector< sal_Int32 >& rWidths,
-                                     Ucs2UIntMap& rUnicodeEnc )
-{
-    // create matching FontSelectPattern
-    // we need just enough to get to the font file data
-    FontSelectPattern aIFSD( *pFont, Size(0,1000), 1000.0, 0, false );
-
-    // TODO: much better solution: move SetFont and restoration of old font to 
caller
-    ScopedFont aOldFont(*this);
-
-    float fScale = 0.0;
-    HFONT hOldFont = nullptr;
-    ImplDoSetFont(aIFSD, pFont, fScale, hOldFont);
-
-    // get raw font file data
-    const RawFontData xRawFontData( getHDC() );
-    if( !xRawFontData.get() )
-        return;
-
-    // open font file
-    sal_uInt32 nFaceNum = 0;
-    if( !*xRawFontData.get() )  // TTC candidate
-        nFaceNum = ~0U;  // indicate "TTC font extracts only"
-
-    ScopedTrueTypeFont aSftTTF;
-    SFErrCodes nRC = aSftTTF.open( xRawFontData.get(), xRawFontData.size(), 
nFaceNum );
-    if( nRC != SFErrCodes::Ok )
-        return;
-
-    int nGlyphs = GetTTGlyphCount( aSftTTF.get() );
-    if( nGlyphs > 0 )
-    {
-        rWidths.resize(nGlyphs);
-        std::vector<sal_uInt16> aGlyphIds(nGlyphs);
-        for( int i = 0; i < nGlyphs; i++ )
-            aGlyphIds[i] = sal_uInt16(i);
-        std::unique_ptr<sal_uInt16[]> pMetrics = ::GetTTSimpleGlyphMetrics( 
aSftTTF.get(),
-                                                                    
&aGlyphIds[0],
-                                                                    nGlyphs,
-                                                                    bVertical 
);
-        if( pMetrics )
-        {
-            for( int i = 0; i< nGlyphs; i++ )
-                rWidths[i] = pMetrics[i];
-            pMetrics.reset();
-            rUnicodeEnc.clear();
-        }
-        const WinFontFace* pWinFont = static_cast<const WinFontFace*>(pFont);
-        FontCharMapRef xFCMap = pWinFont->GetCharMap();
-        SAL_WARN_IF( !xFCMap.is() || !xFCMap->GetCharCount(), "vcl", "no map" 
);
-
-        int nCharCount = xFCMap->GetCharCount();
-        sal_uInt32 nChar = xFCMap->GetFirstChar();
-        for( int i = 0; i < nCharCount; i++ )
-        {
-            if( nChar < 0x00010000 )
-            {
-                sal_uInt16 nGlyph = ::MapChar( aSftTTF.get(),
-                                               static_cast<sal_Ucs>(nChar));
-                if( nGlyph )
-                    rUnicodeEnc[ static_cast<sal_Unicode>(nChar) ] = nGlyph;
-            }
-            nChar = xFCMap->GetNextChar( nChar );
-        }
-
-        xFCMap = nullptr;
-    }
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 5c27e4ecfb1ac3f41e07fcf20bf600ca98cbcaf9
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Wed Aug 28 18:22:25 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:34:38 2019 +0200

    Consolidate GetFontCharMap()
    
    All implementations were basically doing the same thing. Move to
    PhysicalFontFace and use HarfBuzz API to get the raw OpeenType table
    data.
    
    While at make a few other places use that FontCharMap as well instead of
    parsing the cmap table again.
    
    Drop unused HasChar() as well.
    
    Change-Id: I06ff4feb61bcfb17291bf3c299caf11fc53afa4d

diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index c4729bf32519..35cbf923665d 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -25,6 +25,7 @@
 #include <salhelper/simplereferenceobject.hxx>
 #include <rtl/ref.hxx>
 #include <vcl/dllapi.h>
+#include <vcl/outdev.hxx>
 
 #include "fontattributes.hxx"
 
@@ -68,6 +69,8 @@ public:
     sal_Int32               CompareWithSize( const PhysicalFontFace& ) const;
     sal_Int32               CompareIgnoreSize( const PhysicalFontFace& ) const;
 
+    const FontCharMapRef&   GetCharMap() const;
+
     hb_face_t*              GetHbFace() const { return mpHbFace; }
     virtual hb_blob_t*      GetHbTable(const char* pName) = 0;
 
@@ -79,6 +82,8 @@ protected:
     long                    mnHeight;   // Height (in pixels)
 
     hb_face_t*              mpHbFace;
+
+    mutable FontCharMapRef  mxCharMap;
 };
 
 #endif // INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
diff --git a/vcl/inc/qt5/Qt5FontFace.hxx b/vcl/inc/qt5/Qt5FontFace.hxx
index ddac090e7dc8..14da580393d8 100644
--- a/vcl/inc/qt5/Qt5FontFace.hxx
+++ b/vcl/inc/qt5/Qt5FontFace.hxx
@@ -42,9 +42,7 @@ public:
 
     int GetFontTable(const char pTagName[5], unsigned char*) const;
 
-    const FontCharMapRef& GetFontCharMap() const;
     bool GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities) const;
-    bool HasChar(sal_uInt32 cChar) const;
 
     rtl::Reference<LogicalFontInstance>
     CreateFontInstance(const FontSelectPattern& rFSD) const override;
@@ -57,7 +55,6 @@ protected:
 
 private:
     const QString m_aFontId;
-    mutable FontCharMapRef m_xCharMap;
     mutable vcl::FontCapabilities m_aFontCapabilities;
     mutable bool m_bFontCapabilitiesRead;
 };
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index d0ad3ffd2edb..a70572e2dc08 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -67,9 +67,7 @@ public:
     int                             GetFontTable( uint32_t nTagCode, unsigned 
char* ) const;
     int                             GetFontTable( const char pTagName[5], 
unsigned char* ) const;
 
-    FontCharMapRef                  GetFontCharMap() const;
     bool                            GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const;
-    bool                            HasChar( sal_uInt32 cChar ) const;
 
     rtl::Reference<LogicalFontInstance> CreateFontInstance(const 
FontSelectPattern&) const override;
 
@@ -77,7 +75,6 @@ public:
 
 private:
     const sal_IntPtr                mnFontId;
-    mutable FontCharMapRef          mxCharMap;
     mutable vcl::FontCapabilities   maFontCapabilities;
     mutable bool                    mbFontCapabilitiesRead;
 };
diff --git a/vcl/inc/unx/fontmanager.hxx b/vcl/inc/unx/fontmanager.hxx
index 3c67adc70d8f..8d388013144a 100644
--- a/vcl/inc/unx/fontmanager.hxx
+++ b/vcl/inc/unx/fontmanager.hxx
@@ -42,6 +42,7 @@ class FontSubsetInfo;
 class FontConfigFontOptions;
 class FontSelectPattern;
 class GenericUnixSalData;
+class PhysicalFontFace;
 
 namespace psp {
 class PPDParser;
@@ -271,7 +272,7 @@ public:
                            sal_Int32* pWidths,
                            int nGlyphs
                            );
-    void getGlyphWidths( fontID nFont,
+    void getGlyphWidths( const PhysicalFontFace* pFace,
                          bool bVertical,
                          std::vector< sal_Int32 >& rWidths,
                          std::map< sal_Unicode, sal_uInt32 >& rUnicodeEnc );
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx 
b/vcl/inc/unx/freetype_glyphcache.hxx
index 80b643d65c45..c2bd3c395c0a 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -75,8 +75,6 @@ public:
 
     void                  AnnounceFont( PhysicalFontCollection* );
 
-    const FontCharMapRef& GetFontCharMap();
-
 private:
     FT_FaceRec_*    maFaceFT;
     FreetypeFontFile* const mpFontFile;
@@ -85,8 +83,6 @@ private:
     int             mnRefCount;
     sal_IntPtr const mnFontId;
     FontAttributes  maDevFontAttributes;
-
-    FontCharMapRef  mxFontCharMap;
 };
 
 class FreetypeFontFace : public PhysicalFontFace
diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h
index 73084a4f6a61..44ca12ebc458 100644
--- a/vcl/inc/unx/genpspgraphics.h
+++ b/vcl/inc/unx/genpspgraphics.h
@@ -55,7 +55,7 @@ public:
     static void             DoFreeEmbedFontData( const void* pData, long nLen 
);
 
     // helper methods for sharing with X11SalGraphics
-    static void             DoGetGlyphWidths( psp::fontID aFont,
+    static void             DoGetGlyphWidths( const PhysicalFontFace*,
                                               bool bVertical,
                                               std::vector< sal_Int32 >& 
rWidths,
                                               Ucs2UIntMap& rUnicodeEnc );
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 9eab11b6659a..2eb008ad1084 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -68,12 +68,9 @@ public:
     void                    SetFontId( sal_IntPtr nId ) { mnId = nId; }
     void                    UpdateFromHDC( HDC ) const;
 
-    bool                    HasChar( sal_uInt32 cChar ) const;
-
     BYTE                    GetCharSet() const          { return meWinCharSet; 
}
     BYTE                    GetPitchAndFamily() const   { return 
mnPitchAndFamily; }
 
-    FontCharMapRef          GetFontCharMap() const;
     bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
 
     hb_blob_t*              GetHbTable(const char* pName) override;
@@ -83,7 +80,6 @@ private:
 
     // some members that are initialized lazily when the font gets selected 
into a HDC
     mutable bool                    mbFontCapabilitiesRead;
-    mutable FontCharMapRef          mxUnicodeMap;
     mutable vcl::FontCapabilities   maFontCapabilities;
 
     BYTE                    meWinCharSet;
@@ -91,7 +87,6 @@ private:
     bool                    mbAliasSymbolsHigh;
     bool                    mbAliasSymbolsLow;
 
-    void                    ReadCmapTable( HDC ) const;
     void                    GetFontCapabilities( HDC hDC ) const;
 
     HDC                     mhDC;
@@ -400,21 +395,6 @@ void    ImplGetLogFontFromFontSelect( HDC, const 
FontSelectPattern&,
 
 #define MAX_64KSALPOINTS    ((((sal_uInt16)0xFFFF)-8)/sizeof(POINTS))
 
-// called extremely often from just one spot => inline
-inline bool WinFontFace::HasChar( sal_uInt32 cChar ) const
-{
-    if( mxUnicodeMap->HasChar( cChar ) )
-        return true;
-    // second chance to allow symbol aliasing
-    if( mbAliasSymbolsLow && ((cChar-0xF000) <= 0xFF) )
-        cChar -= 0xF000;
-    else if( mbAliasSymbolsHigh && (cChar <= 0xFF) )
-        cChar += 0xF000;
-    else
-        return false;
-    return mxUnicodeMap->HasChar( cChar );
-}
-
 #endif // INCLUDED_VCL_INC_WIN_SALGDI_H
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index ac8bb92bc2ed..ea7770bf78a3 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -26,7 +26,6 @@
 #include <Qt5Tools.hxx>
 
 #include <sft.hxx>
-#include <impfontcharmap.hxx>
 #include <fontinstance.hxx>
 #include <fontselect.hxx>
 #include <PhysicalFontCollection.hxx>
@@ -143,29 +142,6 @@ Qt5FontFace::CreateFontInstance(const FontSelectPattern& 
rFSD) const
     return new Qt5Font(*this, rFSD);
 }
 
-const FontCharMapRef& Qt5FontFace::GetFontCharMap() const
-{
-    if (m_xCharMap.is())
-        return m_xCharMap;
-
-    QFont aFont;
-    aFont.fromString(m_aFontId);
-    QRawFont aRawFont(QRawFont::fromFont(aFont));
-    QByteArray aCMapTable = aRawFont.fontTable("cmap");
-    if (aCMapTable.isEmpty())
-    {
-        m_xCharMap = new FontCharMap();
-        return m_xCharMap;
-    }
-
-    CmapResult aCmapResult;
-    if (ParseCMAP(reinterpret_cast<const unsigned char*>(aCMapTable.data()), 
aCMapTable.size(),
-                  aCmapResult))
-        m_xCharMap = new FontCharMap(aCmapResult);
-
-    return m_xCharMap;
-}
-
 bool Qt5FontFace::GetFontCapabilities(vcl::FontCapabilities& 
rFontCapabilities) const
 {
     // read this only once per font
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 85b51b82b1eb..73dd374493e7 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -71,7 +71,7 @@ FontCharMapRef Qt5Graphics::GetFontCharMap() const
 {
     if (!m_pTextStyle[0])
         return FontCharMapRef(new FontCharMap());
-    return static_cast<const 
Qt5FontFace*>(m_pTextStyle[0]->GetFontFace())->GetFontCharMap();
+    return m_pTextStyle[0]->GetFontFace()->GetCharMap();
 }
 
 bool Qt5Graphics::GetFontCapabilities(vcl::FontCapabilities& 
rFontCapabilities) const
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 0d5ecab6a419..fc986eba5806 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -40,7 +40,6 @@
 #include <quartz/ctfonts.hxx>
 #include <fontsubset.hxx>
 #include <impfont.hxx>
-#include <impfontcharmap.hxx>
 #include <impfontmetricdata.hxx>
 #include <outdev.h>
 #include <PhysicalFontCollection.hxx>
@@ -113,44 +112,6 @@ sal_IntPtr CoreTextFontFace::GetFontId() const
     return mnFontId;
 }
 
-FontCharMapRef CoreTextFontFace::GetFontCharMap() const
-{
-    // return the cached charmap
-    if( mxCharMap.is() )
-        return mxCharMap;
-
-    // set the default charmap
-    FontCharMapRef pCharMap( new FontCharMap() );
-    mxCharMap = pCharMap;
-
-    // get the CMAP byte size
-    // allocate a buffer for the CMAP raw data
-    const int nBufSize = GetFontTable( "cmap", nullptr );
-    SAL_WARN_IF( (nBufSize <= 0), "vcl", "CoreTextFontFace::GetFontCharMap : 
GetFontTable1 failed!");
-    if( nBufSize <= 0 )
-        return mxCharMap;
-
-    // get the CMAP raw data
-    std::vector<unsigned char> aBuffer( nBufSize );
-    const int nRawLength = GetFontTable( "cmap", aBuffer.data() );
-    SAL_WARN_IF( (nRawLength <= 0), "vcl", "CoreTextFontFace::GetFontCharMap : 
GetFontTable2 failed!");
-    if( nRawLength <= 0 )
-        return mxCharMap;
-
-    SAL_WARN_IF( (nBufSize!=nRawLength), "vcl", 
"CoreTextFontFace::GetFontCharMap : ByteCount mismatch!");
-
-    // parse the CMAP
-    CmapResult aCmapResult;
-    if( ParseCMAP( aBuffer.data(), nRawLength, aCmapResult ) )
-    {
-        FontCharMapRef xDefFontCharMap( new FontCharMap(aCmapResult) );
-        // create the matching charmap
-        mxCharMap = xDefFontCharMap;
-    }
-
-    return mxCharMap;
-}
-
 bool CoreTextFontFace::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
 {
     // read this only once per font
@@ -514,7 +475,7 @@ FontCharMapRef AquaSalGraphics::GetFontCharMap() const
         return FontCharMapRef( new FontCharMap() );
     }
 
-    return static_cast<const 
CoreTextFontFace*>(mpTextStyle[0]->GetFontFace())->GetFontCharMap();
+    return mpTextStyle[0]->GetFontFace()->GetCharMap();
 }
 
 bool AquaSalGraphics::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
diff --git a/vcl/source/font/PhysicalFontFace.cxx 
b/vcl/source/font/PhysicalFontFace.cxx
index 33493b63a427..83dea5afe8cd 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -17,12 +17,15 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <vcl/fontcharmap.hxx>
+
 #include <sal/types.h>
 #include <tools/fontenum.hxx>
 #include <unotools/fontdefs.hxx>
 
 #include <fontattributes.hxx>
 #include <fontselect.hxx>
+#include <impfontcharmap.hxx>
 
 #include <PhysicalFontFace.hxx>
 
@@ -227,4 +230,31 @@ bool PhysicalFontFace::IsBetterMatch( const 
FontSelectPattern& rFSD, FontMatchSt
     return true;
 }
 
+const FontCharMapRef& PhysicalFontFace::GetCharMap() const
+{
+    if (mxCharMap.is())
+        return mxCharMap;
+
+    // Get the charmap and cache it.
+    CmapResult aCmapResult;
+    aCmapResult.mbSymbolic = IsSymbolFont();
+
+    hb_blob_t* pBlob = hb_face_reference_table(mpHbFace, HB_TAG('c', 'm', 'a', 
'p'));
+    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 && ParseCMAP(pData, nSize, aCmapResult))
+    {
+        FontCharMapRef xCharMap(new FontCharMap(aCmapResult));
+        mxCharMap = xCharMap;
+    }
+    else
+    {
+        FontCharMapRef xCharMap(new FontCharMap());
+        mxCharMap = xCharMap;
+    }
+    hb_blob_destroy(pBlob);
+
+    return mxCharMap;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx 
b/vcl/unx/generic/fontmanager/fontmanager.cxx
index a4d07ec3bdbe..87c1f2b84c70 100644
--- a/vcl/unx/generic/fontmanager/fontmanager.cxx
+++ b/vcl/unx/generic/fontmanager/fontmanager.cxx
@@ -27,7 +27,6 @@
 
 #include <unx/fontmanager.hxx>
 #include <fontsubset.hxx>
-#include <impfontcharmap.hxx>
 #include <svdata.hxx>
 #include <unx/geninst.h>
 #include <unx/gendata.hxx>
@@ -55,6 +54,8 @@
 
 #include <sft.hxx>
 
+#include <PhysicalFontFace.hxx>
+
 #if OSL_DEBUG_LEVEL > 1
 #include <sys/times.h>
 #include <stdio.h>
@@ -1104,12 +1105,12 @@ bool PrintFontManager::createFontSubset(
     return bSuccess;
 }
 
-void PrintFontManager::getGlyphWidths( fontID nFont,
+void PrintFontManager::getGlyphWidths( const PhysicalFontFace* pFace,
                                        bool bVertical,
                                        std::vector< sal_Int32 >& rWidths,
                                        std::map< sal_Unicode, sal_uInt32 >& 
rUnicodeEnc )
 {
-    PrintFont* pFont = getFont( nFont );
+    PrintFont* pFont = getFont(pFace->GetFontId());
     if (!pFont)
         return;
     TrueTypeFont* pTTFont = nullptr;
@@ -1136,32 +1137,22 @@ void PrintFontManager::getGlyphWidths( fontID nFont,
         }
 
         // fill the unicode map
-        // TODO: isn't this map already available elsewhere in the fontmanager?
-        const sal_uInt8* pCmapData = nullptr;
-        int nCmapSize = 0;
-        if (GetSfntTable(pTTFont, O_cmap, &pCmapData, &nCmapSize))
+        FontCharMapRef xFontCharMap = pFace->GetCharMap();
+        for (sal_uInt32 cOld = 0;;)
         {
-            CmapResult aCmapResult;
-            if (ParseCMAP(pCmapData, nCmapSize, aCmapResult))
-            {
-                FontCharMapRef xFontCharMap(new FontCharMap(aCmapResult));
-                for (sal_uInt32 cOld = 0;;)
-                {
-                    // get next unicode covered by font
-                    const sal_uInt32 c = xFontCharMap->GetNextChar(cOld);
-                    if (c == cOld)
-                        break;
-                    cOld = c;
+            // get next unicode covered by font
+            const sal_uInt32 c = xFontCharMap->GetNextChar(cOld);
+            if (c == cOld)
+                break;
+            cOld = c;
 #if 1 // TODO: remove when sal_Unicode covers all of unicode
-                    if (c > sal_Unicode(~0))
-                        break;
+            if (c > sal_Unicode(~0))
+                break;
 #endif
-                    // get the matching glyph index
-                    const sal_GlyphId aGlyphId = 
xFontCharMap->GetGlyphIndex(c);
-                    // update the requested map
-                    rUnicodeEnc[static_cast<sal_Unicode>(c)] = aGlyphId;
-                }
-            }
+            // get the matching glyph index
+            const sal_GlyphId aGlyphId = xFontCharMap->GetGlyphIndex(c);
+            // update the requested map
+            rUnicodeEnc[static_cast<sal_Unicode>(c)] = aGlyphId;
         }
     }
     CloseTTFont(pTTFont);
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx 
b/vcl/unx/generic/gdi/cairotextrender.cxx
index 8b55ab6da58d..1a8157b50033 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -526,8 +526,7 @@ void CairoTextRender::GetGlyphWidths( const 
PhysicalFontFace* pFont,
     // export has filtered its list of subsettable fonts (for
     // which this method was created). The correct way would
     // be to have the GlyphCache search for the PhysicalFontFace pFont
-    psp::fontID aFont = pFont->GetFontId();
-    GenPspGraphics::DoGetGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc );
+    GenPspGraphics::DoGetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 695755f7b111..b00409a78e5d 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -66,7 +66,6 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 #include <unx/fontmanager.hxx>
-#include <impfontcharmap.hxx>
 #include <impfontcache.hxx>
 
 static FT_Library aLibFT = nullptr;
@@ -686,33 +685,7 @@ bool FreetypeFont::GetAntialiasAdvice() const
 
 FontCharMapRef FreetypeFont::GetFontCharMap() const
 {
-    return mpFontInfo->GetFontCharMap();
-}
-
-const FontCharMapRef& FreetypeFontInfo::GetFontCharMap()
-{
-    // check if the charmap is already cached
-    if( mxFontCharMap.is() )
-        return mxFontCharMap;
-
-    // get the charmap and cache it
-    CmapResult aCmapResult;
-    aCmapResult.mbSymbolic = IsSymbolFont();
-
-    sal_uLong nLength = 0;
-    const unsigned char* pCmap = GetTable("cmap", &nLength);
-    if (pCmap && (nLength > 0) && ParseCMAP(pCmap, nLength, aCmapResult))
-    {
-        FontCharMapRef xFontCharMap( new FontCharMap ( aCmapResult ) );
-        mxFontCharMap = xFontCharMap;
-    }
-    else
-    {
-        FontCharMapRef xFontCharMap( new FontCharMap() );
-        mxFontCharMap = xFontCharMap;
-    }
-    // mxFontCharMap on either branch now has a refcount of 1
-    return mxFontCharMap;
+    return mpFontInstance->GetFontFace()->GetCharMap();
 }
 
 bool FreetypeFont::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx 
b/vcl/unx/generic/print/genpspgraphics.cxx
index 38a39e729fc3..30e040a50134 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -769,22 +769,16 @@ void GenPspGraphics::GetGlyphWidths( const 
PhysicalFontFace* pFont,
                                   std::vector< sal_Int32 >& rWidths,
                                   Ucs2UIntMap& rUnicodeEnc )
 {
-    // in this context the pFont->GetFontId() is a valid PSP
-    // font since they are the only ones left after the PDF
-    // export has filtered its list of subsettable fonts (for
-    // which this method was created). The correct way would
-    // be to have the GlyphCache search for the PhysicalFontFace pFont
-    psp::fontID aFont = pFont->GetFontId();
-    GenPspGraphics::DoGetGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc );
+    GenPspGraphics::DoGetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
 }
 
-void GenPspGraphics::DoGetGlyphWidths( psp::fontID aFont,
+void GenPspGraphics::DoGetGlyphWidths( const PhysicalFontFace* pFont,
                                     bool bVertical,
                                     std::vector< sal_Int32 >& rWidths,
                                     Ucs2UIntMap& rUnicodeEnc )
 {
     psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
-    rMgr.getGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc );
+    rMgr.getGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc);
 }
 
 FontAttributes GenPspGraphics::Info2FontAttributes( const 
psp::FastPrintFontInfo& rInfo )
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index f19bb3349d49..0b4511c89c1a 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -57,7 +57,6 @@
 #include <win/saldata.hxx>
 #include <win/salgdi.h>
 #include <win/winlayout.hxx>
-#include <impfontcharmap.hxx>
 #include <impfontmetricdata.hxx>
 #include <impglyphitem.hxx>
 
@@ -174,32 +173,7 @@ private:
 bool WinGlyphFallbackSubstititution::HasMissingChars(PhysicalFontFace* pFace, 
OUString& rMissingChars) const
 {
     WinFontFace* pWinFont = static_cast< WinFontFace* >(pFace);
-    FontCharMapRef xFontCharMap = pWinFont->GetFontCharMap();
-    if( !xFontCharMap.is() )
-    {
-        // construct a Size structure as the parameter of constructor of class 
FontSelectPattern
-        const Size aSize( pFace->GetWidth(), pFace->GetHeight() );
-        // create a FontSelectPattern object for getting s LOGFONT
-        const FontSelectPattern aFSD( *pFace, aSize, 
static_cast<float>(aSize.Height()), 0, false );
-        // construct log font
-        LOGFONTW aLogFont;
-        ImplGetLogFontFromFontSelect( mhDC, aFSD, pFace, aLogFont );
-
-        // create HFONT from log font
-        HFONT hNewFont = ::CreateFontIndirectW( &aLogFont );
-        // select the new font into device
-        HFONT hOldFont = ::SelectFont( mhDC, hNewFont );
-
-        // read CMAP table to update their xFontCharMap
-        pWinFont->UpdateFromHDC( mhDC );
-
-        // cleanup temporary font
-        ::SelectFont( mhDC, hOldFont );
-        ::DeleteFont( hNewFont );
-
-        // get the new charmap
-        xFontCharMap = pWinFont->GetFontCharMap();
-    }
+    FontCharMapRef xFontCharMap = pWinFont->GetCharMap();
 
     // avoid fonts with unknown CMAP subtables for glyph fallback
     if( !xFontCharMap.is() || xFontCharMap->IsDefaultMap() )
@@ -642,7 +616,6 @@ WinFontFace::WinFontFace( const FontAttributes& rDFS,
 
 WinFontFace::~WinFontFace()
 {
-    mxUnicodeMap.clear();
 }
 
 sal_IntPtr WinFontFace::GetFontId() const
@@ -680,53 +653,19 @@ static DWORD CalcTag( const char p[5]) { return 
(p[0]+(p[1]<<8)+(p[2]<<16)+(p[3]
 void WinFontFace::UpdateFromHDC( HDC hDC ) const
 {
     // short circuit if already initialized
-    if( mxUnicodeMap.is() )
+    if (mhDC != nullptr)
         return;
 
     mhDC = hDC;
-
-    ReadCmapTable( hDC );
     GetFontCapabilities( hDC );
 }
 
-FontCharMapRef WinFontFace::GetFontCharMap() const
-{
-    return mxUnicodeMap;
-}
-
 bool WinFontFace::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
 {
     rFontCapabilities = maFontCapabilities;
     return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
 }
 
-void WinFontFace::ReadCmapTable( HDC hDC ) const
-{
-    if( mxUnicodeMap.is() )
-        return;
-
-    bool bIsSymbolFont = (meWinCharSet == SYMBOL_CHARSET);
-    // get the CMAP table from the font which is selected into the DC
-    const DWORD nCmapTag = CalcTag( "cmap" );
-    const RawFontData aRawFontData( hDC, nCmapTag );
-    // parse the CMAP table if available
-    if( aRawFontData.get() ) {
-        CmapResult aResult;
-        ParseCMAP( aRawFontData.get(), aRawFontData.size(), aResult );
-        aResult.mbSymbolic = bIsSymbolFont;
-        if( aResult.mnRangeCount > 0 )
-        {
-            FontCharMapRef pUnicodeMap(new FontCharMap(aResult));
-            mxUnicodeMap = pUnicodeMap;
-        }
-    }
-
-    if( !mxUnicodeMap.is() )
-    {
-        mxUnicodeMap = FontCharMap::GetDefaultMap( bIsSymbolFont );
-    }
-}
-
 void WinFontFace::GetFontCapabilities( HDC hDC ) const
 {
     // read this only once per font
@@ -1004,7 +943,7 @@ FontCharMapRef WinSalGraphics::GetFontCharMap() const
     {
         return FontCharMapRef( new FontCharMap() );
     }
-    return mpWinFontEntry[0]->GetFontFace()->GetFontCharMap();
+    return mpWinFontEntry[0]->GetFontFace()->GetCharMap();
 }
 
 bool WinSalGraphics::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
@@ -1763,7 +1702,7 @@ void WinSalGraphics::GetGlyphWidths( const 
PhysicalFontFace* pFont,
             rUnicodeEnc.clear();
         }
         const WinFontFace* pWinFont = static_cast<const WinFontFace*>(pFont);
-        FontCharMapRef xFCMap = pWinFont->GetFontCharMap();
+        FontCharMapRef xFCMap = pWinFont->GetCharMap();
         SAL_WARN_IF( !xFCMap.is() || !xFCMap->GetCharCount(), "vcl", "no map" 
);
 
         int nCharCount = xFCMap->GetCharCount();
commit 8d3696812e17d092828083d4ea87657ef3b62e35
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Wed Aug 28 17:24:51 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:33:14 2019 +0200

    Move creating HarfBuzz face to PhysicalFontFace
    
    The two map to each other; there are many size-specific
    LogicalFontInstance's in each PhysicalFontFace, and ditto for hb_face_t
    and hb_font_t.
    
    This will make it possible to access HarfBuzz face from PhysicalFontFace
    in the future.
    
    Change-Id: I029ad8c4b619b55a2c629f813b9e60bda29b1c08

diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 23af5be9169e..c4729bf32519 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -20,6 +20,8 @@
 #ifndef INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
 #define INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
 
+#include <hb.h>
+
 #include <salhelper/simplereferenceobject.hxx>
 #include <rtl/ref.hxx>
 #include <vcl/dllapi.h>
@@ -54,6 +56,8 @@ public:
 class VCL_PLUGIN_PUBLIC PhysicalFontFace : public FontAttributes, public 
salhelper::SimpleReferenceObject
 {
 public:
+    ~PhysicalFontFace();
+
     virtual rtl::Reference<LogicalFontInstance> CreateFontInstance(const 
FontSelectPattern&) const = 0;
 
     int                     GetHeight() const           { return mnHeight; }
@@ -64,12 +68,17 @@ public:
     sal_Int32               CompareWithSize( const PhysicalFontFace& ) const;
     sal_Int32               CompareIgnoreSize( const PhysicalFontFace& ) const;
 
+    hb_face_t*              GetHbFace() const { return mpHbFace; }
+    virtual hb_blob_t*      GetHbTable(const char* pName) = 0;
+
 protected:
     explicit PhysicalFontFace(const FontAttributes&);
     void                    SetBitmapSize( int nW, int nH ) { mnWidth=nW; 
mnHeight=nH; }
 
     long                    mnWidth;    // Width (in pixels)
     long                    mnHeight;   // Height (in pixels)
+
+    hb_face_t*              mpHbFace;
 };
 
 #endif // INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx
index b57955f82a9e..5e234df72e0c 100644
--- a/vcl/inc/fontinstance.hxx
+++ b/vcl/inc/fontinstance.hxx
@@ -77,14 +77,12 @@ public: // TODO: make data members private
     int GetKashidaWidth();
 
     void GetScale(double* nXScale, double* nYScale);
-    static inline void DecodeOpenTypeTag(const uint32_t nTableTag, char* 
pTagName);
 
 protected:
     explicit LogicalFontInstance(const PhysicalFontFace&, const 
FontSelectPattern&);
 
     virtual bool ImplGetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool) 
const = 0;
 
-    // Takes ownership of pHbFace.
     static hb_font_t* InitHbFont(hb_face_t* pHbFace);
     virtual hb_font_t* ImplInitHbFont() { assert(false); return 
hb_font_get_empty(); }
     inline void ReleaseHbFont();
@@ -117,15 +115,6 @@ inline void LogicalFontInstance::ReleaseHbFont()
     m_pHbFont = nullptr;
 }
 
-inline void LogicalFontInstance::DecodeOpenTypeTag(const uint32_t nTableTag, 
char* pTagName)
-{
-    pTagName[0] = static_cast<char>(nTableTag >> 24);
-    pTagName[1] = static_cast<char>(nTableTag >> 16);
-    pTagName[2] = static_cast<char>(nTableTag >> 8);
-    pTagName[3] = static_cast<char>(nTableTag);
-    pTagName[4] = 0;
-}
-
 #endif // INCLUDED_VCL_INC_FONTINSTANCE_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt5/Qt5FontFace.hxx b/vcl/inc/qt5/Qt5FontFace.hxx
index c427a85445c3..ddac090e7dc8 100644
--- a/vcl/inc/qt5/Qt5FontFace.hxx
+++ b/vcl/inc/qt5/Qt5FontFace.hxx
@@ -49,6 +49,8 @@ public:
     rtl::Reference<LogicalFontInstance>
     CreateFontInstance(const FontSelectPattern& rFSD) const override;
 
+    hb_blob_t* GetHbTable(const char* pName) override;
+
 protected:
     Qt5FontFace(const Qt5FontFace&);
     Qt5FontFace(const FontAttributes& rFA, const QString& rFontID);
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 338878e79529..d0ad3ffd2edb 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -73,6 +73,8 @@ public:
 
     rtl::Reference<LogicalFontInstance> CreateFontInstance(const 
FontSelectPattern&) const override;
 
+    hb_blob_t*                      GetHbTable(const char* pName) override;
+
 private:
     const sal_IntPtr                mnFontId;
     mutable FontCharMapRef          mxCharMap;
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx 
b/vcl/inc/unx/freetype_glyphcache.hxx
index 17084fcf5a75..80b643d65c45 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -99,6 +99,8 @@ public:
 
     virtual rtl::Reference<LogicalFontInstance> CreateFontInstance( const 
FontSelectPattern& ) const override;
     virtual sal_IntPtr      GetFontId() const override { return 
mpFreetypeFontInfo->GetFontId(); }
+
+    hb_blob_t*              GetHbTable(const char* pName) override;
 };
 
 // a class for cache entries for physical font instances that are based on 
serverfonts
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index d6d8dea14c24..9eab11b6659a 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -76,6 +76,8 @@ public:
     FontCharMapRef          GetFontCharMap() const;
     bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
 
+    hb_blob_t*              GetHbTable(const char* pName) override;
+
 private:
     sal_IntPtr              mnId;
 
@@ -91,6 +93,8 @@ private:
 
     void                    ReadCmapTable( HDC ) const;
     void                    GetFontCapabilities( HDC hDC ) const;
+
+    HDC                     mhDC;
 };
 
 /** Class that creates (and destroys) a compatible Device Context.
diff --git a/vcl/qt5/Qt5Font.cxx b/vcl/qt5/Qt5Font.cxx
index ee9d339266b2..ffa7e0a78415 100644
--- a/vcl/qt5/Qt5Font.cxx
+++ b/vcl/qt5/Qt5Font.cxx
@@ -80,26 +80,7 @@ Qt5Font::Qt5Font(const PhysicalFontFace& rPFF, const 
FontSelectPattern& rFSP)
     }
 }
 
-static hb_blob_t* getFontTable(hb_face_t*, hb_tag_t nTableTag, void* pUserData)
-{
-    char pTagName[5];
-    LogicalFontInstance::DecodeOpenTypeTag(nTableTag, pTagName);
-
-    Qt5Font* pFont = static_cast<Qt5Font*>(pUserData);
-    QRawFont aRawFont(QRawFont::fromFont(*pFont));
-    QByteArray aTable = aRawFont.fontTable(pTagName);
-    const sal_uInt32 nLength = aTable.size();
-
-    hb_blob_t* pBlob = nullptr;
-    if (nLength > 0)
-        pBlob = hb_blob_create(aTable.data(), nLength, 
HB_MEMORY_MODE_DUPLICATE, nullptr, nullptr);
-    return pBlob;
-}
-
-hb_font_t* Qt5Font::ImplInitHbFont()
-{
-    return InitHbFont(hb_face_create_for_tables(getFontTable, this, nullptr));
-}
+hb_font_t* Qt5Font::ImplInitHbFont() { return 
InitHbFont(GetFontFace()->GetHbFace()); }
 
 bool Qt5Font::GetGlyphOutline(sal_GlyphId, basegfx::B2DPolyPolygon&, bool) 
const { return false; }
 
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index a7837667f1dd..ac8bb92bc2ed 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -191,4 +191,18 @@ bool 
Qt5FontFace::GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities)
     return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
 }
 
+hb_blob_t* Qt5FontFace::GetHbTable(const char* pName)
+{
+    QFont aFont;
+    aFont.fromString(m_aFontId);
+    QRawFont aRawFont(QRawFont::fromFont(aFont));
+    QByteArray aTable = aRawFont.fontTable(pName);
+    const sal_uInt32 nLength = aTable.size();
+
+    hb_blob_t* pBlob = nullptr;
+    if (nLength > 0)
+        pBlob = hb_blob_create(aTable.data(), nLength, 
HB_MEMORY_MODE_DUPLICATE, nullptr, nullptr);
+    return pBlob;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 252720a0aa4e..4cb1e3c57b14 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -232,16 +232,15 @@ bool CoreTextStyle::GetGlyphOutline(sal_GlyphId nId, 
basegfx::B2DPolyPolygon& rR
     return true;
 }
 
-static hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* 
pUserData)
+hb_blob_t* CoreTextFontFace::GetHbTable(const char* pName)
 {
     sal_uLong nLength = 0;
     unsigned char* pBuffer = nullptr;
-    CoreTextFontFace* pFont = static_cast<CoreTextFontFace*>(pUserData);
-    nLength = pFont->GetFontTable(nTableTag, nullptr);
+    nLength = GetFontTable(pName, nullptr);
     if (nLength > 0)
     {
         pBuffer = new unsigned char[nLength];
-        pFont->GetFontTable(nTableTag, pBuffer);
+        GetFontTable(pName, pBuffer);
     }
 
     hb_blob_t* pBlob = nullptr;
@@ -253,8 +252,7 @@ static hb_blob_t* getFontTable(hb_face_t* /*face*/, 
hb_tag_t nTableTag, void* pU
 
 hb_font_t* CoreTextStyle::ImplInitHbFont()
 {
-    hb_face_t* pHbFace = hb_face_create_for_tables(getFontTable, 
const_cast<PhysicalFontFace*>(GetFontFace()), nullptr);
-
+    hb_face_t* pHbFace = GetFontFace()->GetHbFace();
     return InitHbFont(pHbFace);
 }
 
diff --git a/vcl/source/font/PhysicalFontFace.cxx 
b/vcl/source/font/PhysicalFontFace.cxx
index b16488ddc88d..33493b63a427 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -26,6 +26,30 @@
 
 #include <PhysicalFontFace.hxx>
 
+namespace {
+
+void DecodeOpenTypeTag(const uint32_t nTableTag, char* pTagName)
+{
+    pTagName[0] = static_cast<char>(nTableTag >> 24);
+    pTagName[1] = static_cast<char>(nTableTag >> 16);
+    pTagName[2] = static_cast<char>(nTableTag >> 8);
+    pTagName[3] = static_cast<char>(nTableTag);
+    pTagName[4] = 0;
+}
+
+hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* 
pUserData)
+{
+    char pTagName[5];
+    DecodeOpenTypeTag(nTableTag, pTagName);
+
+    PhysicalFontFace* pFontFace = static_cast<PhysicalFontFace*>(pUserData);
+    hb_blob_t* pBlob = pFontFace->GetHbTable(pTagName);
+
+    return pBlob;
+}
+
+}
+
 PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
     : FontAttributes( rDFA )
     , mnWidth(0)
@@ -35,6 +59,13 @@ PhysicalFontFace::PhysicalFontFace( const FontAttributes& 
rDFA )
     if( !IsSymbolFont() )
         if ( IsStarSymbol( GetFamilyName() ) )
             SetSymbolFlag( true );
+    mpHbFace = hb_face_create_for_tables(getFontTable, this, nullptr);
+}
+
+PhysicalFontFace::~PhysicalFontFace()
+{
+    if (mpHbFace)
+        hb_face_destroy(mpHbFace);
 }
 
 sal_Int32 PhysicalFontFace::CompareIgnoreSize( const PhysicalFontFace& rOther 
) const
diff --git a/vcl/source/font/fontinstance.cxx b/vcl/source/font/fontinstance.cxx
index 808f2d0a5c27..07aab6c38618 100644
--- a/vcl/source/font/fontinstance.cxx
+++ b/vcl/source/font/fontinstance.cxx
@@ -74,8 +74,6 @@ hb_font_t* LogicalFontInstance::InitHbFont(hb_face_t* pHbFace)
     unsigned int nUPEM = hb_face_get_upem(pHbFace);
     hb_font_set_scale(pHbFont, nUPEM, nUPEM);
     hb_ot_font_set_funcs(pHbFont);
-    // hb_font_t keeps a reference to hb_face_t, so destroy this one.
-    hb_face_destroy(pHbFace);
     return pHbFont;
 }
 
diff --git a/vcl/source/gdi/pdfbuildin_fonts.hxx 
b/vcl/source/gdi/pdfbuildin_fonts.hxx
index 69bdee5dcb9c..a89b7413981b 100644
--- a/vcl/source/gdi/pdfbuildin_fonts.hxx
+++ b/vcl/source/gdi/pdfbuildin_fonts.hxx
@@ -71,6 +71,12 @@ public:
     sal_IntPtr GetFontId() const override { return 
reinterpret_cast<sal_IntPtr>(&mrBuildin); }
 
     static const BuildinFont& Get(int nId) { return m_aBuildinFonts[nId]; }
+
+    hb_blob_t* GetHbTable(const char* /*pName*/) override
+    {
+        assert(false);
+        return hb_blob_get_empty();
+    }
 };
 
 } // namespace pdf
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index cf629c98f26f..695755f7b111 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -387,6 +387,19 @@ rtl::Reference<LogicalFontInstance> 
FreetypeFontFace::CreateFontInstance(const F
     return new FreetypeFontInstance(*this, rFSD);
 }
 
+hb_blob_t* FreetypeFontFace::GetHbTable(const char* pName)
+{
+    sal_uLong nLength = 0;
+    const char* pBuffer = reinterpret_cast<const char*>(
+        mpFreetypeFontInfo->GetTable(pName, &nLength));
+
+    hb_blob_t* pBlob = nullptr;
+    if (pBuffer != nullptr)
+        pBlob = hb_blob_create(pBuffer, nLength, HB_MEMORY_MODE_READONLY, 
nullptr, nullptr);
+
+    return pBlob;
+}
+
 // FreetypeFont
 
 FreetypeFont::FreetypeFont(LogicalFontInstance* pFontInstance, 
FreetypeFontInfo* pFI )
diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx 
b/vcl/unx/generic/glyphs/glyphcache.cxx
index 558e3d8c3323..15326d02d127 100644
--- a/vcl/unx/generic/glyphs/glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/glyphcache.cxx
@@ -278,30 +278,13 @@ FreetypeFontInstance::~FreetypeFontInstance()
 {
 }
 
-static hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* 
pUserData)
-{
-    char pTagName[5];
-    LogicalFontInstance::DecodeOpenTypeTag( nTableTag, pTagName );
-
-    sal_uLong nLength = 0;
-    FreetypeFontInstance* pFontInstance = static_cast<FreetypeFontInstance*>( 
pUserData );
-    FreetypeFont* pFont = pFontInstance->GetFreetypeFont();
-    const char* pBuffer = reinterpret_cast<const char*>(
-        pFont->GetTable(pTagName, &nLength) );
-
-    hb_blob_t* pBlob = nullptr;
-    if (pBuffer != nullptr)
-        pBlob = hb_blob_create(pBuffer, nLength, HB_MEMORY_MODE_READONLY, 
nullptr, nullptr);
-
-    return pBlob;
-}
-
 hb_font_t* FreetypeFontInstance::ImplInitHbFont()
 {
-    hb_font_t* pRet = InitHbFont(hb_face_create_for_tables(getFontTable, this, 
nullptr));
+    hb_face_t* pHbFace = GetFontFace()->GetHbFace();
+    hb_font_t* pHbFont = InitHbFont(pHbFace);
     assert(mpFreetypeFont);
-    mpFreetypeFont->SetFontVariationsOnHBFont(pRet);
-    return pRet;
+    mpFreetypeFont->SetFontVariationsOnHBFont(pHbFont);
+    return pHbFont;
 }
 
 bool FreetypeFontInstance::ImplGetGlyphBoundRect(sal_GlyphId nId, 
tools::Rectangle& rRect, bool bVertical) const
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 343e3f8b6208..f19bb3349d49 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -615,7 +615,8 @@ WinFontFace::WinFontFace( const FontAttributes& rDFS,
     meWinCharSet( eWinCharSet ),
     mnPitchAndFamily( nPitchAndFamily ),
     mbAliasSymbolsHigh( false ),
-    mbAliasSymbolsLow( false )
+    mbAliasSymbolsLow( false ),
+    mhDC( nullptr )
 {
     if( eWinCharSet == SYMBOL_CHARSET )
     {
@@ -649,6 +650,26 @@ sal_IntPtr WinFontFace::GetFontId() const
     return mnId;
 }
 
+hb_blob_t* WinFontFace::GetHbTable(const char* pName)
+{
+    sal_uLong nLength = 0;
+    unsigned char* pBuffer = nullptr;
+
+    const DWORD nTag = CalcTag(pName);
+    nLength = ::GetFontData(hDC, nTag, 0, nullptr, 0);
+    if (nLength > 0 && nLength != GDI_ERROR)
+    {
+        pBuffer = new unsigned char[nLength];
+        ::GetFontData(hDC, nTag, 0, pBuffer, nLength);
+    }
+
+    hb_blob_t* pBlob = nullptr;
+    if (pBuffer != nullptr)
+        pBlob = hb_blob_create(reinterpret_cast<const char*>(pBuffer), 
nLength, HB_MEMORY_MODE_READONLY,
+                               pBuffer, [](void* data){ delete[] 
static_cast<unsigned char*>(data); });
+    return pBlob;
+}
+
 rtl::Reference<LogicalFontInstance> WinFontFace::CreateFontInstance(const 
FontSelectPattern& rFSD) const
 {
     return new WinFontInstance(*this, rFSD);
@@ -662,6 +683,8 @@ void WinFontFace::UpdateFromHDC( HDC hDC ) const
     if( mxUnicodeMap.is() )
         return;
 
+    mhDC = hDC;
+
     ReadCmapTable( hDC );
     GetFontCapabilities( hDC );
 }
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 25949dc0692e..d82c2e89722f 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -327,41 +327,16 @@ float WinFontInstance::getHScale() const
     return nWidth / nHeight;
 }
 
-static hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* 
pUserData)
-{
-    sal_uLong nLength = 0;
-    unsigned char* pBuffer = nullptr;
-    WinFontInstance* pFont = static_cast<WinFontInstance*>(pUserData);
-    HDC hDC = pFont->GetGraphics()->getHDC();
-    HFONT hFont = pFont->GetHFONT();
-    assert(hDC);
-    assert(hFont);
-
-    HGDIOBJ hOrigFont = SelectObject(hDC, hFont);
-    nLength = ::GetFontData(hDC, OSL_NETDWORD(nTableTag), 0, nullptr, 0);
-    if (nLength > 0 && nLength != GDI_ERROR)
-    {
-        pBuffer = new unsigned char[nLength];
-        ::GetFontData(hDC, OSL_NETDWORD(nTableTag), 0, pBuffer, nLength);
-    }
-    SelectObject(hDC, hOrigFont);
-
-    hb_blob_t* pBlob = nullptr;
-    if (pBuffer != nullptr)
-        pBlob = hb_blob_create(reinterpret_cast<const char*>(pBuffer), 
nLength, HB_MEMORY_MODE_READONLY,
-                               pBuffer, [](void* data){ delete[] 
static_cast<unsigned char*>(data); });
-    return pBlob;
-}
-
 hb_font_t* WinFontInstance::ImplInitHbFont()
 {
     assert(m_pGraphics);
-    hb_font_t* pHbFont = InitHbFont(hb_face_create_for_tables(getFontTable, 
this, nullptr));
+    hb_face_t* pHbFace = GetFontFace()->GetHbFace();
+    hb_font_t* pHbFont = InitHbFont(pHbFace);
 
     // Calculate the AverageWidthFactor, see LogicalFontInstance::GetScale().
     if (GetFontSelectPattern().mnWidth)
     {
-        double nUPEM = hb_face_get_upem(hb_font_get_face(pHbFont));
+        double nUPEM = hb_face_get_upem(pHbFace);
 
         LOGFONTW aLogFont;
         GetObjectW(m_hFont, sizeof(LOGFONTW), &aLogFont);
commit e914878270a22031440cf307ea652a35cf17cc4f
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Wed Aug 28 12:50:22 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:33:14 2019 +0200

    Merge GetFontCodeRanges() into GetFontCharMap()
    
    Change-Id: I61d8edf0be492c1c06274c11ac5d2e65415525a9

diff --git a/vcl/inc/unx/freetype_glyphcache.hxx 
b/vcl/inc/unx/freetype_glyphcache.hxx
index 6fd0154d98a7..17084fcf5a75 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -75,7 +75,6 @@ public:
 
     void                  AnnounceFont( PhysicalFontCollection* );
 
-    bool                  GetFontCodeRanges( CmapResult& ) const;
     const FontCharMapRef& GetFontCharMap();
 
 private:
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 24f8d71fd798..cf629c98f26f 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -684,8 +684,11 @@ const FontCharMapRef& FreetypeFontInfo::GetFontCharMap()
 
     // get the charmap and cache it
     CmapResult aCmapResult;
-    bool bOK = GetFontCodeRanges( aCmapResult );
-    if( bOK )
+    aCmapResult.mbSymbolic = IsSymbolFont();
+
+    sal_uLong nLength = 0;
+    const unsigned char* pCmap = GetTable("cmap", &nLength);
+    if (pCmap && (nLength > 0) && ParseCMAP(pCmap, nLength, aCmapResult))
     {
         FontCharMapRef xFontCharMap( new FontCharMap ( aCmapResult ) );
         mxFontCharMap = xFontCharMap;
@@ -699,18 +702,6 @@ const FontCharMapRef& FreetypeFontInfo::GetFontCharMap()
     return mxFontCharMap;
 }
 
-// TODO: merge into method GetFontCharMap()
-bool FreetypeFontInfo::GetFontCodeRanges( CmapResult& rResult ) const
-{
-    rResult.mbSymbolic = IsSymbolFont();
-
-    sal_uLong nLength = 0;
-    const unsigned char* pCmap = GetTable( "cmap", &nLength );
-    if( pCmap && (nLength > 0) )
-        if( ParseCMAP( pCmap, nLength, rResult ) )
-            return true;
-}
-
 bool FreetypeFont::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
 {
     bool bRet = false;
commit 40e762146baad85603a45c4fc8b81bdd72b54f09
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Wed Aug 28 12:46:19 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:33:13 2019 +0200

    Remove effectively dead code
    
    We dropped support for non-SFNT fonts for a while now.
    
    Change-Id: Iaa2ea308effa7328bd84240cf29fc3fd117d418a

diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx 
b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 7c21eada6f18..24f8d71fd798 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -445,9 +445,6 @@ FreetypeFont::FreetypeFont(LogicalFontInstance* 
pFontInstance, FreetypeFontInfo*
     if( mpFontInfo->IsSymbolFont() )
     {
         FT_Encoding eEncoding = FT_ENCODING_MS_SYMBOL;
-        if (!FT_IS_SFNT(maFaceFT))
-            eEncoding = FT_ENCODING_ADOBE_CUSTOM; // freetype wants this for 
PS symbol fonts
-
         FT_Select_Charmap(maFaceFT, eEncoding);
     }
 
@@ -707,48 +704,11 @@ bool FreetypeFontInfo::GetFontCodeRanges( CmapResult& 
rResult ) const
 {
     rResult.mbSymbolic = IsSymbolFont();
 
-    // TODO: is the full CmapResult needed on platforms calling this?
-    if( FT_IS_SFNT( maFaceFT ) )
-    {
-        sal_uLong nLength = 0;
-        const unsigned char* pCmap = GetTable( "cmap", &nLength );
-        if( pCmap && (nLength > 0) )
-            if( ParseCMAP( pCmap, nLength, rResult ) )
-                return true;
-    }
-
-    std::vector<sal_uInt32> aCodes;
-
-    // FT's coverage is available since FT>=2.1.0 (OOo-baseline>=2.1.4 => ok)
-    aCodes.reserve( 0x1000 );
-    FT_UInt nGlyphIndex;
-    for( sal_uInt32 cCode = FT_Get_First_Char( maFaceFT, &nGlyphIndex );; )
-    {
-        if( !nGlyphIndex )
-            break;
-        aCodes.push_back( cCode );  // first code inside range
-        sal_uInt32 cNext;
-        do cNext = FT_Get_Next_Char( maFaceFT, cCode, &nGlyphIndex ); while( 
cNext == ++cCode );
-        aCodes.push_back( cCode );  // first code outside range
-        cCode = cNext;
-    }
-
-    const int nCount = aCodes.size();
-    if( !nCount) {
-        if( !rResult.mbSymbolic )
-            return false;
-
-        // we usually get here for Type1 symbol fonts
-        aCodes.push_back( 0xF020 );
-        aCodes.push_back( 0xF100 );
-    }
-
-    sal_uInt32* pCodes = new sal_uInt32[ nCount ];
-    for( int i = 0; i < nCount; ++i )
-        pCodes[i] = aCodes[i];
-    rResult.mpRangeCodes = pCodes;
-    rResult.mnRangeCount = nCount / 2;
-    return true;
+    sal_uLong nLength = 0;
+    const unsigned char* pCmap = GetTable( "cmap", &nLength );
+    if( pCmap && (nLength > 0) )
+        if( ParseCMAP( pCmap, nLength, rResult ) )
+            return true;
 }
 
 bool FreetypeFont::GetFontCapabilities(vcl::FontCapabilities 
&rFontCapabilities) const
commit 6ce221687a002a3255ce0cb14bec265ae1640e9b
Author:     Khaled Hosny <khaledho...@eglug.org>
AuthorDate: Tue Aug 27 15:19:15 2019 +0200
Commit:     Khaled Hosny <khaledho...@eglug.org>
CommitDate: Tue Sep 3 16:33:13 2019 +0200

    Make Noto Color Emoji font work on Linux
    
    Noto Color Emoji is a bitmap color font, Cairo knows how to scale such
    fonts and FontConfig will identify them as scalable but not outline
    fonts, so change the FontConfig checks to checks for scalability.
    
    Make sft.cxx:doOpenTTFont() accept non-outline fonts, the text will not
    show in PDF but that is not worse than the status quo.
    
    Change-Id: I756c718296d2c43e3165cd2f07b11bbb981318d3

diff --git a/vcl/source/font/fontmetric.cxx b/vcl/source/font/fontmetric.cxx
index 72a5a77cc6fe..4da3575d7597 100644
--- a/vcl/source/font/fontmetric.cxx
+++ b/vcl/source/font/fontmetric.cxx
@@ -381,8 +381,8 @@ void 
ImplFontMetricData::ImplCalcLineSpacing(LogicalFontInstance *pFontInstance)
     if (mnAscent || mnDescent)

... etc. - the rest is truncated
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to