vcl/inc/quartz/salgdi.h | 2 + vcl/quartz/ctfonts.cxx | 46 ++++++++++++++++++++++++- vcl/unx/generic/glyphs/freetype_glyphcache.cxx | 4 +- 3 files changed, 49 insertions(+), 3 deletions(-)
New commits: commit 30a8f7e97d41d60098dbd14118d4f56c5557c06d Author: Khaled Hosny <[email protected]> AuthorDate: Fri Sep 2 01:47:23 2022 +0200 Commit: خالد حسني <[email protected]> CommitDate: Fri Sep 2 10:09:35 2022 +0200 vcl: set hb_font_t variations from CTFont Without this we will be using the interpolated outlines (done by core text) but apply OpenType features from the default instance. Change-Id: I7a39b5483ba0f35b440841ffa07f587ad966bbf6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139248 Tested-by: Jenkins Reviewed-by: خالد حسني <[email protected]> diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h index 569a14a6d3fc..29739adf33eb 100644 --- a/vcl/inc/quartz/salgdi.h +++ b/vcl/inc/quartz/salgdi.h @@ -107,6 +107,8 @@ private: hb_font_t* ImplInitHbFont() override; bool ImplGetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool) const override; + void SetFontVariationsOnHBFont(hb_font_t*) const; + /// CoreText text style object CFMutableDictionaryRef mpStyleDict; }; diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx index 7985905cc404..e5db219c3f8d 100644 --- a/vcl/quartz/ctfonts.cxx +++ b/vcl/quartz/ctfonts.cxx @@ -251,11 +251,55 @@ static hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* pU return pBlob; } +void CoreTextStyle::SetFontVariationsOnHBFont(hb_font_t* pHbFont) const +{ + + CTFontRef aCTFontRef = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName )); + + CFArrayRef pAxes = CTFontCopyVariationAxes(aCTFontRef); + if (!pAxes) + return; + + CFDictionaryRef pVariations = CTFontCopyVariation(aCTFontRef); + std::vector<hb_variation_t> aHBVariations; + if (pVariations) + { + CFIndex nAxes = CFArrayGetCount(pAxes); + for (CFIndex i = 0; i < nAxes; ++i) + { + auto pAxis = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(pAxes, i)); + if (pAxis) + { + hb_tag_t nTag; + auto pTag = static_cast<CFNumberRef>(CFDictionaryGetValue(pAxis, kCTFontVariationAxisIdentifierKey)); + if (!pTag) + continue; + CFNumberGetValue(pTag, kCFNumberIntType, &nTag); + + float fValue; + auto pValue = static_cast<CFNumberRef>(CFDictionaryGetValue(pVariations, pTag)); + if (!pValue) + continue; + CFNumberGetValue(pValue, kCFNumberFloatType, &fValue); + + aHBVariations.push_back({ nTag, fValue }); + } + } + CFRelease(pVariations); + } + CFRelease(pAxes); + + if (!aHBVariations.empty()) + hb_font_set_variations(pHbFont, aHBVariations.data(), aHBVariations.size()); +} + hb_font_t* CoreTextStyle::ImplInitHbFont() { hb_face_t* pHbFace = hb_face_create_for_tables(getFontTable, GetFontFace(), nullptr); + hb_font_t* pHBFont = InitHbFont(pHbFace); + SetFontVariationsOnHBFont(pHBFont); - return InitHbFont(pHbFace); + return pHBFont; } rtl::Reference<LogicalFontInstance> CoreTextFontFace::CreateFontInstance(const vcl::font::FontSelectPattern& rFSD) const diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx index a995a0fe1f2b..693d7a646436 100644 --- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx +++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx @@ -212,7 +212,7 @@ FT_FaceRec_* FreetypeFontInfo::GetFaceFT() return maFaceFT; } -void FreetypeFont::SetFontVariationsOnHBFont(hb_font_t* pHbFace) const +void FreetypeFont::SetFontVariationsOnHBFont(hb_font_t* pHbFont) const { sal_uInt32 nFaceVariation = mxFontInfo->GetFontFaceVariation(); if (!(maFaceFT && nFaceVariation)) @@ -231,7 +231,7 @@ void FreetypeFont::SetFontVariationsOnHBFont(hb_font_t* pHbFace) const aVariations[i].tag = pFtMMVar->axis[i].tag; aVariations[i].value = instance->coords[i] / 65536.0; } - hb_font_set_variations(pHbFace, aVariations.data(), aVariations.size()); + hb_font_set_variations(pHbFont, aVariations.data(), aVariations.size()); } dlFT_Done_MM_Var(aLibFT, pFtMMVar); }
