| 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 |