summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKhaled Hosny <khaled@aliftype.com>2022-12-03 16:29:46 +0200
committerخالد حسني <khaled@aliftype.com>2022-12-04 08:21:38 +0000
commitfcba85d2ebb54692e0730610026b9b51feb67716 (patch)
treeba12c032b2d1cdad8ad836ad475be4d44b3e5daf
parentb6e338fe746028f82c973987eaf04280715110e4 (diff)
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: خالد حسني <khaled@aliftype.com> Reviewed-by: خالد حسني <khaled@aliftype.com>
-rw-r--r--include/vcl/font/Feature.hxx9
-rw-r--r--vcl/inc/font/OpenTypeFeatureDefinitionList.hxx3
-rw-r--r--vcl/source/font/OpenTypeFeatureDefinitionList.cxx43
3 files changed, 13 insertions, 42 deletions
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;