cui/source/dialogs/FontFeaturesDialog.cxx | 4 +- include/vcl/font/Feature.hxx | 11 +------ vcl/inc/font/FeatureCollector.hxx | 4 -- vcl/qa/cppunit/FontFeatureTest.cxx | 19 +++--------- vcl/source/font/Feature.cxx | 6 +-- vcl/source/font/FeatureCollector.cxx | 47 ++++-------------------------- vcl/workben/listfonts.cxx | 9 +---- 7 files changed, 22 insertions(+), 78 deletions(-)
New commits: commit 7581fcde3c6a8d098a37b2c89c74e54696d4c346 Author: Khaled Hosny <kha...@aliftype.com> AuthorDate: Tue Aug 23 22:35:10 2022 +0200 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Aug 25 13:02:14 2022 +0200 FeatureCollector: Simplify We are not using the script or language information for anything, so we can use HarfBuzz API to query the GSUB/GPOS tables directly. Change-Id: Ie68c51a1662494ba33ec192edb78afa0d8added4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138745 Tested-by: خالد حسني <kha...@aliftype.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/cui/source/dialogs/FontFeaturesDialog.cxx b/cui/source/dialogs/FontFeaturesDialog.cxx index 53ca5f12f3c1..a23c0083c1b3 100644 --- a/cui/source/dialogs/FontFeaturesDialog.cxx +++ b/cui/source/dialogs/FontFeaturesDialog.cxx @@ -58,7 +58,7 @@ void FontFeaturesDialog::initialize() for (vcl::font::Feature const& rFontFeature : rFontFeatures) { - sal_uInt32 nFontFeatureCode = rFontFeature.m_aID.m_aFeatureCode; + sal_uInt32 nFontFeatureCode = rFontFeature.m_nCode; if (!aDoneFeatures.insert(nFontFeatureCode).second) continue; rFilteredFontFeatures.push_back(rFontFeature); @@ -90,7 +90,7 @@ int FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFea sal_Int32 i = 0; for (vcl::font::Feature const& rFontFeature : rFontFeatures) { - sal_uInt32 nFontFeatureCode = rFontFeature.m_aID.m_aFeatureCode; + sal_uInt32 nFontFeatureCode = rFontFeature.m_nCode; vcl::font::FeatureDefinition aDefinition; if (rFontFeature.m_aDefinition) diff --git a/include/vcl/font/Feature.hxx b/include/vcl/font/Feature.hxx index addc4836e6ee..acb70bfe6980 100644 --- a/include/vcl/font/Feature.hxx +++ b/include/vcl/font/Feature.hxx @@ -85,19 +85,12 @@ public: operator bool() const; }; -struct VCL_DLLPUBLIC FeatureID -{ - uint32_t m_aFeatureCode; - uint32_t m_aScriptCode; - uint32_t m_aLanguageCode; -}; - struct Feature { Feature(); - Feature(FeatureID const& rID, FeatureType eType); + Feature(uint32_t const nCode, FeatureType eType); - FeatureID m_aID; + uint32_t m_nCode; FeatureType m_eType; FeatureDefinition m_aDefinition; }; diff --git a/vcl/inc/font/FeatureCollector.hxx b/vcl/inc/font/FeatureCollector.hxx index 9148048f1601..976a89fc8d86 100644 --- a/vcl/inc/font/FeatureCollector.hxx +++ b/vcl/inc/font/FeatureCollector.hxx @@ -34,10 +34,6 @@ public: } private: - void collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript, hb_tag_t aScriptTag, - sal_uInt32 nLanguage, hb_tag_t aLanguageTag); - - void collectForScript(hb_tag_t aTableTag, sal_uInt32 nScript, hb_tag_t aScriptTag); void collectForTable(hb_tag_t aTableTag); bool collectGraphite(); diff --git a/vcl/qa/cppunit/FontFeatureTest.cxx b/vcl/qa/cppunit/FontFeatureTest.cxx index 0e9ada19cdd4..91bcda29b74f 100644 --- a/vcl/qa/cppunit/FontFeatureTest.cxx +++ b/vcl/qa/cppunit/FontFeatureTest.cxx @@ -54,20 +54,13 @@ void FontFeatureTest::testGetFontFeatures() std::vector<vcl::font::Feature> rFontFeatures; CPPUNIT_ASSERT(aVDev->GetFontFeatures(rFontFeatures)); - // We're interested only in defaults here - std::vector<vcl::font::Feature> rDefaultFontFeatures; OUString aFeaturesString; for (vcl::font::Feature const& rFeature : rFontFeatures) { - if (rFeature.m_aID.m_aScriptCode == vcl::font::featureCode("DFLT") - && rFeature.m_aID.m_aLanguageCode == vcl::font::featureCode("dflt")) - { - rDefaultFontFeatures.push_back(rFeature); - aFeaturesString += vcl::font::featureCodeAsString(rFeature.m_aID.m_aFeatureCode) + " "; - } + aFeaturesString += vcl::font::featureCodeAsString(rFeature.m_nCode) + " "; } - CPPUNIT_ASSERT_EQUAL(size_t(53), rDefaultFontFeatures.size()); + CPPUNIT_ASSERT_EQUAL(size_t(53), rFontFeatures.size()); CPPUNIT_ASSERT_EQUAL(OUString("c2sc case dlig fina frac hlig liga lnum " "locl onum pnum sa01 sa02 sa03 sa04 sa05 " @@ -80,8 +73,8 @@ void FontFeatureTest::testGetFontFeatures() // Check C2SC feature { - vcl::font::Feature& rFeature = rDefaultFontFeatures[0]; - CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("c2sc"), rFeature.m_aID.m_aFeatureCode); + vcl::font::Feature& rFeature = rFontFeatures[0]; + CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("c2sc"), rFeature.m_nCode); vcl::font::FeatureDefinition& rFracFeatureDefinition = rFeature.m_aDefinition; CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("c2sc"), rFracFeatureDefinition.getCode()); @@ -94,8 +87,8 @@ void FontFeatureTest::testGetFontFeatures() // Check FRAC feature { - vcl::font::Feature& rFeature = rDefaultFontFeatures[4]; - CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("frac"), rFeature.m_aID.m_aFeatureCode); + vcl::font::Feature& rFeature = rFontFeatures[4]; + CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("frac"), rFeature.m_nCode); vcl::font::FeatureDefinition& rFracFeatureDefinition = rFeature.m_aDefinition; CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("frac"), rFracFeatureDefinition.getCode()); diff --git a/vcl/source/font/Feature.cxx b/vcl/source/font/Feature.cxx index 3d4fd8c386c4..ece71df8ed8a 100644 --- a/vcl/source/font/Feature.cxx +++ b/vcl/source/font/Feature.cxx @@ -29,13 +29,13 @@ OUString featureCodeAsString(uint32_t nFeature) // Feature Feature::Feature() - : m_aID({ 0, 0, 0 }) + : m_nCode(0) , m_eType(FeatureType::OpenType) { } -Feature::Feature(FeatureID const& rID, FeatureType eType) - : m_aID(rID) +Feature::Feature(uint32_t nCode, FeatureType eType) + : m_nCode(nCode) , m_eType(eType) { } diff --git a/vcl/source/font/FeatureCollector.cxx b/vcl/source/font/FeatureCollector.cxx index 5ea55d9077e8..20f47dfdc502 100644 --- a/vcl/source/font/FeatureCollector.cxx +++ b/vcl/source/font/FeatureCollector.cxx @@ -69,9 +69,7 @@ bool FeatureCollector::collectGraphite() aParameters.clear(); } - m_rFontFeatures.emplace_back( - FeatureID{ nFeatureCode, HB_OT_TAG_DEFAULT_SCRIPT, HB_OT_TAG_DEFAULT_LANGUAGE }, - vcl::font::FeatureType::Graphite); + m_rFontFeatures.emplace_back(nFeatureCode, vcl::font::FeatureType::Graphite); vcl::font::Feature& rFeature = m_rFontFeatures.back(); rFeature.m_aDefinition = vcl::font::FeatureDefinition(nFeatureCode, sLabel, eFeatureParameterType, @@ -82,15 +80,13 @@ bool FeatureCollector::collectGraphite() return true; } -void FeatureCollector::collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript, - hb_tag_t aScriptTag, sal_uInt32 nLanguage, - hb_tag_t aLanguageTag) +void FeatureCollector::collectForTable(hb_tag_t aTableTag) { - unsigned int nFeatureCount = hb_ot_layout_language_get_feature_tags( - m_pHbFace, aTableTag, nScript, nLanguage, 0, nullptr, nullptr); + unsigned int nFeatureCount + = hb_ot_layout_table_get_feature_tags(m_pHbFace, aTableTag, 0, nullptr, nullptr); std::vector<hb_tag_t> aFeatureTags(nFeatureCount); - hb_ot_layout_language_get_feature_tags(m_pHbFace, aTableTag, nScript, nLanguage, 0, - &nFeatureCount, aFeatureTags.data()); + hb_ot_layout_table_get_feature_tags(m_pHbFace, aTableTag, 0, &nFeatureCount, + aFeatureTags.data()); aFeatureTags.resize(nFeatureCount); for (hb_tag_t aFeatureTag : aFeatureTags) @@ -100,43 +96,14 @@ void FeatureCollector::collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript m_rFontFeatures.emplace_back(); vcl::font::Feature& rFeature = m_rFontFeatures.back(); - rFeature.m_aID = { aFeatureTag, aScriptTag, aLanguageTag }; + rFeature.m_nCode = aFeatureTag; FeatureDefinition aDefinition = OpenTypeFeatureDefinitionList().getDefinition(aFeatureTag); if (aDefinition) - { rFeature.m_aDefinition = aDefinition; - } } } -void FeatureCollector::collectForScript(hb_tag_t aTableTag, sal_uInt32 nScript, hb_tag_t aScriptTag) -{ - collectForLanguage(aTableTag, nScript, aScriptTag, HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, - HB_OT_TAG_DEFAULT_LANGUAGE); - - unsigned int nLanguageCount - = hb_ot_layout_script_get_language_tags(m_pHbFace, aTableTag, nScript, 0, nullptr, nullptr); - std::vector<hb_tag_t> aLanguageTags(nLanguageCount); - hb_ot_layout_script_get_language_tags(m_pHbFace, aTableTag, nScript, 0, &nLanguageCount, - aLanguageTags.data()); - aLanguageTags.resize(nLanguageCount); - for (sal_uInt32 nLanguage = 0; nLanguage < sal_uInt32(nLanguageCount); ++nLanguage) - collectForLanguage(aTableTag, nScript, aScriptTag, nLanguage, aLanguageTags[nLanguage]); -} - -void FeatureCollector::collectForTable(hb_tag_t aTableTag) -{ - unsigned int nScriptCount - = hb_ot_layout_table_get_script_tags(m_pHbFace, aTableTag, 0, nullptr, nullptr); - std::vector<hb_tag_t> aScriptTags(nScriptCount); - hb_ot_layout_table_get_script_tags(m_pHbFace, aTableTag, 0, &nScriptCount, aScriptTags.data()); - aScriptTags.resize(nScriptCount); - - for (sal_uInt32 nScript = 0; nScript < sal_uInt32(nScriptCount); ++nScript) - collectForScript(aTableTag, nScript, aScriptTags[nScript]); -} - bool FeatureCollector::collect() { gr_face* grFace = hb_graphite2_face_get_gr_face(m_pHbFace); diff --git a/vcl/workben/listfonts.cxx b/vcl/workben/listfonts.cxx index b76bdd4a2c92..00ab5a39120d 100644 --- a/vcl/workben/listfonts.cxx +++ b/vcl/workben/listfonts.cxx @@ -397,13 +397,8 @@ int ListFonts::Main() std::cout << "\t" << (feature.m_eType == vcl::font::FeatureType::OpenType ? "OpenType" : "Graphite") - << " Feature:\n\t\tId = { feature code = " - << vcl::font::featureCodeAsString(feature.m_aID.m_aFeatureCode) - << ", script code = " - << vcl::font::featureCodeAsString(feature.m_aID.m_aScriptCode) - << ", language code = " - << vcl::font::featureCodeAsString(feature.m_aID.m_aLanguageCode) - << " }\n"; + << " Feature:\n\t\t" + << vcl::font::featureCodeAsString(feature.m_nCode) << "\n"; std::cout << "\t\tDescription: " << feature.m_aDefinition.getDescription() << "\n";