cui/source/dialogs/FontFeaturesDialog.cxx |   11 +++++++----
 cui/source/inc/FontFeaturesDialog.hxx     |    4 ++--
 include/vcl/font/Feature.hxx              |    6 +++---
 include/vcl/font/FeatureParser.hxx        |    2 +-
 vcl/source/font/Feature.cxx               |   10 +++++-----
 vcl/source/font/FeatureCollector.cxx      |    2 +-
 vcl/source/font/FeatureParser.cxx         |    9 +++------
 7 files changed, 22 insertions(+), 22 deletions(-)

New commits:
commit 783f166793915a1c5a008de7142f773ad3898683
Author:     Khaled Hosny <kha...@aliftype.com>
AuthorDate: Tue Aug 23 14:22:23 2022 +0200
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Tue Aug 23 16:59:56 2022 +0200

    tdf#127423: Allow disabling default features in Font Features dialog
    
    In OpenType fonts we have no way if detecting what features are on by
    default and what not (short of hard-coding this, since HarfBuzz has no
    API of giving us this information, and it is also not a fixed set
    per-font, depends also on the text being shaped).
    
    The dialog currently does not differentiate between a disabled feature
    and unset feature. To make this distinction, feature value is now signed
    and negative value means the feature is unset (i.e. the default is
    used), and the checkbox is now a try state one to reflect this.
    
    Change-Id: Iba5d13f02610e7b761677acc19872788c72afde1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138729
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/cui/source/dialogs/FontFeaturesDialog.cxx 
b/cui/source/dialogs/FontFeaturesDialog.cxx
index 0d5d512bf053..53ca5f12f3c1 100644
--- a/cui/source/dialogs/FontFeaturesDialog.cxx
+++ b/cui/source/dialogs/FontFeaturesDialog.cxx
@@ -100,7 +100,7 @@ int 
FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFea
 
         m_aFeatureItems.emplace_back(m_xContentGrid.get());
 
-        uint32_t nValue = 0;
+        int32_t nValue = 0;
         if (aExistingFeatures.find(nFontFeatureCode) != 
aExistingFeatures.end())
             nValue = aExistingFeatures.at(nFontFeatureCode);
         else
@@ -133,7 +133,10 @@ int 
FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFea
         }
         else
         {
-            aCurrentItem.m_xCheck->set_active(nValue > 0);
+            if (nValue < 0)
+                aCurrentItem.m_xCheck->set_state(TRISTATE_INDET);
+            else
+                aCurrentItem.m_xCheck->set_state(nValue > 0 ? TRISTATE_TRUE : 
TRISTATE_FALSE);
             aCurrentItem.m_xCheck->set_label(aDefinition.getDescription());
             aCurrentItem.m_xCheck->connect_toggled(aCheckBoxToggleHandler);
             aCurrentItem.m_xCheck->show();
@@ -183,7 +186,7 @@ OUString FontFeaturesDialog::createFontNameWithFeatures()
     {
         if (rItem.m_xCheck->get_visible())
         {
-            if (sal_uInt32(rItem.m_xCheck->get_active()) != rItem.m_nDefault)
+            if (rItem.m_xCheck->get_state() != TRISTATE_INDET)
             {
                 if (!bFirst)
                     sNameSuffix.append(vcl::font::FeatureSeparator);
@@ -191,7 +194,7 @@ OUString FontFeaturesDialog::createFontNameWithFeatures()
                     bFirst = false;
 
                 
sNameSuffix.append(vcl::font::featureCodeAsString(rItem.m_aFeatureCode));
-                if (!rItem.m_xCheck->get_active())
+                if (rItem.m_xCheck->get_state() == TRISTATE_FALSE)
                     sNameSuffix.append("=0");
             }
         }
diff --git a/cui/source/inc/FontFeaturesDialog.hxx 
b/cui/source/inc/FontFeaturesDialog.hxx
index f542566ae2f5..6b30a33111b2 100644
--- a/cui/source/inc/FontFeaturesDialog.hxx
+++ b/cui/source/inc/FontFeaturesDialog.hxx
@@ -22,7 +22,7 @@ struct FontFeatureItem
 {
     FontFeatureItem(weld::Widget* pParent)
         : m_aFeatureCode(0)
-        , m_nDefault(0)
+        , m_nDefault(-1)
         , m_xBuilder(Application::CreateBuilder(pParent, 
"cui/ui/fontfragment.ui"))
         , m_xContainer(m_xBuilder->weld_widget("fontentry"))
         , m_xText(m_xBuilder->weld_label("label"))
@@ -32,7 +32,7 @@ struct FontFeatureItem
     }
 
     sal_uInt32 m_aFeatureCode;
-    sal_uInt32 m_nDefault;
+    sal_Int32 m_nDefault;
     std::unique_ptr<weld::Builder> m_xBuilder;
     std::unique_ptr<weld::Widget> m_xContainer;
     std::unique_ptr<weld::Label> m_xText;
diff --git a/include/vcl/font/Feature.hxx b/include/vcl/font/Feature.hxx
index e66c7e2a4d72..addc4836e6ee 100644
--- a/include/vcl/font/Feature.hxx
+++ b/include/vcl/font/Feature.hxx
@@ -59,7 +59,7 @@ private:
     TranslateId m_pDescriptionID;
     OUString m_sNumericPart;
     uint32_t m_nCode;
-    uint32_t m_nDefault;
+    int32_t m_nDefault;
     FeatureParameterType m_eType;
     // the index of the parameter defines the enum value, string is the 
description
     std::vector<FeatureParameter> m_aEnumParameters;
@@ -70,7 +70,7 @@ public:
                       FeatureParameterType eType = FeatureParameterType::BOOL,
                       std::vector<FeatureParameter>&& rEnumParameters
                       = std::vector<FeatureParameter>{},
-                      uint32_t nDefault = 0);
+                      int32_t nDefault = -1);
     FeatureDefinition(uint32_t nCode, TranslateId pDescriptionID,
                       OUString aNumericPart = OUString());
     FeatureDefinition(uint32_t nCode, TranslateId pDescriptionID,
@@ -80,7 +80,7 @@ public:
     uint32_t getCode() const;
     OUString getDescription() const;
     FeatureParameterType getType() const;
-    uint32_t getDefault() const;
+    int32_t getDefault() const;
 
     operator bool() const;
 };
diff --git a/include/vcl/font/FeatureParser.hxx 
b/include/vcl/font/FeatureParser.hxx
index 93fe6eabe261..d69baf0e7a2b 100644
--- a/include/vcl/font/FeatureParser.hxx
+++ b/include/vcl/font/FeatureParser.hxx
@@ -38,7 +38,7 @@ public:
 
     std::vector<FeatureSetting> const& getFeatures() const { return 
m_aFeatures; }
 
-    std::unordered_map<uint32_t, uint32_t> getFeaturesMap() const;
+    std::unordered_map<uint32_t, int32_t> getFeaturesMap() const;
 };
 
 } // namespace vcl::font
diff --git a/vcl/source/font/Feature.cxx b/vcl/source/font/Feature.cxx
index ac2592f12f99..3d4fd8c386c4 100644
--- a/vcl/source/font/Feature.cxx
+++ b/vcl/source/font/Feature.cxx
@@ -89,7 +89,7 @@ uint32_t FeatureParameter::getCode() const { return m_nCode; }
 
 FeatureDefinition::FeatureDefinition()
     : m_nCode(0)
-    , m_nDefault(0)
+    , m_nDefault(-1)
     , m_eType(FeatureParameterType::BOOL)
 {
 }
@@ -97,7 +97,7 @@ FeatureDefinition::FeatureDefinition()
 FeatureDefinition::FeatureDefinition(uint32_t nCode, OUString aDescription,
                                      FeatureParameterType eType,
                                      std::vector<FeatureParameter>&& 
rEnumParameters,
-                                     uint32_t nDefault)
+                                     int32_t nDefault)
     : m_sDescription(std::move(aDescription))
     , m_nCode(nCode)
     , m_nDefault(nDefault)
@@ -111,7 +111,7 @@ FeatureDefinition::FeatureDefinition(uint32_t nCode, 
TranslateId pDescriptionID,
     : m_pDescriptionID(pDescriptionID)
     , m_sNumericPart(std::move(aNumericPart))
     , m_nCode(nCode)
-    , m_nDefault(0)
+    , m_nDefault(-1)
     , m_eType(FeatureParameterType::BOOL)
 {
 }
@@ -120,7 +120,7 @@ FeatureDefinition::FeatureDefinition(uint32_t nCode, 
TranslateId pDescriptionID,
                                      std::vector<FeatureParameter> 
aEnumParameters)
     : m_pDescriptionID(pDescriptionID)
     , m_nCode(nCode)
-    , m_nDefault(0)
+    , m_nDefault(-1)
     , m_eType(FeatureParameterType::ENUM)
     , m_aEnumParameters(std::move(aEnumParameters))
 {
@@ -156,7 +156,7 @@ FeatureParameterType FeatureDefinition::getType() const { 
return m_eType; }
 
 FeatureDefinition::operator bool() const { return m_nCode != 0; }
 
-uint32_t FeatureDefinition::getDefault() const { return m_nDefault; }
+int32_t FeatureDefinition::getDefault() const { return m_nDefault; }
 } // end vcl::font namespace
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/font/FeatureCollector.cxx 
b/vcl/source/font/FeatureCollector.cxx
index 6cb1b14c52cd..5ea55d9077e8 100644
--- a/vcl/source/font/FeatureCollector.cxx
+++ b/vcl/source/font/FeatureCollector.cxx
@@ -75,7 +75,7 @@ bool FeatureCollector::collectGraphite()
             vcl::font::Feature& rFeature = m_rFontFeatures.back();
             rFeature.m_aDefinition
                 = vcl::font::FeatureDefinition(nFeatureCode, sLabel, 
eFeatureParameterType,
-                                               std::move(aParameters), 
sal_uInt32(nValue));
+                                               std::move(aParameters), 
int32_t(nValue));
         }
     }
     gr_featureval_destroy(pfeatureValues);
diff --git a/vcl/source/font/FeatureParser.cxx 
b/vcl/source/font/FeatureParser.cxx
index 5182cea7aace..697662032f75 100644
--- a/vcl/source/font/FeatureParser.cxx
+++ b/vcl/source/font/FeatureParser.cxx
@@ -54,14 +54,11 @@ FeatureParser::FeatureParser(std::u16string_view rFontName)
     } while (nIndex >= 0);
 }
 
-std::unordered_map<uint32_t, uint32_t> FeatureParser::getFeaturesMap() const
+std::unordered_map<uint32_t, int32_t> FeatureParser::getFeaturesMap() const
 {
-    std::unordered_map<uint32_t, uint32_t> aResultMap;
+    std::unordered_map<uint32_t, int32_t> aResultMap;
     for (auto const& rFeat : m_aFeatures)
-    {
-        if (rFeat.m_nValue != 0)
-            aResultMap.emplace(rFeat.m_nTag, rFeat.m_nValue);
-    }
+        aResultMap.emplace(rFeat.m_nTag, rFeat.m_nValue);
     return aResultMap;
 }
 

Reply via email to