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";

Reply via email to