LibreOffice Module vcl (master) 1
OpenTypeFeatureDefinitionList.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 */
10
12#include <font/OpenTypeFeatureStrings.hrc>
13
14#include <rtl/character.hxx>
15
16#include <algorithm>
17
18namespace vcl::font
19{
21{
23 return SINGLETON;
24};
25
27
29{
31 { featureCode("aalt"), STR_FONT_FEATURE_ID_AALT },
32 { featureCode("afrc"), STR_FONT_FEATURE_ID_AFRC },
33 { featureCode("alig"), STR_FONT_FEATURE_ID_ALIG },
34 { featureCode("c2pc"), STR_FONT_FEATURE_ID_C2PC },
35 { featureCode("c2sc"), STR_FONT_FEATURE_ID_C2SC },
36 { featureCode("calt"), STR_FONT_FEATURE_ID_CALT },
37 { featureCode("case"), STR_FONT_FEATURE_ID_CASE },
38 { featureCode("clig"), STR_FONT_FEATURE_ID_CLIG },
39 { featureCode("cpct"), STR_FONT_FEATURE_ID_CPCT },
40 { featureCode("cpsp"), STR_FONT_FEATURE_ID_CPSP },
41 { featureCode("cswh"), STR_FONT_FEATURE_ID_CSWH },
42 { featureCode("dcap"), STR_FONT_FEATURE_ID_DCAP },
43 { featureCode("dlig"), STR_FONT_FEATURE_ID_DLIG },
44 { featureCode("dnom"), STR_FONT_FEATURE_ID_DNOM },
45 { featureCode("dpng"), STR_FONT_FEATURE_ID_DPNG },
46 { featureCode("expt"), STR_FONT_FEATURE_ID_EXPT },
47 { featureCode("falt"), STR_FONT_FEATURE_ID_FALT },
48 { featureCode("frac"), STR_FONT_FEATURE_ID_FRAC },
49 { featureCode("fwid"), STR_FONT_FEATURE_ID_FWID },
50 { featureCode("halt"), STR_FONT_FEATURE_ID_HALT },
51 { featureCode("hist"), STR_FONT_FEATURE_ID_HIST },
52 { featureCode("hkna"), STR_FONT_FEATURE_ID_HKNA },
53 { featureCode("hlig"), STR_FONT_FEATURE_ID_HLIG },
54 { featureCode("hngl"), STR_FONT_FEATURE_ID_HNGL },
55 { featureCode("hojo"), STR_FONT_FEATURE_ID_HOJO },
56 { featureCode("hwid"), STR_FONT_FEATURE_ID_HWID },
57 { featureCode("ital"), STR_FONT_FEATURE_ID_ITAL },
58 { featureCode("jalt"), STR_FONT_FEATURE_ID_JALT },
59 { featureCode("jp78"), STR_FONT_FEATURE_ID_JP78 },
60 { featureCode("jp83"), STR_FONT_FEATURE_ID_JP83 },
61 { featureCode("jp90"), STR_FONT_FEATURE_ID_JP90 },
62 { featureCode("jp04"), STR_FONT_FEATURE_ID_JP04 },
63 { featureCode("kern"), STR_FONT_FEATURE_ID_KERN },
64 { featureCode("lfbd"), STR_FONT_FEATURE_ID_LFBD },
65 { featureCode("liga"), STR_FONT_FEATURE_ID_LIGA },
66 { featureCode("lnum"), STR_FONT_FEATURE_ID_LNUM },
67 { featureCode("mgrk"), STR_FONT_FEATURE_ID_MGRK },
68 { featureCode("nalt"), STR_FONT_FEATURE_ID_NALT },
69 { featureCode("nlck"), STR_FONT_FEATURE_ID_NLCK },
70 { featureCode("numr"), STR_FONT_FEATURE_ID_NUMR },
71 { featureCode("onum"), STR_FONT_FEATURE_ID_ONUM },
72 { featureCode("opbd"), STR_FONT_FEATURE_ID_OPBD },
73 { featureCode("ordn"), STR_FONT_FEATURE_ID_ORDN },
74 { featureCode("ornm"), STR_FONT_FEATURE_ID_ORNM },
75 { featureCode("palt"), STR_FONT_FEATURE_ID_PALT },
76 { featureCode("pcap"), STR_FONT_FEATURE_ID_PCAP },
77 { featureCode("pkna"), STR_FONT_FEATURE_ID_PKNA },
78 { featureCode("pnum"), STR_FONT_FEATURE_ID_PNUM },
79 { featureCode("pwid"), STR_FONT_FEATURE_ID_PWID },
80 { featureCode("qwid"), STR_FONT_FEATURE_ID_QWID },
81 { featureCode("rtbd"), STR_FONT_FEATURE_ID_RTBD },
82 { featureCode("ruby"), STR_FONT_FEATURE_ID_RUBY },
83 { featureCode("salt"), STR_FONT_FEATURE_ID_SALT },
84 { featureCode("sinf"), STR_FONT_FEATURE_ID_SINF },
85 { featureCode("smcp"), STR_FONT_FEATURE_ID_SMCP },
86 { featureCode("smpl"), STR_FONT_FEATURE_ID_SMPL },
87 { featureCode("subs"), STR_FONT_FEATURE_ID_SUBS },
88 { featureCode("sups"), STR_FONT_FEATURE_ID_SUPS },
89 { featureCode("swsh"), STR_FONT_FEATURE_ID_SWSH },
90 { featureCode("titl"), STR_FONT_FEATURE_ID_TITL },
91 { featureCode("tnam"), STR_FONT_FEATURE_ID_TNAM },
92 { featureCode("tnum"), STR_FONT_FEATURE_ID_TNUM },
93 { featureCode("trad"), STR_FONT_FEATURE_ID_TRAD },
94 { featureCode("twid"), STR_FONT_FEATURE_ID_TWID },
95 { featureCode("unic"), STR_FONT_FEATURE_ID_UNIC },
96 { featureCode("valt"), STR_FONT_FEATURE_ID_VALT },
97 { featureCode("vhal"), STR_FONT_FEATURE_ID_VHAL },
98 { featureCode("vkna"), STR_FONT_FEATURE_ID_VKNA },
99 { featureCode("vkrn"), STR_FONT_FEATURE_ID_VKRN },
100 { featureCode("vpal"), STR_FONT_FEATURE_ID_VPAL },
101 { featureCode("vrt2"), STR_FONT_FEATURE_ID_VRT2 },
102 { featureCode("vrtr"), STR_FONT_FEATURE_ID_VRTR },
103 { featureCode("zero"), STR_FONT_FEATURE_ID_ZERO },
104 });
105
106 for (size_t i = 0; i < m_aFeatureDefinition.size(); ++i)
107 {
108 m_aCodeToIndex.emplace(m_aFeatureDefinition[i].getCode(), i);
109 }
110
111 m_aRequiredFeatures.assign({
112 featureCode("abvf"), featureCode("abvm"), featureCode("abvs"), featureCode("akhn"),
113 featureCode("blwf"), featureCode("blwm"), featureCode("blws"), featureCode("ccmp"),
114 featureCode("cfar"), featureCode("cjct"), featureCode("curs"), featureCode("dist"),
115 featureCode("dtls"), featureCode("fin2"), featureCode("fin3"), featureCode("fina"),
116 featureCode("flac"), featureCode("half"), featureCode("haln"), featureCode("init"),
117 featureCode("isol"), featureCode("ljmo"), featureCode("locl"), featureCode("ltra"),
118 featureCode("ltrm"), featureCode("mark"), featureCode("med2"), featureCode("medi"),
119 featureCode("mkmk"), featureCode("mset"), featureCode("nukt"), featureCode("pref"),
120 featureCode("pres"), featureCode("pstf"), featureCode("psts"), featureCode("rand"),
121 featureCode("rclt"), featureCode("rkrf"), featureCode("rlig"), featureCode("rphf"),
122 featureCode("rtla"), featureCode("rtlm"), featureCode("rvrn"), featureCode("size"),
123 featureCode("ssty"), featureCode("stch"), featureCode("tjmo"), featureCode("vatu"),
124 featureCode("vert"), featureCode("vjmo"),
125 });
126}
127
129{
130 if (rFeature.isCharacterVariant() || rFeature.isStylisticSet())
131 {
132 FeatureDefinition aFeatureDefinition;
133 OUString sNumericPart = OUStringChar(char((rFeature.m_nCode >> 8) & 0xFF))
134 + OUStringChar(char((rFeature.m_nCode >> 0) & 0xFF));
135 if (rFeature.isCharacterVariant())
136 aFeatureDefinition = { rFeature.m_nCode, STR_FONT_FEATURE_ID_CVXX, sNumericPart };
137 else if (rFeature.isStylisticSet())
138 aFeatureDefinition = { rFeature.m_nCode, STR_FONT_FEATURE_ID_SSXX, sNumericPart };
139 return aFeatureDefinition;
140 }
141
142 auto nFeatureCode = rFeature.m_nCode;
143 if (m_aCodeToIndex.find(nFeatureCode) != m_aCodeToIndex.end())
144 {
145 size_t nIndex = m_aCodeToIndex.at(nFeatureCode);
147 }
148 return FeatureDefinition();
149}
150
152{
153 return std::find(m_aRequiredFeatures.begin(), m_aRequiredFeatures.end(), nFeatureCode)
154 != m_aRequiredFeatures.end();
155}
156
157} // end vcl::font namespace
158
159/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::unordered_map< sal_uInt32, size_t > m_aCodeToIndex
FeatureDefinition getDefinition(vcl::font::Feature &rFeature)
sal_Int32 nIndex
int i
A PhysicalFontFaceCollection is created by a PhysicalFontCollection and becomes invalid when original...
constexpr uint32_t featureCode(const char sFeature[4])
Definition: Feature.hxx:21
OpenTypeFeatureDefinitionListPrivate & OpenTypeFeatureDefinitionList()
bool isCharacterVariant() const
Definition: Feature.hxx:94
bool isStylisticSet() const
Definition: Feature.hxx:101
uint32_t m_nCode
Definition: Feature.hxx:108