summaryrefslogtreecommitdiff
path: root/vcl/source/font
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2018-06-23 16:01:19 +0200
committerTomaž Vajngerl <quikee@gmail.com>2018-06-24 15:33:44 +0200
commita7af4bbbc0793fb78aea6a89f8fb6dc052710a11 (patch)
tree12a0711925e58904895f7a5a0cea7a6dafc04266 /vcl/source/font
parent04645273d7c9dd6927035b571464148a38d3db9f (diff)
vcl: treat description of cv** & ss** font features specially
To avoid adding descriptions for each of font features cv** and ss**, where ** is a number between 00-99, process them separately and just use one description for each. This simplifies translation as we don't need to add 99 copy-paste translations but add a bit more complexity when looking up the descriptions. Change-Id: Ia6e9554af20355c90c73afeec33fd18c694865b9 Reviewed-on: https://gerrit.libreoffice.org/56317 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/source/font')
-rw-r--r--vcl/source/font/Feature.cxx15
-rw-r--r--vcl/source/font/OpenTypeFeatureDefinitonList.cxx85
2 files changed, 69 insertions, 31 deletions
diff --git a/vcl/source/font/Feature.cxx b/vcl/source/font/Feature.cxx
index 1b7545b560b9..a23a85fae952 100644
--- a/vcl/source/font/Feature.cxx
+++ b/vcl/source/font/Feature.cxx
@@ -76,9 +76,11 @@ FeatureDefinition::FeatureDefinition(sal_uInt32 nCode, OUString const& rDescript
{
}
-FeatureDefinition::FeatureDefinition(sal_uInt32 nCode, const char* pDescriptionID)
+FeatureDefinition::FeatureDefinition(sal_uInt32 nCode, const char* pDescriptionID,
+ OUString const& rNumericPart)
: m_nCode(nCode)
, m_pDescriptionID(pDescriptionID)
+ , m_sNumericPart(rNumericPart)
, m_eType(FeatureParameterType::BOOL)
{
}
@@ -100,11 +102,20 @@ const std::vector<FeatureParameter>& FeatureDefinition::getEnumParameters() cons
OUString FeatureDefinition::getDescription() const
{
if (m_pDescriptionID)
- return VclResId(m_pDescriptionID);
+ {
+ OUString sTranslatedDescription = VclResId(m_pDescriptionID);
+ if (!m_sNumericPart.isEmpty())
+ return sTranslatedDescription.replaceFirst("%1", m_sNumericPart);
+ return sTranslatedDescription;
+ }
else if (!m_sDescription.isEmpty())
+ {
return m_sDescription;
+ }
else
+ {
return vcl::font::featureCodeAsString(m_nCode);
+ }
}
sal_uInt32 FeatureDefinition::getCode() const { return m_nCode; }
diff --git a/vcl/source/font/OpenTypeFeatureDefinitonList.cxx b/vcl/source/font/OpenTypeFeatureDefinitonList.cxx
index 8b5ce4858956..1c75d46031c7 100644
--- a/vcl/source/font/OpenTypeFeatureDefinitonList.cxx
+++ b/vcl/source/font/OpenTypeFeatureDefinitonList.cxx
@@ -12,6 +12,8 @@
#include <font/OpenTypeFeatureStrings.hrc>
#include <svdata.hxx>
+#include <rtl/character.hxx>
+
namespace vcl
{
namespace font
@@ -32,15 +34,6 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("cpct"), STR_FONT_FEATURE_ID_CPCT },
{ featureCode("cpsp"), STR_FONT_FEATURE_ID_CPSP },
{ featureCode("cswh"), STR_FONT_FEATURE_ID_CSWH },
- { featureCode("cv01"), STR_FONT_FEATURE_ID_CV01 },
- { featureCode("cv02"), STR_FONT_FEATURE_ID_CV02 },
- { featureCode("cv03"), STR_FONT_FEATURE_ID_CV03 },
- { featureCode("cv04"), STR_FONT_FEATURE_ID_CV04 },
- { featureCode("cv05"), STR_FONT_FEATURE_ID_CV05 },
- { featureCode("cv06"), STR_FONT_FEATURE_ID_CV06 },
- { featureCode("cv07"), STR_FONT_FEATURE_ID_CV07 },
- { featureCode("cv08"), STR_FONT_FEATURE_ID_CV08 },
- { featureCode("cv09"), STR_FONT_FEATURE_ID_CV09 },
{ featureCode("dcap"), STR_FONT_FEATURE_ID_DCAP },
{ featureCode("dlig"), STR_FONT_FEATURE_ID_DLIG },
{ featureCode("dnom"), STR_FONT_FEATURE_ID_DNOM },
@@ -88,26 +81,6 @@ void OpenTypeFeatureDefinitonListPrivate::init()
{ featureCode("sinf"), STR_FONT_FEATURE_ID_SINF },
{ featureCode("smcp"), STR_FONT_FEATURE_ID_SMCP },
{ featureCode("smpl"), STR_FONT_FEATURE_ID_SMPL },
- { featureCode("ss01"), STR_FONT_FEATURE_ID_SS01 },
- { featureCode("ss02"), STR_FONT_FEATURE_ID_SS02 },
- { featureCode("ss03"), STR_FONT_FEATURE_ID_SS03 },
- { featureCode("ss04"), STR_FONT_FEATURE_ID_SS04 },
- { featureCode("ss05"), STR_FONT_FEATURE_ID_SS05 },
- { featureCode("ss06"), STR_FONT_FEATURE_ID_SS06 },
- { featureCode("ss07"), STR_FONT_FEATURE_ID_SS07 },
- { featureCode("ss08"), STR_FONT_FEATURE_ID_SS08 },
- { featureCode("ss09"), STR_FONT_FEATURE_ID_SS09 },
- { featureCode("ss10"), STR_FONT_FEATURE_ID_SS10 },
- { featureCode("ss11"), STR_FONT_FEATURE_ID_SS11 },
- { featureCode("ss12"), STR_FONT_FEATURE_ID_SS12 },
- { featureCode("ss13"), STR_FONT_FEATURE_ID_SS13 },
- { featureCode("ss14"), STR_FONT_FEATURE_ID_SS14 },
- { featureCode("ss15"), STR_FONT_FEATURE_ID_SS15 },
- { featureCode("ss16"), STR_FONT_FEATURE_ID_SS16 },
- { featureCode("ss17"), STR_FONT_FEATURE_ID_SS17 },
- { featureCode("ss18"), STR_FONT_FEATURE_ID_SS18 },
- { featureCode("ss19"), STR_FONT_FEATURE_ID_SS19 },
- { featureCode("ss20"), STR_FONT_FEATURE_ID_SS20 },
{ featureCode("subs"), STR_FONT_FEATURE_ID_SUBS },
{ featureCode("sups"), STR_FONT_FEATURE_ID_SUPS },
{ featureCode("swsh"), STR_FONT_FEATURE_ID_SWSH },
@@ -149,8 +122,62 @@ void OpenTypeFeatureDefinitonListPrivate::init()
});
}
+namespace
+{
+bool isCharacterVariantCode(sal_uInt32 nFeatureCode)
+{
+ return sal_Char((sal_uInt32(nFeatureCode) >> 24) & 0xFF) == 'c'
+ && sal_Char((sal_uInt32(nFeatureCode) >> 16) & 0xFF) == 'v';
+}
+
+bool isStylisticSetCode(sal_uInt32 nFeatureCode)
+{
+ return sal_Char((sal_uInt32(nFeatureCode) >> 24) & 0xFF) == 's'
+ && sal_Char((sal_uInt32(nFeatureCode) >> 16) & 0xFF) == 's';
+}
+
+OUString getNumericLowerPart(sal_uInt32 nFeatureCode)
+{
+ sal_Char cChar1((sal_uInt32(nFeatureCode) >> 8) & 0xFF);
+ sal_Char cChar2((sal_uInt32(nFeatureCode) >> 0) & 0xFF);
+
+ if (rtl::isAsciiDigit(static_cast<unsigned char>(cChar1))
+ && rtl::isAsciiDigit(static_cast<unsigned char>(cChar2)))
+ {
+ return OUString(cChar1) + OUString(cChar2);
+ }
+ return OUString();
+}
+
+} // end anonymous namespace
+
+bool OpenTypeFeatureDefinitonListPrivate::isSpecialFeatureCode(sal_uInt32 nFeatureCode)
+{
+ return isCharacterVariantCode(nFeatureCode) || isStylisticSetCode(nFeatureCode);
+}
+
+FeatureDefinition
+OpenTypeFeatureDefinitonListPrivate::handleSpecialFeatureCode(sal_uInt32 nFeatureCode)
+{
+ FeatureDefinition aFeatureDefinition;
+ OUString sNumericPart = getNumericLowerPart(nFeatureCode);
+ if (!sNumericPart.isEmpty())
+ {
+ if (isCharacterVariantCode(nFeatureCode))
+ aFeatureDefinition = { nFeatureCode, STR_FONT_FEATURE_ID_SSXX, sNumericPart };
+ else if (isStylisticSetCode(nFeatureCode))
+ aFeatureDefinition = { nFeatureCode, STR_FONT_FEATURE_ID_CVXX, sNumericPart };
+ }
+ return aFeatureDefinition;
+}
+
FeatureDefinition OpenTypeFeatureDefinitonListPrivate::getDefinition(sal_uInt32 nFeatureCode)
{
+ if (isSpecialFeatureCode(nFeatureCode))
+ {
+ return handleSpecialFeatureCode(nFeatureCode);
+ }
+
if (m_aCodeToIndex.find(nFeatureCode) != m_aCodeToIndex.end())
{
size_t nIndex = m_aCodeToIndex.at(nFeatureCode);