Kaydet (Commit) a7af4bbb authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl Kaydeden (comit) Tomaž Vajngerl

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: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst 04645273
......@@ -56,6 +56,7 @@ private:
sal_uInt32 m_nCode;
OUString m_sDescription;
const char* m_pDescriptionID;
OUString m_sNumericPart;
FeatureParameterType m_eType;
// the index of the parameter defines the enum value, string is the description
std::vector<FeatureParameter> m_aEnumParameters;
......@@ -66,7 +67,8 @@ public:
FeatureParameterType eType = FeatureParameterType::BOOL,
std::vector<FeatureParameter> const& rEnumParameters
= std::vector<FeatureParameter>{});
FeatureDefinition(sal_uInt32 nCode, const char* pDescriptionID);
FeatureDefinition(sal_uInt32 nCode, const char* pDescriptionID,
OUString const& rNumericPart = OUString());
FeatureDefinition(sal_uInt32 nCode, const char* pDescriptionID,
std::vector<FeatureParameter> aEnumParameters);
......
......@@ -30,6 +30,9 @@ private:
void init();
static bool isSpecialFeatureCode(sal_uInt32 nFeatureCode);
FeatureDefinition handleSpecialFeatureCode(sal_uInt32 nFeatureCode);
public:
OpenTypeFeatureDefinitonListPrivate();
FeatureDefinition getDefinition(sal_uInt32 nFeatureCode);
......
......@@ -33,17 +33,7 @@
#define STR_FONT_FEATURE_ID_CPCT NC_("STR_FONT_FEATURE_ID_CPCT", "Centered CJK Punctuation")
#define STR_FONT_FEATURE_ID_CPSP NC_("STR_FONT_FEATURE_ID_CPSP", "Capital Spacing")
#define STR_FONT_FEATURE_ID_CSWH NC_("STR_FONT_FEATURE_ID_CSWH", "Contextual Swash")
#define STR_FONT_FEATURE_ID_CV01 NC_("STR_FONT_FEATURE_ID_CV01", "Character Variant 1")
#define STR_FONT_FEATURE_ID_CV02 NC_("STR_FONT_FEATURE_ID_CV02", "Character Variant 2")
#define STR_FONT_FEATURE_ID_CV03 NC_("STR_FONT_FEATURE_ID_CV03", "Character Variant 3")
#define STR_FONT_FEATURE_ID_CV04 NC_("STR_FONT_FEATURE_ID_CV04", "Character Variant 4")
#define STR_FONT_FEATURE_ID_CV05 NC_("STR_FONT_FEATURE_ID_CV05", "Character Variant 5")
#define STR_FONT_FEATURE_ID_CV06 NC_("STR_FONT_FEATURE_ID_CV06", "Character Variant 6")
#define STR_FONT_FEATURE_ID_CV07 NC_("STR_FONT_FEATURE_ID_CV07", "Character Variant 7")
#define STR_FONT_FEATURE_ID_CV08 NC_("STR_FONT_FEATURE_ID_CV08", "Character Variant 8")
#define STR_FONT_FEATURE_ID_CV09 NC_("STR_FONT_FEATURE_ID_CV09", "Character Variant 9")
#define STR_FONT_FEATURE_ID_CV10 NC_("STR_FONT_FEATURE_ID_CV10", "Character Variant 10")
#define STR_FONT_FEATURE_ID_CV11 NC_("STR_FONT_FEATURE_ID_CV11", "Character Variant 11")
#define STR_FONT_FEATURE_ID_CVXX NC_("STR_FONT_FEATURE_ID_CVXX", "Character Variant %1")
#define STR_FONT_FEATURE_ID_DCAP NC_("STR_FONT_FEATURE_ID_DCAP", "Drop Caps")
#define STR_FONT_FEATURE_ID_DLIG NC_("STR_FONT_FEATURE_ID_DLIG", "Discretionary Ligatures")
#define STR_FONT_FEATURE_ID_DNOM NC_("STR_FONT_FEATURE_ID_DNOM", "Denominators")
......@@ -91,26 +81,7 @@
#define STR_FONT_FEATURE_ID_SINF NC_("STR_FONT_FEATURE_ID_SINF", "Scientific Inferiors")
#define STR_FONT_FEATURE_ID_SMCP NC_("STR_FONT_FEATURE_ID_SMCP", "Lowercase to Small Capitals")
#define STR_FONT_FEATURE_ID_SMPL NC_("STR_FONT_FEATURE_ID_SMPL", "Simplified Forms")
#define STR_FONT_FEATURE_ID_SS01 NC_("STR_FONT_FEATURE_ID_SS01", "Stylistic Set 1")
#define STR_FONT_FEATURE_ID_SS02 NC_("STR_FONT_FEATURE_ID_SS02", "Stylistic Set 2")
#define STR_FONT_FEATURE_ID_SS03 NC_("STR_FONT_FEATURE_ID_SS03", "Stylistic Set 3")
#define STR_FONT_FEATURE_ID_SS04 NC_("STR_FONT_FEATURE_ID_SS04", "Stylistic Set 4")
#define STR_FONT_FEATURE_ID_SS05 NC_("STR_FONT_FEATURE_ID_SS05", "Stylistic Set 5")
#define STR_FONT_FEATURE_ID_SS06 NC_("STR_FONT_FEATURE_ID_SS06", "Stylistic Set 6")
#define STR_FONT_FEATURE_ID_SS07 NC_("STR_FONT_FEATURE_ID_SS07", "Stylistic Set 7")
#define STR_FONT_FEATURE_ID_SS08 NC_("STR_FONT_FEATURE_ID_SS08", "Stylistic Set 8")
#define STR_FONT_FEATURE_ID_SS09 NC_("STR_FONT_FEATURE_ID_SS09", "Stylistic Set 9")
#define STR_FONT_FEATURE_ID_SS10 NC_("STR_FONT_FEATURE_ID_SS10", "Stylistic Set 10")
#define STR_FONT_FEATURE_ID_SS11 NC_("STR_FONT_FEATURE_ID_SS11", "Stylistic Set 11")
#define STR_FONT_FEATURE_ID_SS12 NC_("STR_FONT_FEATURE_ID_SS12", "Stylistic Set 12")
#define STR_FONT_FEATURE_ID_SS13 NC_("STR_FONT_FEATURE_ID_SS13", "Stylistic Set 13")
#define STR_FONT_FEATURE_ID_SS14 NC_("STR_FONT_FEATURE_ID_SS14", "Stylistic Set 14")
#define STR_FONT_FEATURE_ID_SS15 NC_("STR_FONT_FEATURE_ID_SS15", "Stylistic Set 15")
#define STR_FONT_FEATURE_ID_SS16 NC_("STR_FONT_FEATURE_ID_SS16", "Stylistic Set 16")
#define STR_FONT_FEATURE_ID_SS17 NC_("STR_FONT_FEATURE_ID_SS17", "Stylistic Set 17")
#define STR_FONT_FEATURE_ID_SS18 NC_("STR_FONT_FEATURE_ID_SS18", "Stylistic Set 18")
#define STR_FONT_FEATURE_ID_SS19 NC_("STR_FONT_FEATURE_ID_SS19", "Stylistic Set 19")
#define STR_FONT_FEATURE_ID_SS20 NC_("STR_FONT_FEATURE_ID_SS20", "Stylistic Set 20")
#define STR_FONT_FEATURE_ID_SSXX NC_("STR_FONT_FEATURE_ID_SSXX", "Stylistic Set %1")
#define STR_FONT_FEATURE_ID_SUBS NC_("STR_FONT_FEATURE_ID_SUBS", "Subscript")
#define STR_FONT_FEATURE_ID_SUPS NC_("STR_FONT_FEATURE_ID_SUPS", "Superscript")
#define STR_FONT_FEATURE_ID_SWSH NC_("STR_FONT_FEATURE_ID_SWSH", "Swash")
......
......@@ -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; }
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment