include/vcl/font/Feature.hxx                      |    9 +++-
 vcl/inc/font/OpenTypeFeatureDefinitionList.hxx    |    3 -
 vcl/source/font/OpenTypeFeatureDefinitionList.cxx |   43 +++-------------------
 3 files changed, 13 insertions(+), 42 deletions(-)

New commits:
commit fcba85d2ebb54692e0730610026b9b51feb67716
Author:     Khaled Hosny <kha...@aliftype.com>
AuthorDate: Sat Dec 3 16:29:46 2022 +0200
Commit:     خالد حسني <kha...@aliftype.com>
CommitDate: Sun Dec 4 08:21:38 2022 +0000

    Check for trailing numeric part in isCharacterVariant/isStylisticSet
    
    We want to mach features like “ss01” but not, say, “ssty”.
    
    Change-Id: Idc4fdf78c577afe66cf76d7f722dc2009863654e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143614
    Tested-by: خالد حسني <kha...@aliftype.com>
    Reviewed-by: خالد حسني <kha...@aliftype.com>

diff --git a/include/vcl/font/Feature.hxx b/include/vcl/font/Feature.hxx
index c5bd497532e8..0c3c159dbc11 100644
--- a/include/vcl/font/Feature.hxx
+++ b/include/vcl/font/Feature.hxx
@@ -11,6 +11,7 @@
 #define INCLUDED_VCL_FONT_FEATURE_HXX
 
 #include <vcl/dllapi.h>
+#include <rtl/character.hxx>
 #include <rtl/ustring.hxx>
 #include <unotools/resmgr.hxx>
 #include <vector>
@@ -92,12 +93,16 @@ struct Feature
 
     bool isCharacterVariant() const
     {
-        return ((m_nCode >> 24) & 0xFF) == 'c' && ((m_nCode >> 16) & 0xFF) == 
'v';
+        return ((m_nCode >> 24) & 0xFF) == 'c' && ((m_nCode >> 16) & 0xFF) == 
'v'
+               && rtl::isAsciiDigit((m_nCode >> 8) & 0xFF)
+               && rtl::isAsciiDigit((m_nCode >> 0) & 0xFF);
     }
 
     bool isStylisticSet() const
     {
-        return ((m_nCode >> 24) & 0xFF) == 's' && ((m_nCode >> 16) & 0xFF) == 
's';
+        return ((m_nCode >> 24) & 0xFF) == 's' && ((m_nCode >> 16) & 0xFF) == 
's'
+               && rtl::isAsciiDigit((m_nCode >> 8) & 0xFF)
+               && rtl::isAsciiDigit((m_nCode >> 0) & 0xFF);
     }
 
     uint32_t m_nCode;
diff --git a/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx 
b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
index c8fb6f7a449d..1ae634deabe8 100644
--- a/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
+++ b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx
@@ -25,9 +25,6 @@ private:
 
     void init();
 
-    static bool isSpecialFeature(vcl::font::Feature& rFeature);
-    static FeatureDefinition handleSpecialFeature(vcl::font::Feature& 
rFeature);
-
 public:
     OpenTypeFeatureDefinitionListPrivate();
     FeatureDefinition getDefinition(vcl::font::Feature& rFeature);
diff --git a/vcl/source/font/OpenTypeFeatureDefinitionList.cxx 
b/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
index 4cc370cec3c7..0400833937af 100644
--- a/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
+++ b/vcl/source/font/OpenTypeFeatureDefinitionList.cxx
@@ -125,49 +125,18 @@ void OpenTypeFeatureDefinitionListPrivate::init()
     });
 }
 
-namespace
-{
-OUString getNumericLowerPart(vcl::font::Feature& rFeature)
-{
-    auto nFeatureCode = rFeature.m_nCode;
-    char cChar1((sal_uInt32(nFeatureCode) >> 8) & 0xFF);
-    char cChar2((sal_uInt32(nFeatureCode) >> 0) & 0xFF);
-
-    if (rtl::isAsciiDigit(static_cast<unsigned char>(cChar1))
-        && rtl::isAsciiDigit(static_cast<unsigned char>(cChar2)))
-    {
-        return OUStringChar(cChar1) + OUStringChar(cChar2);
-    }
-    return OUString();
-}
-
-} // end anonymous namespace
-
-bool 
OpenTypeFeatureDefinitionListPrivate::isSpecialFeature(vcl::font::Feature& 
rFeature)
-{
-    return rFeature.isCharacterVariant() || rFeature.isStylisticSet();
-}
-
-FeatureDefinition
-OpenTypeFeatureDefinitionListPrivate::handleSpecialFeature(vcl::font::Feature& 
rFeature)
+FeatureDefinition 
OpenTypeFeatureDefinitionListPrivate::getDefinition(vcl::font::Feature& 
rFeature)
 {
-    FeatureDefinition aFeatureDefinition;
-    OUString sNumericPart = getNumericLowerPart(rFeature);
-    if (!sNumericPart.isEmpty())
+    if (rFeature.isCharacterVariant() || rFeature.isStylisticSet())
     {
+        FeatureDefinition aFeatureDefinition;
+        OUString sNumericPart = OUStringChar(char((rFeature.m_nCode >> 8) & 
0xFF))
+                                + OUStringChar(char((rFeature.m_nCode >> 0) & 
0xFF));
         if (rFeature.isCharacterVariant())
             aFeatureDefinition = { rFeature.m_nCode, STR_FONT_FEATURE_ID_CVXX, 
sNumericPart };
         else if (rFeature.isStylisticSet())
             aFeatureDefinition = { rFeature.m_nCode, STR_FONT_FEATURE_ID_SSXX, 
sNumericPart };
-    }
-    return aFeatureDefinition;
-}
-
-FeatureDefinition 
OpenTypeFeatureDefinitionListPrivate::getDefinition(vcl::font::Feature& 
rFeature)
-{
-    if (isSpecialFeature(rFeature))
-    {
-        return handleSpecialFeature(rFeature);
+        return aFeatureDefinition;
     }
 
     auto nFeatureCode = rFeature.m_nCode;

Reply via email to