| 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_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
| 8 #define CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
| 9 | |
| 10 #include <stdint.h> | |
| 11 | |
| 12 #include <map> | |
| 13 | |
| 14 #include "core/include/fxcrt/fx_basic.h" | |
| 15 #include "core/include/fxge/fx_font.h" | |
| 16 #include "core/include/fxge/fx_freetype.h" | |
| 17 | |
| 18 class CFX_GlyphMap { | |
| 19 public: | |
| 20 CFX_GlyphMap(); | |
| 21 ~CFX_GlyphMap(); | |
| 22 void SetAt(int key, int value); | |
| 23 FX_BOOL Lookup(int key, int& value); | |
| 24 | |
| 25 protected: | |
| 26 CFX_BinaryBuf m_Buffer; | |
| 27 }; | |
| 28 class CFX_CTTGSUBTable { | |
| 29 public: | |
| 30 CFX_CTTGSUBTable(void) : m_bFeautureMapLoad(FALSE), loaded(false) {} | |
| 31 CFX_CTTGSUBTable(FT_Bytes gsub) : m_bFeautureMapLoad(FALSE), loaded(false) { | |
| 32 LoadGSUBTable(gsub); | |
| 33 } | |
| 34 virtual ~CFX_CTTGSUBTable() {} | |
| 35 bool IsOk(void) const { return loaded; } | |
| 36 bool LoadGSUBTable(FT_Bytes gsub); | |
| 37 bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); | |
| 38 | |
| 39 private: | |
| 40 struct tt_gsub_header { | |
| 41 uint32_t Version; | |
| 42 uint16_t ScriptList; | |
| 43 uint16_t FeatureList; | |
| 44 uint16_t LookupList; | |
| 45 }; | |
| 46 struct TLangSys { | |
| 47 uint16_t LookupOrder; | |
| 48 uint16_t ReqFeatureIndex; | |
| 49 uint16_t FeatureCount; | |
| 50 uint16_t* FeatureIndex; | |
| 51 TLangSys() | |
| 52 : LookupOrder(0), | |
| 53 ReqFeatureIndex(0), | |
| 54 FeatureCount(0), | |
| 55 FeatureIndex(NULL) {} | |
| 56 ~TLangSys() { delete[] FeatureIndex; } | |
| 57 | |
| 58 private: | |
| 59 TLangSys(const TLangSys&); | |
| 60 TLangSys& operator=(const TLangSys&); | |
| 61 }; | |
| 62 struct TLangSysRecord { | |
| 63 uint32_t LangSysTag; | |
| 64 struct TLangSys LangSys; | |
| 65 TLangSysRecord() : LangSysTag(0) {} | |
| 66 | |
| 67 private: | |
| 68 TLangSysRecord(const TLangSysRecord&); | |
| 69 TLangSysRecord& operator=(const TLangSysRecord&); | |
| 70 }; | |
| 71 struct TScript { | |
| 72 uint16_t DefaultLangSys; | |
| 73 uint16_t LangSysCount; | |
| 74 struct TLangSysRecord* LangSysRecord; | |
| 75 TScript() : DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {} | |
| 76 ~TScript() { delete[] LangSysRecord; } | |
| 77 | |
| 78 private: | |
| 79 TScript(const TScript&); | |
| 80 TScript& operator=(const TScript&); | |
| 81 }; | |
| 82 struct TScriptRecord { | |
| 83 uint32_t ScriptTag; | |
| 84 struct TScript Script; | |
| 85 TScriptRecord() : ScriptTag(0) {} | |
| 86 | |
| 87 private: | |
| 88 TScriptRecord(const TScriptRecord&); | |
| 89 TScriptRecord& operator=(const TScriptRecord&); | |
| 90 }; | |
| 91 struct TScriptList { | |
| 92 uint16_t ScriptCount; | |
| 93 struct TScriptRecord* ScriptRecord; | |
| 94 TScriptList() : ScriptCount(0), ScriptRecord(NULL) {} | |
| 95 ~TScriptList() { delete[] ScriptRecord; } | |
| 96 | |
| 97 private: | |
| 98 TScriptList(const TScriptList&); | |
| 99 TScriptList& operator=(const TScriptList&); | |
| 100 }; | |
| 101 struct TFeature { | |
| 102 uint16_t FeatureParams; | |
| 103 int LookupCount; | |
| 104 uint16_t* LookupListIndex; | |
| 105 TFeature() : FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {} | |
| 106 ~TFeature() { delete[] LookupListIndex; } | |
| 107 | |
| 108 private: | |
| 109 TFeature(const TFeature&); | |
| 110 TFeature& operator=(const TFeature&); | |
| 111 }; | |
| 112 struct TFeatureRecord { | |
| 113 uint32_t FeatureTag; | |
| 114 struct TFeature Feature; | |
| 115 TFeatureRecord() : FeatureTag(0) {} | |
| 116 | |
| 117 private: | |
| 118 TFeatureRecord(const TFeatureRecord&); | |
| 119 TFeatureRecord& operator=(const TFeatureRecord&); | |
| 120 }; | |
| 121 struct TFeatureList { | |
| 122 int FeatureCount; | |
| 123 struct TFeatureRecord* FeatureRecord; | |
| 124 TFeatureList() : FeatureCount(0), FeatureRecord(NULL) {} | |
| 125 ~TFeatureList() { delete[] FeatureRecord; } | |
| 126 | |
| 127 private: | |
| 128 TFeatureList(const TFeatureList&); | |
| 129 TFeatureList& operator=(const TFeatureList&); | |
| 130 }; | |
| 131 enum TLookupFlag { | |
| 132 LOOKUPFLAG_RightToLeft = 0x0001, | |
| 133 LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002, | |
| 134 LOOKUPFLAG_IgnoreLigatures = 0x0004, | |
| 135 LOOKUPFLAG_IgnoreMarks = 0x0008, | |
| 136 LOOKUPFLAG_Reserved = 0x00F0, | |
| 137 LOOKUPFLAG_MarkAttachmentType = 0xFF00, | |
| 138 }; | |
| 139 struct TCoverageFormatBase { | |
| 140 uint16_t CoverageFormat; | |
| 141 CFX_GlyphMap m_glyphMap; | |
| 142 TCoverageFormatBase() : CoverageFormat(0) {} | |
| 143 virtual ~TCoverageFormatBase() {} | |
| 144 | |
| 145 private: | |
| 146 TCoverageFormatBase(const TCoverageFormatBase&); | |
| 147 TCoverageFormatBase& operator=(const TCoverageFormatBase&); | |
| 148 }; | |
| 149 struct TCoverageFormat1 : public TCoverageFormatBase { | |
| 150 uint16_t GlyphCount; | |
| 151 uint16_t* GlyphArray; | |
| 152 TCoverageFormat1() : GlyphCount(0), GlyphArray(NULL) { CoverageFormat = 1; } | |
| 153 ~TCoverageFormat1() override { delete[] GlyphArray; } | |
| 154 | |
| 155 private: | |
| 156 TCoverageFormat1(const TCoverageFormat1&); | |
| 157 TCoverageFormat1& operator=(const TCoverageFormat1&); | |
| 158 }; | |
| 159 struct TRangeRecord { | |
| 160 uint16_t Start; | |
| 161 uint16_t End; | |
| 162 uint16_t StartCoverageIndex; | |
| 163 TRangeRecord() : Start(0), End(0), StartCoverageIndex(0) {} | |
| 164 friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) { | |
| 165 return r1.Start > r2.Start; | |
| 166 } | |
| 167 | |
| 168 private: | |
| 169 TRangeRecord(const TRangeRecord&); | |
| 170 }; | |
| 171 struct TCoverageFormat2 : public TCoverageFormatBase { | |
| 172 uint16_t RangeCount; | |
| 173 struct TRangeRecord* RangeRecord; | |
| 174 TCoverageFormat2() : RangeCount(0), RangeRecord(NULL) { | |
| 175 CoverageFormat = 2; | |
| 176 } | |
| 177 ~TCoverageFormat2() override { delete[] RangeRecord; } | |
| 178 | |
| 179 private: | |
| 180 TCoverageFormat2(const TCoverageFormat2&); | |
| 181 TCoverageFormat2& operator=(const TCoverageFormat2&); | |
| 182 }; | |
| 183 struct TClassDefFormatBase { | |
| 184 uint16_t ClassFormat; | |
| 185 TClassDefFormatBase() : ClassFormat(0) {} | |
| 186 virtual ~TClassDefFormatBase() {} | |
| 187 | |
| 188 private: | |
| 189 TClassDefFormatBase(const TClassDefFormatBase&); | |
| 190 TClassDefFormatBase& operator=(const TClassDefFormatBase&); | |
| 191 }; | |
| 192 struct TClassDefFormat1 : public TClassDefFormatBase { | |
| 193 uint16_t StartGlyph; | |
| 194 uint16_t GlyphCount; | |
| 195 uint16_t* ClassValueArray; | |
| 196 TClassDefFormat1() : StartGlyph(0), GlyphCount(0), ClassValueArray(NULL) { | |
| 197 ClassFormat = 1; | |
| 198 } | |
| 199 ~TClassDefFormat1() override { delete[] ClassValueArray; } | |
| 200 | |
| 201 private: | |
| 202 TClassDefFormat1(const TClassDefFormat1&); | |
| 203 TClassDefFormat1& operator=(const TClassDefFormat1&); | |
| 204 }; | |
| 205 struct TClassRangeRecord { | |
| 206 uint16_t Start; | |
| 207 uint16_t End; | |
| 208 uint16_t Class; | |
| 209 TClassRangeRecord() : Start(0), End(0), Class(0) {} | |
| 210 | |
| 211 private: | |
| 212 TClassRangeRecord(const TClassRangeRecord&); | |
| 213 TClassRangeRecord& operator=(const TClassRangeRecord&); | |
| 214 }; | |
| 215 struct TClassDefFormat2 : public TClassDefFormatBase { | |
| 216 uint16_t ClassRangeCount; | |
| 217 struct TClassRangeRecord* ClassRangeRecord; | |
| 218 TClassDefFormat2() : ClassRangeCount(0), ClassRangeRecord(NULL) { | |
| 219 ClassFormat = 2; | |
| 220 } | |
| 221 ~TClassDefFormat2() override { delete[] ClassRangeRecord; } | |
| 222 | |
| 223 private: | |
| 224 TClassDefFormat2(const TClassDefFormat2&); | |
| 225 TClassDefFormat2& operator=(const TClassDefFormat2&); | |
| 226 }; | |
| 227 struct TDevice { | |
| 228 uint16_t StartSize; | |
| 229 uint16_t EndSize; | |
| 230 uint16_t DeltaFormat; | |
| 231 TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} | |
| 232 | |
| 233 private: | |
| 234 TDevice(const TDevice&); | |
| 235 TDevice& operator=(const TDevice&); | |
| 236 }; | |
| 237 struct TSubTableBase { | |
| 238 uint16_t SubstFormat; | |
| 239 TSubTableBase() : SubstFormat(0) {} | |
| 240 virtual ~TSubTableBase() {} | |
| 241 | |
| 242 private: | |
| 243 TSubTableBase(const TSubTableBase&); | |
| 244 TSubTableBase& operator=(const TSubTableBase&); | |
| 245 }; | |
| 246 struct TSingleSubstFormat1 : public TSubTableBase { | |
| 247 TCoverageFormatBase* Coverage; | |
| 248 int16_t DeltaGlyphID; | |
| 249 TSingleSubstFormat1() : Coverage(NULL), DeltaGlyphID(0) { SubstFormat = 1; } | |
| 250 ~TSingleSubstFormat1() override { delete Coverage; } | |
| 251 | |
| 252 private: | |
| 253 TSingleSubstFormat1(const TSingleSubstFormat1&); | |
| 254 TSingleSubstFormat1& operator=(const TSingleSubstFormat1&); | |
| 255 }; | |
| 256 struct TSingleSubstFormat2 : public TSubTableBase { | |
| 257 TCoverageFormatBase* Coverage; | |
| 258 uint16_t GlyphCount; | |
| 259 uint16_t* Substitute; | |
| 260 TSingleSubstFormat2() : Coverage(NULL), GlyphCount(0), Substitute(NULL) { | |
| 261 SubstFormat = 2; | |
| 262 } | |
| 263 ~TSingleSubstFormat2() override { | |
| 264 delete Coverage; | |
| 265 delete[] Substitute; | |
| 266 } | |
| 267 | |
| 268 private: | |
| 269 TSingleSubstFormat2(const TSingleSubstFormat2&); | |
| 270 TSingleSubstFormat2& operator=(const TSingleSubstFormat2&); | |
| 271 }; | |
| 272 struct TLookup { | |
| 273 uint16_t LookupType; | |
| 274 uint16_t LookupFlag; | |
| 275 uint16_t SubTableCount; | |
| 276 struct TSubTableBase** SubTable; | |
| 277 TLookup() | |
| 278 : LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {} | |
| 279 ~TLookup() { | |
| 280 if (SubTable) { | |
| 281 for (int i = 0; i < SubTableCount; ++i) | |
| 282 delete SubTable[i]; | |
| 283 delete[] SubTable; | |
| 284 } | |
| 285 } | |
| 286 | |
| 287 private: | |
| 288 TLookup(const TLookup&); | |
| 289 TLookup& operator=(const TLookup&); | |
| 290 }; | |
| 291 struct TLookupList { | |
| 292 int LookupCount; | |
| 293 struct TLookup* Lookup; | |
| 294 TLookupList() : LookupCount(0), Lookup(NULL) {} | |
| 295 ~TLookupList() { delete[] Lookup; } | |
| 296 | |
| 297 private: | |
| 298 TLookupList(const TLookupList&); | |
| 299 TLookupList& operator=(const TLookupList&); | |
| 300 }; | |
| 301 bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); | |
| 302 void ParseScriptList(FT_Bytes raw, TScriptList* rec); | |
| 303 void ParseScript(FT_Bytes raw, TScript* rec); | |
| 304 void ParseLangSys(FT_Bytes raw, TLangSys* rec); | |
| 305 void ParseFeatureList(FT_Bytes raw, TFeatureList* rec); | |
| 306 void ParseFeature(FT_Bytes raw, TFeature* rec); | |
| 307 void ParseLookupList(FT_Bytes raw, TLookupList* rec); | |
| 308 void ParseLookup(FT_Bytes raw, TLookup* rec); | |
| 309 void ParseCoverage(FT_Bytes raw, TCoverageFormatBase** rec); | |
| 310 void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); | |
| 311 void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); | |
| 312 void ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec); | |
| 313 void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec); | |
| 314 void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec); | |
| 315 bool GetVerticalGlyphSub(uint32_t glyphnum, | |
| 316 uint32_t* vglyphnum, | |
| 317 struct TFeature* Feature); | |
| 318 bool GetVerticalGlyphSub2(uint32_t glyphnum, | |
| 319 uint32_t* vglyphnum, | |
| 320 struct TLookup* Lookup); | |
| 321 int GetCoverageIndex(struct TCoverageFormatBase* Coverage, uint32_t g); | |
| 322 uint8_t GetUInt8(FT_Bytes& p) const { | |
| 323 uint8_t ret = p[0]; | |
| 324 p += 1; | |
| 325 return ret; | |
| 326 } | |
| 327 int16_t GetInt16(FT_Bytes& p) const { | |
| 328 uint16_t ret = p[0] << 8 | p[1]; | |
| 329 p += 2; | |
| 330 return *(int16_t*)&ret; | |
| 331 } | |
| 332 uint16_t GetUInt16(FT_Bytes& p) const { | |
| 333 uint16_t ret = p[0] << 8 | p[1]; | |
| 334 p += 2; | |
| 335 return ret; | |
| 336 } | |
| 337 int32_t GetInt32(FT_Bytes& p) const { | |
| 338 uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; | |
| 339 p += 4; | |
| 340 return *(int32_t*)&ret; | |
| 341 } | |
| 342 uint32_t GetUInt32(FT_Bytes& p) const { | |
| 343 uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; | |
| 344 p += 4; | |
| 345 return ret; | |
| 346 } | |
| 347 std::map<FX_DWORD, FX_DWORD> m_featureMap; | |
| 348 FX_BOOL m_bFeautureMapLoad; | |
| 349 bool loaded; | |
| 350 struct tt_gsub_header header; | |
| 351 struct TScriptList ScriptList; | |
| 352 struct TFeatureList FeatureList; | |
| 353 struct TLookupList LookupList; | |
| 354 }; | |
| 355 class CFX_GSUBTable final : public IFX_GSUBTable { | |
| 356 public: | |
| 357 ~CFX_GSUBTable() override {} | |
| 358 FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) override; | |
| 359 | |
| 360 CFX_CTTGSUBTable m_GsubImp; | |
| 361 }; | |
| 362 | |
| 363 #endif // CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_ | |
| OLD | NEW |