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;