vcl/inc/font/PhysicalFontFace.hxx    |   30 ++++++++++++++++++++++++++++++
 vcl/source/font/PhysicalFontFace.cxx |   27 ++++++++++-----------------
 vcl/source/font/fontmetric.cxx       |   17 +++++------------
 3 files changed, 45 insertions(+), 29 deletions(-)

New commits:
commit aa0a71b5cec118d4a4a922f6833ff20d7e4ba8ba
Author:     Khaled Hosny <kha...@aliftype.com>
AuthorDate: Sat Sep 10 23:15:55 2022 +0200
Commit:     خالد حسني <kha...@aliftype.com>
CommitDate: Sun Sep 11 09:51:29 2022 +0200

    vcl: Add PhysicalFontFace::GetRawFontData()
    
    Change-Id: Iddeccfc8ffd5e63f7df09219ac4507502011fb28
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139626
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Reviewed-by: خالد حسني <kha...@aliftype.com>

diff --git a/vcl/inc/font/PhysicalFontFace.hxx 
b/vcl/inc/font/PhysicalFontFace.hxx
index 396178c5e40d..3f59dd3b25e4 100644
--- a/vcl/inc/font/PhysicalFontFace.hxx
+++ b/vcl/inc/font/PhysicalFontFace.hxx
@@ -55,6 +55,34 @@ public:
     const OUString* mpTargetStyleName;
 };
 
+struct RawFontData
+{
+public:
+    RawFontData(hb_blob_t* pBlob = nullptr)
+        : mpBlob(pBlob ? pBlob : hb_blob_get_empty())
+    {
+    }
+
+    ~RawFontData() { hb_blob_destroy(mpBlob); }
+
+    RawFontData& operator=(const RawFontData& rOther)
+    {
+        hb_blob_destroy(mpBlob);
+        mpBlob = hb_blob_reference(rOther.mpBlob);
+        return *this;
+    }
+
+    size_t size() const { return hb_blob_get_length(mpBlob); }
+    bool empty() const { return size() == 0; }
+    const uint8_t* data() const
+    {
+        return reinterpret_cast<const uint8_t*>(hb_blob_get_data(mpBlob, 
nullptr));
+    }
+
+private:
+    hb_blob_t* mpBlob;
+};
+
 // TODO: no more direct access to members
 // TODO: get rid of height/width for scalable fonts
 // TODO: make cloning cheaper
@@ -78,6 +106,8 @@ public:
     virtual FontCharMapRef GetFontCharMap() const;
     virtual bool GetFontCapabilities(vcl::FontCapabilities&) const;
 
+    RawFontData GetRawFontData(uint32_t) const;
+
     bool IsBetterMatch(const vcl::font::FontSelectPattern&, FontMatchStatus&) 
const;
     sal_Int32 CompareIgnoreSize(const PhysicalFontFace&) const;
 
diff --git a/vcl/source/font/PhysicalFontFace.cxx 
b/vcl/source/font/PhysicalFontFace.cxx
index 88670f6e0ff6..88ec43fa2bd5 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -212,6 +212,11 @@ bool PhysicalFontFace::IsBetterMatch(const 
FontSelectPattern& rFSP, FontMatchSta
     return true;
 }
 
+RawFontData PhysicalFontFace::GetRawFontData(uint32_t nTag) const
+{
+    return RawFontData(hb_face_reference_table(GetHbFace(), nTag));
+}
+
 static hb_blob_t* getTable(hb_face_t*, hb_tag_t nTag, void* pUserData)
 {
     return static_cast<const PhysicalFontFace*>(pUserData)->GetHbTable(nTag);
@@ -232,15 +237,8 @@ FontCharMapRef PhysicalFontFace::GetFontCharMap() const
 
     // Check if this font is using symbol cmap subtable, most likely redundant
     // since HarfBuzz handles mapping symbol fonts for us.
-    bool bSymbol = false;
-    hb_blob_t* pBlob = GetHbTable(HB_TAG('c', 'm', 'a', 'p'));
-    if (pBlob)
-    {
-        unsigned int nSize = 0;
-        auto* pData = reinterpret_cast<const unsigned 
char*>(hb_blob_get_data(pBlob, &nSize));
-        bSymbol = HasSymbolCmap(pData, nSize);
-        hb_blob_destroy(pBlob);
-    }
+    RawFontData aData(GetRawFontData(HB_TAG('c', 'm', 'a', 'p')));
+    bool bSymbol = HasSymbolCmap(aData.data(), aData.size());
 
     hb_face_t* pHbFace = GetHbFace();
     hb_set_t* pUnicodes = hb_set_create();
@@ -274,14 +272,9 @@ bool 
PhysicalFontFace::GetFontCapabilities(vcl::FontCapabilities& rFontCapabilit
     {
         mbFontCapabilitiesRead = true;
 
-        hb_blob_t* pBlob = GetHbTable(HB_TAG('O', 'S', '/', '2'));
-        if (pBlob)
-        {
-            unsigned int nSize = 0;
-            auto* pData = reinterpret_cast<const unsigned 
char*>(hb_blob_get_data(pBlob, &nSize));
-            vcl::getTTCoverage(maFontCapabilities.oUnicodeRange, 
maFontCapabilities.oCodePageRange,
-                               pData, nSize);
-        }
+        RawFontData aData(GetRawFontData(HB_TAG('O', 'S', '/', '2')));
+        getTTCoverage(maFontCapabilities.oUnicodeRange, 
maFontCapabilities.oCodePageRange,
+                      aData.data(), aData.size());
     }
 
     rFontCapabilities = maFontCapabilities;
diff --git a/vcl/source/font/fontmetric.cxx b/vcl/source/font/fontmetric.cxx
index 4f398ba76a57..2d918d4dca68 100644
--- a/vcl/source/font/fontmetric.cxx
+++ b/vcl/source/font/fontmetric.cxx
@@ -372,22 +372,15 @@ bool ImplFontMetricData::ShouldUseWinMetrics(const 
vcl::TTGlobalFontInfo& rInfo)
 void ImplFontMetricData::ImplCalcLineSpacing(LogicalFontInstance 
*pFontInstance)
 {
     mnAscent = mnDescent = mnExtLeading = mnIntLeading = 0;
+    auto* pFace = pFontInstance->GetFontFace();
 
-    hb_font_t* pHbFont = pFontInstance->GetHbFont();
-    hb_face_t* pHbFace = hb_font_get_face(pHbFont);
-
-    hb_blob_t* pHhea = hb_face_reference_table(pHbFace, HB_TAG('h', 'h', 'e', 
'a'));
-    hb_blob_t* pOS2 = hb_face_reference_table(pHbFace, HB_TAG('O', 'S', '/', 
'2'));
+    auto aHhea(pFace->GetRawFontData(HB_TAG('h', 'h', 'e', 'a')));
+    auto aOS_2(pFace->GetRawFontData(HB_TAG('O', 'S', '/', '2')));
 
     vcl::TTGlobalFontInfo rInfo = {};
-    GetTTFontMetrics(reinterpret_cast<const uint8_t*>(hb_blob_get_data(pHhea, 
nullptr)), hb_blob_get_length(pHhea),
-                     reinterpret_cast<const uint8_t*>(hb_blob_get_data(pOS2, 
nullptr)), hb_blob_get_length(pOS2),
-                     &rInfo);
+    GetTTFontMetrics(aHhea.data(), aHhea.size(), aOS_2.data(), aOS_2.size(), 
&rInfo);
 
-    hb_blob_destroy(pHhea);
-    hb_blob_destroy(pOS2);
-
-    double nUPEM = hb_face_get_upem(pHbFace);
+    double nUPEM = hb_face_get_upem(pFace->GetHbFace());
     double fScale = mnHeight / nUPEM;
     double fAscent = 0, fDescent = 0, fExtLeading = 0;
 

Reply via email to