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_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
8 #define CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
9 
10 #include "../../../include/fxge/fx_freetype.h"
11 #include "../../../include/fxcrt/fx_basic.h"
12 #include "common.h"
13 
14 class CFX_GlyphMap
15 {
16 public:
17     CFX_GlyphMap();
18     ~CFX_GlyphMap();
19     void	SetAt(int key, int value);
20     FX_BOOL	Lookup(int key, int &value);
21 protected:
22     CFX_BinaryBuf	m_Buffer;
23 };
24 class CFX_CTTGSUBTable
25 {
26 public:
CFX_CTTGSUBTable(void)27     CFX_CTTGSUBTable(void): m_bFeautureMapLoad(FALSE), loaded(false) {};
CFX_CTTGSUBTable(FT_Bytes gsub)28     CFX_CTTGSUBTable(FT_Bytes gsub): m_bFeautureMapLoad(FALSE), loaded(false)
29     {
30         LoadGSUBTable(gsub);
31     }
~CFX_CTTGSUBTable()32     virtual ~CFX_CTTGSUBTable() {}
IsOk(void)33     bool IsOk(void) const
34     {
35         return loaded;
36     }
37     bool LoadGSUBTable(FT_Bytes gsub);
38     bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);
39 private:
40     struct tt_gsub_header {
41         TT_uint32_t Version;
42         TT_uint16_t ScriptList;
43         TT_uint16_t FeatureList;
44         TT_uint16_t LookupList;
45     };
46     struct TLangSys {
47         TT_uint16_t LookupOrder;
48         TT_uint16_t ReqFeatureIndex;
49         TT_uint16_t FeatureCount;
50         TT_uint16_t *FeatureIndex;
TLangSysTLangSys51         TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}
~TLangSysTLangSys52         ~TLangSys()
53         {
54             if(FeatureIndex) {
55                 delete[] FeatureIndex;
56             }
57         }
58     private:
59         TLangSys(const TLangSys&);
60         TLangSys& operator=(const TLangSys&);
61     };
62     struct TLangSysRecord {
63         TT_uint32_t LangSysTag;
64         struct TLangSys LangSys;
TLangSysRecordTLangSysRecord65         TLangSysRecord(): LangSysTag(0) {}
66     private:
67         TLangSysRecord(const TLangSysRecord&);
68         TLangSysRecord& operator=(const TLangSysRecord&);
69     };
70     struct TScript {
71         TT_uint16_t DefaultLangSys;
72         TT_uint16_t LangSysCount;
73         struct TLangSysRecord *LangSysRecord;
TScriptTScript74         TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}
~TScriptTScript75         ~TScript()
76         {
77             if(LangSysRecord) {
78                 delete[] LangSysRecord;
79             }
80         }
81     private:
82         TScript(const TScript&);
83         TScript& operator=(const TScript&);
84     };
85     struct TScriptRecord {
86         TT_uint32_t ScriptTag;
87         struct TScript Script;
TScriptRecordTScriptRecord88         TScriptRecord(): ScriptTag(0) {}
89     private:
90         TScriptRecord(const TScriptRecord&);
91         TScriptRecord& operator=(const TScriptRecord&);
92     };
93     struct TScriptList {
94         TT_uint16_t ScriptCount;
95         struct TScriptRecord *ScriptRecord;
TScriptListTScriptList96         TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}
~TScriptListTScriptList97         ~TScriptList()
98         {
99             if(ScriptRecord) {
100                 delete[] ScriptRecord;
101             }
102         }
103     private:
104         TScriptList(const TScriptList&);
105         TScriptList& operator=(const TScriptList&);
106     };
107     struct TFeature {
108         TT_uint16_t FeatureParams;
109         int LookupCount;
110         TT_uint16_t *LookupListIndex;
TFeatureTFeature111         TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}
~TFeatureTFeature112         ~TFeature()
113         {
114             if(LookupListIndex) {
115                 delete[] LookupListIndex;
116             }
117         }
118     private:
119         TFeature(const TFeature&);
120         TFeature& operator=(const TFeature&);
121     };
122     struct TFeatureRecord {
123         TT_uint32_t FeatureTag;
124         struct TFeature Feature;
TFeatureRecordTFeatureRecord125         TFeatureRecord(): FeatureTag(0) {}
126     private:
127         TFeatureRecord(const TFeatureRecord&);
128         TFeatureRecord& operator=(const TFeatureRecord&);
129     };
130     struct TFeatureList {
131         int FeatureCount;
132         struct TFeatureRecord *FeatureRecord;
TFeatureListTFeatureList133         TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}
~TFeatureListTFeatureList134         ~TFeatureList()
135         {
136             if(FeatureRecord) {
137                 delete[] FeatureRecord;
138             }
139         }
140     private:
141         TFeatureList(const TFeatureList&);
142         TFeatureList& operator=(const TFeatureList&);
143     };
144     enum TLookupFlag {
145         LOOKUPFLAG_RightToLeft = 0x0001,
146         LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
147         LOOKUPFLAG_IgnoreLigatures = 0x0004,
148         LOOKUPFLAG_IgnoreMarks = 0x0008,
149         LOOKUPFLAG_Reserved = 0x00F0,
150         LOOKUPFLAG_MarkAttachmentType = 0xFF00,
151     };
152     struct TCoverageFormatBase {
153         TT_uint16_t CoverageFormat;
154         CFX_GlyphMap m_glyphMap;
TCoverageFormatBaseTCoverageFormatBase155         TCoverageFormatBase(): CoverageFormat(0) {}
~TCoverageFormatBaseTCoverageFormatBase156         virtual ~TCoverageFormatBase() {}
157     private:
158         TCoverageFormatBase(const TCoverageFormatBase&);
159         TCoverageFormatBase& operator=(const TCoverageFormatBase&);
160     };
161     struct TCoverageFormat1: public TCoverageFormatBase {
162         TT_uint16_t GlyphCount;
163         TT_uint16_t *GlyphArray;
TCoverageFormat1TCoverageFormat1164         TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)
165         {
166             CoverageFormat = 1;
167         }
~TCoverageFormat1TCoverageFormat1168         ~TCoverageFormat1()
169         {
170             if(GlyphArray) {
171                 delete[] GlyphArray;
172             }
173         }
174     private:
175         TCoverageFormat1(const TCoverageFormat1&);
176         TCoverageFormat1& operator=(const TCoverageFormat1&);
177     };
178     struct TRangeRecord {
179         TT_uint16_t Start;
180         TT_uint16_t End;
181         TT_uint16_t StartCoverageIndex;
TRangeRecordTRangeRecord182         TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}
183         friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)
184         {
185             return r1.Start > r2.Start;
186         }
187     private:
188         TRangeRecord(const TRangeRecord&);
189     };
190     struct TCoverageFormat2: public TCoverageFormatBase {
191         TT_uint16_t RangeCount;
192         struct TRangeRecord *RangeRecord;
TCoverageFormat2TCoverageFormat2193         TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)
194         {
195             CoverageFormat = 2;
196         }
~TCoverageFormat2TCoverageFormat2197         ~TCoverageFormat2()
198         {
199             if(RangeRecord) {
200                 delete[] RangeRecord;
201             }
202         }
203     private:
204         TCoverageFormat2(const TCoverageFormat2&);
205         TCoverageFormat2& operator=(const TCoverageFormat2&);
206     };
207     struct TClassDefFormatBase {
208         TT_uint16_t ClassFormat;
TClassDefFormatBaseTClassDefFormatBase209         TClassDefFormatBase(): ClassFormat(0) {}
~TClassDefFormatBaseTClassDefFormatBase210         virtual ~TClassDefFormatBase() {}
211     private:
212         TClassDefFormatBase(const TClassDefFormatBase&);
213         TClassDefFormatBase& operator=(const TClassDefFormatBase&);
214     };
215     struct TClassDefFormat1: public TClassDefFormatBase {
216         TT_uint16_t StartGlyph;
217         TT_uint16_t GlyphCount;
218         TT_uint16_t *ClassValueArray;
TClassDefFormat1TClassDefFormat1219         TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)
220         {
221             ClassFormat = 1;
222         }
~TClassDefFormat1TClassDefFormat1223         ~TClassDefFormat1()
224         {
225             if(ClassValueArray) {
226                 delete[] ClassValueArray;
227             }
228         }
229     private:
230         TClassDefFormat1(const TClassDefFormat1&);
231         TClassDefFormat1& operator=(const TClassDefFormat1&);
232     };
233     struct TClassRangeRecord {
234         TT_uint16_t Start;
235         TT_uint16_t End;
236         TT_uint16_t Class;
TClassRangeRecordTClassRangeRecord237         TClassRangeRecord(): Start(0), End(0), Class(0) {}
238     private:
239         TClassRangeRecord(const TClassRangeRecord&);
240         TClassRangeRecord& operator=(const TClassRangeRecord&);
241     };
242     struct TClassDefFormat2: public TClassDefFormatBase {
243         TT_uint16_t ClassRangeCount;
244         struct TClassRangeRecord *ClassRangeRecord;
TClassDefFormat2TClassDefFormat2245         TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)
246         {
247             ClassFormat = 2;
248         }
~TClassDefFormat2TClassDefFormat2249         ~TClassDefFormat2()
250         {
251             if(ClassRangeRecord) {
252                 delete[] ClassRangeRecord;
253             }
254         }
255     private:
256         TClassDefFormat2(const TClassDefFormat2&);
257         TClassDefFormat2& operator=(const TClassDefFormat2&);
258     };
259     struct TDevice {
260         TT_uint16_t StartSize;
261         TT_uint16_t EndSize;
262         TT_uint16_t DeltaFormat;
TDeviceTDevice263         TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}
264     private:
265         TDevice(const TDevice&);
266         TDevice& operator=(const TDevice&);
267     };
268     struct TSubTableBase {
269         TT_uint16_t SubstFormat;
TSubTableBaseTSubTableBase270         TSubTableBase(): SubstFormat(0) {}
~TSubTableBaseTSubTableBase271         virtual ~TSubTableBase() {}
272     private:
273         TSubTableBase(const TSubTableBase&);
274         TSubTableBase& operator=(const TSubTableBase&);
275     };
276     struct TSingleSubstFormat1: public TSubTableBase {
277         TCoverageFormatBase *Coverage;
278         TT_int16_t DeltaGlyphID;
TSingleSubstFormat1TSingleSubstFormat1279         TSingleSubstFormat1(): Coverage(NULL), DeltaGlyphID(0)
280         {
281             SubstFormat = 1;
282         }
~TSingleSubstFormat1TSingleSubstFormat1283         ~TSingleSubstFormat1()
284         {
285             if(Coverage) {
286                 delete Coverage;
287             }
288         }
289     private:
290         TSingleSubstFormat1(const TSingleSubstFormat1&);
291         TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
292     };
293     struct TSingleSubstFormat2: public TSubTableBase {
294         TCoverageFormatBase *Coverage;
295         TT_uint16_t GlyphCount;
296         TT_uint16_t *Substitute;
TSingleSubstFormat2TSingleSubstFormat2297         TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)
298         {
299             SubstFormat = 2;
300         }
~TSingleSubstFormat2TSingleSubstFormat2301         ~TSingleSubstFormat2()
302         {
303             if(Coverage) {
304                 delete Coverage;
305             }
306             if(Substitute) {
307                 delete[] Substitute;
308             }
309         }
310     private:
311         TSingleSubstFormat2(const TSingleSubstFormat2&);
312         TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
313     };
314     struct TLookup {
315         TT_uint16_t LookupType;
316         TT_uint16_t LookupFlag;
317         TT_uint16_t SubTableCount;
318         struct TSubTableBase **SubTable;
TLookupTLookup319         TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}
~TLookupTLookup320         ~TLookup()
321         {
322             if(SubTableCount > 0 && SubTable != NULL) {
323                 for(int i = 0; i < SubTableCount; i++) {
324                     delete SubTable[i];
325                 }
326                 delete[] SubTable;
327             }
328         }
329     private:
330         TLookup(const TLookup&);
331         TLookup& operator=(const TLookup&);
332     };
333     struct TLookupList {
334         int LookupCount;
335         struct TLookup *Lookup;
TLookupListTLookupList336         TLookupList(): LookupCount(0), Lookup(NULL) {}
~TLookupListTLookupList337         ~TLookupList()
338         {
339             if(Lookup) {
340                 delete[] Lookup;
341             }
342         }
343     private:
344         TLookupList(const TLookupList&);
345         TLookupList& operator=(const TLookupList&);
346     };
347     bool Parse(
348         FT_Bytes scriptlist,
349         FT_Bytes featurelist,
350         FT_Bytes lookuplist);
351     void ParseScriptList(FT_Bytes raw, TScriptList *rec);
352     void ParseScript(FT_Bytes raw, TScript *rec);
353     void ParseLangSys(FT_Bytes raw, TLangSys *rec);
354     void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);
355     void ParseFeature(FT_Bytes raw, TFeature *rec);
356     void ParseLookupList(FT_Bytes raw, TLookupList *rec);
357     void ParseLookup(FT_Bytes raw, TLookup *rec);
358     void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);
359     void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);
360     void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);
361     void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);
362     void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);
363     void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);
364     bool GetVerticalGlyphSub(
365         TT_uint32_t glyphnum,
366         TT_uint32_t *vglyphnum,
367         struct TFeature *Feature);
368     bool GetVerticalGlyphSub2(
369         TT_uint32_t glyphnum,
370         TT_uint32_t *vglyphnum,
371         struct TLookup *Lookup);
372     int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);
GetUInt8(FT_Bytes & p)373     TT_uint8_t GetUInt8(FT_Bytes& p) const
374     {
375         TT_uint8_t ret = p[0];
376         p += 1;
377         return ret;
378     }
GetInt16(FT_Bytes & p)379     TT_int16_t GetInt16(FT_Bytes& p) const
380     {
381         TT_uint16_t ret = p[0] << 8 | p[1];
382         p += 2;
383         return *(TT_int16_t*)&ret;
384     }
GetUInt16(FT_Bytes & p)385     TT_uint16_t GetUInt16(FT_Bytes& p) const
386     {
387         TT_uint16_t ret = p[0] << 8 | p[1];
388         p += 2;
389         return ret;
390     }
GetInt32(FT_Bytes & p)391     TT_int32_t GetInt32(FT_Bytes& p) const
392     {
393         TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
394         p += 4;
395         return *(TT_int32_t*)&ret;
396     }
GetUInt32(FT_Bytes & p)397     TT_uint32_t GetUInt32(FT_Bytes& p) const
398     {
399         TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
400         p += 4;
401         return ret;
402     }
403     CFX_CMapDWordToDWord m_featureMap;
404     FX_BOOL	m_bFeautureMapLoad;
405     bool loaded;
406     struct tt_gsub_header header;
407     struct TScriptList ScriptList;
408     struct TFeatureList FeatureList;
409     struct TLookupList LookupList;
410 };
411 class CFX_GSUBTable FX_FINAL : public IFX_GSUBTable
412 {
413 public:
Release()414     virtual void	Release() FX_OVERRIDE
415     {
416         delete this;
417     }
418     virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) FX_OVERRIDE;
419 
420     CFX_CTTGSUBTable m_GsubImp;
421 
422 private:
~CFX_GSUBTable()423     ~CFX_GSUBTable() { }
424 };
425 
426 #endif  // CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
427