include/docmodel/color/ComplexColor.hxx           |    2 
 include/vcl/font/Feature.hxx                      |   24 ++++--
 sc/source/ui/view/formatsh.cxx                    |    4 -
 vcl/inc/font/OpenTypeFeatureDefinitionList.hxx    |   23 +-----
 vcl/source/font/FeatureCollector.cxx              |    4 -
 vcl/source/font/OpenTypeFeatureDefinitionList.cxx |   76 +++++++++-------------
 6 files changed, 56 insertions(+), 77 deletions(-)

New commits:
commit 87e8e65155bcbd80041a2c3ebf4d4bf6dbf81419
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Sun Jan 4 14:44:06 2026 +0900
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Mon Feb 23 14:08:33 2026 +0100

    clean-up weirdly formatted line
    
    Change-Id: Ic84a0ccef3b05e1b5cb171a32d16864bbd025054
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196518
    Reviewed-by: Tomaž Vajngerl <[email protected]>
    Tested-by: Tomaž Vajngerl <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200023
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sc/source/ui/view/formatsh.cxx b/sc/source/ui/view/formatsh.cxx
index 055cd04f7267..a7f21b68b548 100644
--- a/sc/source/ui/view/formatsh.cxx
+++ b/sc/source/ui/view/formatsh.cxx
@@ -1167,9 +1167,7 @@ void ScFormatShell::ExecuteAttr( SfxRequest& rReq )
                     const ScPatternAttr*    pOldAttrs = 
pTabViewShell->GetSelectionPattern();
                     SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END> 
aOldSet( *rDoc.GetPool() );
                     SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END> 
aNewSet( *rDoc.GetPool() );
-                    const SfxPoolItem&      rBorderAttr =
-                                                pOldAttrs->GetItemSet().
-                                                    Get( ATTR_BORDER );
+                    const SfxPoolItem& rBorderAttr = 
pOldAttrs->GetItemSet().Get(ATTR_BORDER);
 
                     // Evaluate border items from controller:
 
commit 6fc52cb96b10bdd2d93138ace1f0a8e66f6bd1e4
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Mon Dec 29 11:07:30 2025 +0900
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Mon Feb 23 14:08:27 2026 +0100

    vcl: use frozen in OpenType feature definition list
    
    We can now simplify this list and use frozen containers as there is
    no more parameters for OpenType features. If we will add parameters,
    we can still add those as exceptions, no need to add them in the
    list itself.
    
    Singleton OpenTypeFeatureDefinitionListPrivate now doesn't make
    much sense as the methods became static, so the whole class was
    removed and only functions are used.
    
    Change-Id: Icc66cdf0a5eb4bd0997b4815421c044372dfd395
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196273
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200022
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/include/vcl/font/Feature.hxx b/include/vcl/font/Feature.hxx
index 2696fc2c077a..e80a0899de01 100644
--- a/include/vcl/font/Feature.hxx
+++ b/include/vcl/font/Feature.hxx
@@ -7,8 +7,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-#ifndef INCLUDED_VCL_FONT_FEATURE_HXX
-#define INCLUDED_VCL_FONT_FEATURE_HXX
+#pragma once
 
 #include <vcl/dllapi.h>
 #include <rtl/character.hxx>
@@ -92,18 +91,29 @@ struct Feature
     Feature();
     Feature(uint32_t const nCode, FeatureType eType);
 
