OLD | NEW |
| (Empty) |
1 // Copyright 2014 PDFium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
6 | |
7 #ifndef CORE_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
8 #define CORE_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
9 | |
10 #include <stdint.h> | |
11 | |
12 #include <map> | |
13 #include <memory> | |
14 | |
15 #include "core/fxcrt/fx_basic.h" | |
16 #include "core/fxge/fx_font.h" | |
17 #include "core/fxge/fx_freetype.h" | |
18 | |
19 class CFX_GlyphMap { | |
20 public: | |
21 CFX_GlyphMap(); | |
22 ~CFX_GlyphMap(); | |
23 | |
24 void SetAt(int key, int value); | |
25 FX_BOOL Lookup(int key, int& value); | |
26 | |
27 protected: | |
28 CFX_BinaryBuf m_Buffer; | |
29 }; | |
30 | |
31 class CFX_CTTGSUBTable { | |
32 public: | |
33 CFX_CTTGSUBTable(); | |
34 explicit CFX_CTTGSUBTable(FT_Bytes gsub); | |
35 virtual ~CFX_CTTGSUBTable(); | |
36 | |
37 bool IsOk() const; | |
38 bool LoadGSUBTable(FT_Bytes gsub); | |
39 bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); | |
40 | |
41 private: | |
42 struct tt_gsub_header { | |
43 uint32_t Version; | |
44 uint16_t ScriptList; | |
45 uint16_t FeatureList; | |
46 uint16_t LookupList; | |
47 }; | |
48 struct TLangSys { | |
49 TLangSys(); | |
50 ~TLangSys(); | |
51 | |
52 uint16_t LookupOrder; | |
53 uint16_t ReqFeatureIndex; | |
54 uint16_t FeatureCount; | |
55 std::unique_ptr<uint16_t[]> FeatureIndex; | |
56 | |
57 private: | |
58 TLangSys(const TLangSys&); | |
59 TLangSys& operator=(const TLangSys&); | |
60 }; | |
61 struct TLangSysRecord { | |
62 TLangSysRecord() : LangSysTag(0) {} | |
63 | |
64 uint32_t LangSysTag; | |
65 TLangSys LangSys; | |
66 | |
67 private: | |
68 TLangSysRecord(const TLangSysRecord&); | |
69 TLangSysRecord& operator=(const TLangSysRecord&); | |
70 }; | |
71 struct TScript { | |
72 TScript(); | |
73 ~TScript(); | |
74 | |
75 uint16_t DefaultLangSys; | |
76 uint16_t LangSysCount; | |
77 std::unique_ptr<TLangSysRecord[]> LangSysRecord; | |
78 | |
79 private: | |
80 TScript(const TScript&); | |
81 TScript& operator=(const TScript&); | |
82 }; | |
83 struct TScriptRecord { | |
84 TScriptRecord() : ScriptTag(0) {} | |
85 | |
86 uint32_t ScriptTag; | |
87 TScript Script; | |
88 | |
89 private: | |
90 TScriptRecord(const TScriptRecord&); | |
91 TScriptRecord& operator=(const TScriptRecord&); | |
92 }; | |
93 struct TScriptList { | |
94 TScriptList(); | |
95 ~TScriptList(); | |
96 | |
97 uint16_t ScriptCount; | |
98 std::unique_ptr<TScriptRecord[]> ScriptRecord; | |
99 | |
100 private: | |
101 TScriptList(const TScriptList&); | |
102 TScriptList& operator=(const TScriptList&); | |
103 }; | |
104 struct TFeature { | |
105 TFeature(); | |
106 ~TFeature(); | |
107 | |
108 uint16_t FeatureParams; | |
109 int LookupCount; | |
110 std::unique_ptr<uint16_t[]> LookupListIndex; | |
111 | |
112 private: | |
113 TFeature(const TFeature&); | |
114 TFeature& operator=(const TFeature&); | |
115 }; | |
116 struct TFeatureRecord { | |
117 TFeatureRecord() : FeatureTag(0) {} | |
118 | |
119 uint32_t FeatureTag; | |
120 TFeature Feature; | |
121 | |
122 private: | |
123 TFeatureRecord(const TFeatureRecord&); | |
124 TFeatureRecord& operator=(const TFeatureRecord&); | |
125 }; | |
126 struct TFeatureList { | |
127 TFeatureList(); | |
128 ~TFeatureList(); | |
129 | |
130 int FeatureCount; | |
131 std::unique_ptr<TFeatureRecord[]> FeatureRecord; | |
132 | |
133 private: | |
134 TFeatureList(const TFeatureList&); | |
135 TFeatureList& operator=(const TFeatureList&); | |
136 }; | |
137 enum TLookupFlag { | |
138 LOOKUPFLAG_RightToLeft = 0x0001, | |
139 LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002, | |
140 LOOKUPFLAG_IgnoreLigatures = 0x0004, | |
141 LOOKUPFLAG_IgnoreMarks = 0x0008, | |
142 LOOKUPFLAG_Reserved = 0x00F0, | |
143 LOOKUPFLAG_MarkAttachmentType = 0xFF00, | |
144 }; | |
145 struct TCoverageFormatBase { | |
146 TCoverageFormatBase() : CoverageFormat(0) {} | |
147 explicit TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {} | |
148 virtual ~TCoverageFormatBase() {} | |
149 | |
150 uint16_t CoverageFormat; | |
151 CFX_GlyphMap m_glyphMap; | |
152 | |
153 private: | |
154 TCoverageFormatBase(const TCoverageFormatBase&); | |
155 TCoverageFormatBase& operator=(const TCoverageFormatBase&); | |
156 }; | |
157 struct TCoverageFormat1 : public TCoverageFormatBase { | |
158 TCoverageFormat1(); | |
159 ~TCoverageFormat1() override; | |
160 | |
161 uint16_t GlyphCount; | |
162 std::unique_ptr<uint16_t[]> GlyphArray; | |
163 | |
164 private: | |
165 TCoverageFormat1(const TCoverageFormat1&); | |
166 TCoverageFormat1& operator=(const TCoverageFormat1&); | |
167 }; | |
168 struct TRangeRecord { | |
169 TRangeRecord(); | |
170 | |
171 friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) { | |
172 return r1.Start > r2.Start; | |
173 } | |
174 | |
175 uint16_t Start; | |
176 uint16_t End; | |
177 uint16_t StartCoverageIndex; | |
178 | |
179 private: | |
180 TRangeRecord(const TRangeRecord&); | |
181 }; | |
182 struct TCoverageFormat2 : public TCoverageFormatBase { | |
183 TCoverageFormat2(); | |
184 ~TCoverageFormat2() override; | |
185 | |
186 uint16_t RangeCount; | |
187 std::unique_ptr<TRangeRecord[]> RangeRecord; | |
188 | |
189 private: | |
190 TCoverageFormat2(const TCoverageFormat2&); | |
191 TCoverageFormat2& operator=(const TCoverageFormat2&); | |
192 }; | |
193 struct TDevice { | |
194 TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} | |
195 | |
196 uint16_t StartSize; | |
197 uint16_t EndSize; | |
198 uint16_t DeltaFormat; | |
199 | |
200 private: | |
201 TDevice(const TDevice&); | |
202 TDevice& operator=(const TDevice&); | |
203 }; | |
204 struct TSubTableBase { | |
205 TSubTableBase() : SubstFormat(0) {} | |
206 explicit TSubTableBase(uint16_t format) : SubstFormat(format) {} | |
207 virtual ~TSubTableBase() {} | |
208 | |
209 uint16_t SubstFormat; | |
210 | |
211 private: | |
212 TSubTableBase(const TSubTableBase&); | |
213 TSubTableBase& operator=(const TSubTableBase&); | |
214 }; | |
215 struct TSingleSubstFormat1 : public TSubTableBase { | |
216 TSingleSubstFormat1(); | |
217 ~TSingleSubstFormat1() override; | |
218 | |
219 std::unique_ptr<TCoverageFormatBase> Coverage; | |
220 int16_t DeltaGlyphID; | |
221 | |
222 private: | |
223 TSingleSubstFormat1(const TSingleSubstFormat1&); | |
224 TSingleSubstFormat1& operator=(const TSingleSubstFormat1&); | |
225 }; | |
226 struct TSingleSubstFormat2 : public TSubTableBase { | |
227 TSingleSubstFormat2(); | |
228 ~TSingleSubstFormat2() override; | |
229 | |
230 std::unique_ptr<TCoverageFormatBase> Coverage; | |
231 uint16_t GlyphCount; | |
232 std::unique_ptr<uint16_t[]> Substitute; | |
233 | |
234 private: | |
235 TSingleSubstFormat2(const TSingleSubstFormat2&); | |
236 TSingleSubstFormat2& operator=(const TSingleSubstFormat2&); | |
237 }; | |
238 struct TLookup { | |
239 TLookup(); | |
240 ~TLookup(); | |
241 | |
242 uint16_t LookupType; | |
243 uint16_t LookupFlag; | |
244 uint16_t SubTableCount; | |
245 std::unique_ptr<TSubTableBase* []> SubTable; | |
246 | |
247 private: | |
248 TLookup(const TLookup&); | |
249 TLookup& operator=(const TLookup&); | |
250 }; | |
251 struct TLookupList { | |
252 TLookupList(); | |
253 ~TLookupList(); | |
254 | |
255 int LookupCount; | |
256 std::unique_ptr<TLookup[]> Lookup; | |
257 | |
258 private: | |
259 TLookupList(const TLookupList&); | |
260 TLookupList& operator=(const TLookupList&); | |
261 }; | |
262 | |
263 bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); | |
264 void ParseScriptList(FT_Bytes raw, TScriptList* rec); | |
265 void ParseScript(FT_Bytes raw, TScript* rec); | |
266 void ParseLangSys(FT_Bytes raw, TLangSys* rec); | |
267 void ParseFeatureList(FT_Bytes raw, TFeatureList* rec); | |
268 void ParseFeature(FT_Bytes raw, TFeature* rec); | |
269 void ParseLookupList(FT_Bytes raw, TLookupList* rec); | |
270 void ParseLookup(FT_Bytes raw, TLookup* rec); | |
271 TCoverageFormatBase* ParseCoverage(FT_Bytes raw); | |
272 void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); | |
273 void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); | |
274 void ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec); | |
275 void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec); | |
276 void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec); | |
277 | |
278 bool GetVerticalGlyphSub(uint32_t glyphnum, | |
279 uint32_t* vglyphnum, | |
280 TFeature* Feature) const; | |
281 bool GetVerticalGlyphSub2(uint32_t glyphnum, | |
282 uint32_t* vglyphnum, | |
283 TLookup* Lookup) const; | |
284 int GetCoverageIndex(TCoverageFormatBase* Coverage, uint32_t g) const; | |
285 | |
286 uint8_t GetUInt8(FT_Bytes& p) const; | |
287 int16_t GetInt16(FT_Bytes& p) const; | |
288 uint16_t GetUInt16(FT_Bytes& p) const; | |
289 int32_t GetInt32(FT_Bytes& p) const; | |
290 uint32_t GetUInt32(FT_Bytes& p) const; | |
291 | |
292 std::map<uint32_t, uint32_t> m_featureMap; | |
293 FX_BOOL m_bFeautureMapLoad; | |
294 bool loaded; | |
295 tt_gsub_header header; | |
296 TScriptList ScriptList; | |
297 TFeatureList FeatureList; | |
298 TLookupList LookupList; | |
299 }; | |
300 | |
301 #endif // CORE_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
OLD | NEW |