+    bool hasCodeNumericPart() const
+    {
+        return rtl::isAsciiDigit((m_nCode >> 8) & 0xFF) && 
rtl::isAsciiDigit((m_nCode >> 0) & 0xFF);
+    }
+
     bool isCharacterVariant() const
     {
         return ((m_nCode >> 24) & 0xFF) == 'c' && ((m_nCode >> 16) & 0xFF) == 
'v'
-               && rtl::isAsciiDigit((m_nCode >> 8) & 0xFF)
-               && rtl::isAsciiDigit((m_nCode >> 0) & 0xFF);
+               && hasCodeNumericPart();
     }
 
     bool isStylisticSet() const
     {
         return ((m_nCode >> 24) & 0xFF) == 's' && ((m_nCode >> 16) & 0xFF) == 
's'
-               && rtl::isAsciiDigit((m_nCode >> 8) & 0xFF)
-               && rtl::isAsciiDigit((m_nCode >> 0) & 0xFF);
+               && hasCodeNumericPart();
+    }
+
+    OUString getCodeNumericPart() const
+    {
+        if (hasCodeNumericPart())
+            return OUStringChar(char((m_nCode >> 8) & 0xFF))
+                   + OUStringChar(char((m_nCode >> 0) & 0xFF));
+        return OUString();
     }
 
     uint32_t m_nCode;
@@ -125,6 +135,4 @@ struct FeatureSetting
 
 } // namespace vcl::font
 
-#endif // INCLUDED_VCL_FONT_FEATURE_HXX
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx 
b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
index 56409d59152e..a6bd5e8fe22f 100644
--- a/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
+++ b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
@@ -14,25 +14,10 @@
 #include <vector>
 #include <unordered_map>
 
-namespace vcl::font
+namespace vcl::font::feature
 {
-class OpenTypeFeatureDefinitionListPrivate
-{
-private:
-    std::vector<FeatureDefinition> m_aFeatureDefinition;
-    std::unordered_map<sal_uInt32, size_t> m_aCodeToIndex;
-    std::vector<sal_uInt32> m_aRequiredFeatures;
-
-    void init();
-
-public:
-    OpenTypeFeatureDefinitionListPrivate();
-    FeatureDefinition getDefinition(const vcl::font::Feature& rFeature);
-    bool isRequired(sal_uInt32 nFeatureCode);
-};
-
-VCL_DLLPUBLIC OpenTypeFeatureDefinitionListPrivate& 
OpenTypeFeatureDefinitionList();
-
-} // namespace vcl::font
+FeatureDefinition getDefinition(const vcl::font::Feature& rFeature);
+bool isRequired(sal_uInt32 nFeatureCode);
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/font/FeatureCollector.cxx 
b/vcl/source/font/FeatureCollector.cxx
index 767d8c39aa73..ca7d98b12779 100644
--- a/vcl/source/font/FeatureCollector.cxx
+++ b/vcl/source/font/FeatureCollector.cxx
@@ -96,14 +96,14 @@ void FeatureCollector::collectForTable(hb_tag_t aTableTag)
 
     for (hb_tag_t aFeatureTag : aFeatureTags)
     {
-        if (OpenTypeFeatureDefinitionList().isRequired(aFeatureTag))
+        if (vcl::font::feature::isRequired(aFeatureTag))
             continue;
 
         m_rFontFeatures.emplace_back();
         vcl::font::Feature& rFeature = m_rFontFeatures.back();
         rFeature.m_nCode = aFeatureTag;
 
-        FeatureDefinition aDefinition = 
OpenTypeFeatureDefinitionList().getDefinition(rFeature);
+        FeatureDefinition aDefinition = 
vcl::font::feature::getDefinition(rFeature);
         std::vector<vcl::font::FeatureParameter> aParameters{
             { 0, VclResId(STR_FONT_FEATURE_PARAM_NONE) }
         };
diff --git a/vcl/source/font/OpenTypeFeatureDefinitionList.cxx 
b/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
index 1018790d29ce..0fd7a9dc1a8a 100644
--- a/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
+++ b/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
@@ -11,23 +11,36 @@
 #include <font/OpenTypeFeatureDefinitionList.hxx>
 #include <font/OpenTypeFeatureStrings.hrc>
 
-#include <rtl/character.hxx>
+#include <frozen/bits/defines.h>
+#include <frozen/bits/elsa_std.h>
+#include <frozen/unordered_map.h>
+#include <frozen/unordered_set.h>
 
+#include <rtl/character.hxx>
 #include <algorithm>
 
-namespace vcl::font
+namespace vcl::font::feature
 {
-OpenTypeFeatureDefinitionListPrivate& OpenTypeFeatureDefinitionList()
+namespace
 {
-    static OpenTypeFeatureDefinitionListPrivate SINGLETON;
-    return SINGLETON;
-};
-
-OpenTypeFeatureDefinitionListPrivate::OpenTypeFeatureDefinitionListPrivate() { 
init(); }
+constexpr auto constRequiredFeatures = frozen::make_unordered_set<sal_uInt32>({
+    featureCode("abvf"), featureCode("abvm"), featureCode("abvs"), 
featureCode("akhn"),
+    featureCode("blwf"), featureCode("blwm"), featureCode("blws"), 
featureCode("ccmp"),
+    featureCode("cfar"), featureCode("cjct"), featureCode("curs"), 
featureCode("dist"),
+    featureCode("dtls"), featureCode("fin2"), featureCode("fin3"), 
featureCode("fina"),
+    featureCode("flac"), featureCode("half"), featureCode("haln"), 
featureCode("init"),
+    featureCode("isol"), featureCode("ljmo"), featureCode("locl"), 
featureCode("ltra"),
+    featureCode("ltrm"), featureCode("mark"), featureCode("med2"), 
featureCode("medi"),
+    featureCode("mkmk"), featureCode("mset"), featureCode("nukt"), 
featureCode("pref"),
+    featureCode("pres"), featureCode("pstf"), featureCode("psts"), 
featureCode("rand"),
+    featureCode("rclt"), featureCode("rkrf"), featureCode("rlig"), 
featureCode("rphf"),
+    featureCode("rtla"), featureCode("rtlm"), featureCode("rvrn"), 
featureCode("size"),
+    featureCode("ssty"), featureCode("stch"), featureCode("tjmo"), 
featureCode("vatu"),
+    featureCode("vert"), featureCode("vjmo"),
+});
 
-void OpenTypeFeatureDefinitionListPrivate::init()
-{
-    m_aFeatureDefinition.assign({
+constexpr auto constFeatureCodeToTranslationID
+    = frozen::make_unordered_map<sal_uInt32, TranslateId>({
         { featureCode("aalt"), STR_FONT_FEATURE_ID_AALT },
         { featureCode("afrc"), STR_FONT_FEATURE_ID_AFRC },
         { featureCode("alig"), STR_FONT_FEATURE_ID_ALIG },
@@ -102,37 +115,14 @@ void OpenTypeFeatureDefinitionListPrivate::init()
         { featureCode("vrtr"), STR_FONT_FEATURE_ID_VRTR },
         { featureCode("zero"), STR_FONT_FEATURE_ID_ZERO },
     });
-
-    for (size_t i = 0; i < m_aFeatureDefinition.size(); ++i)
-    {
-        m_aCodeToIndex.emplace(m_aFeatureDefinition[i].getCode(), i);
-    }
-
-    m_aRequiredFeatures.assign({
-        featureCode("abvf"), featureCode("abvm"), featureCode("abvs"), 
featureCode("akhn"),
-        featureCode("blwf"), featureCode("blwm"), featureCode("blws"), 
featureCode("ccmp"),
-        featureCode("cfar"), featureCode("cjct"), featureCode("curs"), 
featureCode("dist"),
-        featureCode("dtls"), featureCode("fin2"), featureCode("fin3"), 
featureCode("fina"),
-        featureCode("flac"), featureCode("half"), featureCode("haln"), 
featureCode("init"),
-        featureCode("isol"), featureCode("ljmo"), featureCode("locl"), 
featureCode("ltra"),
-        featureCode("ltrm"), featureCode("mark"), featureCode("med2"), 
featureCode("medi"),
-        featureCode("mkmk"), featureCode("mset"), featureCode("nukt"), 
featureCode("pref"),
-        featureCode("pres"), featureCode("pstf"), featureCode("psts"), 
featureCode("rand"),
-        featureCode("rclt"), featureCode("rkrf"), featureCode("rlig"), 
featureCode("rphf"),
-        featureCode("rtla"), featureCode("rtlm"), featureCode("rvrn"), 
featureCode("size"),
-        featureCode("ssty"), featureCode("stch"), featureCode("tjmo"), 
featureCode("vatu"),
-        featureCode("vert"), featureCode("vjmo"),
-    });
 }
 
-FeatureDefinition
-OpenTypeFeatureDefinitionListPrivate::getDefinition(const vcl::font::Feature& 
rFeature)
+FeatureDefinition getDefinition(const vcl::font::Feature& rFeature)
 {
     if (rFeature.isCharacterVariant() || rFeature.isStylisticSet())
     {
         FeatureDefinition aFeatureDefinition;
-        OUString sNumericPart = OUStringChar(char((rFeature.m_nCode >> 8) & 
0xFF))
-                                + OUStringChar(char((rFeature.m_nCode >> 0) & 
0xFF));
+        OUString sNumericPart = rFeature.getCodeNumericPart();
         if (rFeature.isCharacterVariant())
             aFeatureDefinition = { rFeature.m_nCode, STR_FONT_FEATURE_ID_CVXX, 
sNumericPart };
         else if (rFeature.isStylisticSet())
@@ -141,18 +131,16 @@ OpenTypeFeatureDefinitionListPrivate::getDefinition(const 
vcl::font::Feature& rF
     }
 
     auto nFeatureCode = rFeature.m_nCode;
-    if (m_aCodeToIndex.find(nFeatureCode) != m_aCodeToIndex.end())
-    {
-        size_t nIndex = m_aCodeToIndex.at(nFeatureCode);
-        return m_aFeatureDefinition[nIndex];
-    }
+
+    auto iterator = constFeatureCodeToTranslationID.find(nFeatureCode);
+    if (iterator != constFeatureCodeToTranslationID.end())
+        return FeatureDefinition(iterator->first, iterator->second);
     return FeatureDefinition();
 }
 
-bool OpenTypeFeatureDefinitionListPrivate::isRequired(sal_uInt32 nFeatureCode)
+bool isRequired(sal_uInt32 nFeatureCode)
 {
-    return std::find(m_aRequiredFeatures.begin(), m_aRequiredFeatures.end(), 
nFeatureCode)
-           != m_aRequiredFeatures.end();
+    return constRequiredFeatures.find(nFeatureCode) != 
constRequiredFeatures.end();
 }
 
 } // end vcl::font namespace
commit bb42d913acdcdb9994ccdcc8da44a287142c7d32
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Sat Dec 27 10:54:03 2025 +0900
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Mon Feb 23 14:08:20 2026 +0100

    fix ComplexColor comment that was cut off mid sentence
    
    Change-Id: I7d04f2b916f0b4cdb3694908e6895dd9fdc2ae22
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196241
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200021
    Tested-by: Tomaž Vajngerl <[email protected]>

diff --git a/include/docmodel/color/ComplexColor.hxx 
b/include/docmodel/color/ComplexColor.hxx
index 0333b128fadf..b83b63a23fa3 100644
--- a/include/docmodel/color/ComplexColor.hxx
+++ b/include/docmodel/color/ComplexColor.hxx
@@ -73,7 +73,7 @@ enum class SystemColorType
  * A color that can be expresses as a RGB, CRGB or HSL representation or
  * a more abstract representation as for example system color, palette,
  * theme color or a placeholder. In these representations the
- * color needs to be additionally
+ * color needs to be additionally computed and/or looked up.
  *
  * The color can also have transformations defined, which in addition
  * manipulates the resulting color (i.e. tints, shades, alpha,...).

Reply via email to