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_FONT_TTGSUBTABLE_H_ 8 #define CORE_FPDFAPI_FONT_TTGSUBTABLE_H_ 9 10 #include <stdint.h> 11 12 #include <memory> 13 #include <set> 14 #include <vector> 15 16 #include "core/fxcrt/fx_basic.h" 17 #include "core/fxge/fx_font.h" 18 #include "core/fxge/fx_freetype.h" 19 20 class CFX_GlyphMap { 21 public: 22 CFX_GlyphMap(); 23 ~CFX_GlyphMap(); 24 25 void SetAt(int key, int value); 26 bool Lookup(int key, int& value); 27 28 protected: 29 CFX_BinaryBuf m_Buffer; 30 }; 31 32 class CFX_CTTGSUBTable { 33 public: 34 CFX_CTTGSUBTable(); 35 explicit CFX_CTTGSUBTable(FT_Bytes gsub); 36 virtual ~CFX_CTTGSUBTable(); 37 38 bool IsOk() const; 39 bool LoadGSUBTable(FT_Bytes gsub); 40 bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); 41 42 private: 43 struct tt_gsub_header { 44 uint32_t Version; 45 uint16_t ScriptList; 46 uint16_t FeatureList; 47 uint16_t LookupList; 48 }; 49 50 struct TLangSys { 51 TLangSys(); 52 ~TLangSys(); 53 54 uint16_t LookupOrder; 55 uint16_t ReqFeatureIndex; 56 std::vector<uint16_t> FeatureIndices; 57 58 private: 59 TLangSys(const TLangSys&) = delete; 60 TLangSys& operator=(const TLangSys&) = delete; 61 }; 62 63 struct TLangSysRecord { TLangSysRecordTLangSysRecord64 TLangSysRecord() : LangSysTag(0) {} 65 66 uint32_t LangSysTag; 67 TLangSys LangSys; 68 69 private: 70 TLangSysRecord(const TLangSysRecord&) = delete; 71 TLangSysRecord& operator=(const TLangSysRecord&) = delete; 72 }; 73 74 struct TScript { 75 TScript(); 76 ~TScript(); 77 78 uint16_t DefaultLangSys; 79 std::vector<TLangSysRecord> LangSysRecords; 80 81 private: 82 TScript(const TScript&) = delete; 83 TScript& operator=(const TScript&) = delete; 84 }; 85 86 struct TScriptRecord { TScriptRecordTScriptRecord87 TScriptRecord() : ScriptTag(0) {} 88 89 uint32_t ScriptTag; 90 TScript Script; 91 92 private: 93 TScriptRecord(const TScriptRecord&) = delete; 94 TScriptRecord& operator=(const TScriptRecord&) = delete; 95 }; 96 97 struct TScriptList { 98 TScriptList(); 99 ~TScriptList(); 100 101 std::vector<TScriptRecord> ScriptRecords; 102 103 private: 104 TScriptList(const TScriptList&) = delete; 105 TScriptList& operator=(const TScriptList&) = delete; 106 }; 107 108 struct TFeature { 109 TFeature(); 110 ~TFeature(); 111 112 uint16_t FeatureParams; 113 std::vector<uint16_t> LookupListIndices; 114 115 private: 116 TFeature(const TFeature&) = delete; 117 TFeature& operator=(const TFeature&) = delete; 118 }; 119 120 struct TFeatureRecord { TFeatureRecordTFeatureRecord121 TFeatureRecord() : FeatureTag(0) {} 122 123 uint32_t FeatureTag; 124 TFeature Feature; 125 126 private: 127 TFeatureRecord(const TFeatureRecord&) = delete; 128 TFeatureRecord& operator=(const TFeatureRecord&) = delete; 129 }; 130 131 struct TFeatureList { 132 TFeatureList(); 133 ~TFeatureList(); 134 135 std::vector<TFeatureRecord> FeatureRecords; 136 137 private: 138 TFeatureList(const TFeatureList&) = delete; 139 TFeatureList& operator=(const TFeatureList&) = delete; 140 }; 141 142 enum TLookupFlag { 143 LOOKUPFLAG_RightToLeft = 0x0001, 144 LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002, 145 LOOKUPFLAG_IgnoreLigatures = 0x0004, 146 LOOKUPFLAG_IgnoreMarks = 0x0008, 147 LOOKUPFLAG_Reserved = 0x00F0, 148 LOOKUPFLAG_MarkAttachmentType = 0xFF00, 149 }; 150 151 struct TCoverageFormatBase { TCoverageFormatBaseTCoverageFormatBase152 TCoverageFormatBase() : CoverageFormat(0) {} TCoverageFormatBaseTCoverageFormatBase153 explicit TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {} ~TCoverageFormatBaseTCoverageFormatBase154 virtual ~TCoverageFormatBase() {} 155 156 uint16_t CoverageFormat; 157 CFX_GlyphMap m_glyphMap; 158 159 private: 160 TCoverageFormatBase(const TCoverageFormatBase&); 161 TCoverageFormatBase& operator=(const TCoverageFormatBase&); 162 }; 163 164 struct TCoverageFormat1 : public TCoverageFormatBase { 165 TCoverageFormat1(); 166 ~TCoverageFormat1() override; 167 168 std::vector<uint16_t> GlyphArray; 169 170 private: 171 TCoverageFormat1(const TCoverageFormat1&) = delete; 172 TCoverageFormat1& operator=(const TCoverageFormat1&) = delete; 173 }; 174 175 struct TRangeRecord { 176 TRangeRecord(); 177 178 friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) { 179 return r1.Start > r2.Start; 180 } 181 182 uint16_t Start; 183 uint16_t End; 184 uint16_t StartCoverageIndex; 185 186 private: 187 TRangeRecord(const TRangeRecord&) = delete; 188 }; 189 190 struct TCoverageFormat2 : public TCoverageFormatBase { 191 TCoverageFormat2(); 192 ~TCoverageFormat2() override; 193 194 std::vector<TRangeRecord> RangeRecords; 195 196 private: 197 TCoverageFormat2(const TCoverageFormat2&) = delete; 198 TCoverageFormat2& operator=(const TCoverageFormat2&) = delete; 199 }; 200 201 struct TDevice { TDeviceTDevice202 TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} 203 204 uint16_t StartSize; 205 uint16_t EndSize; 206 uint16_t DeltaFormat; 207 208 private: 209 TDevice(const TDevice&) = delete; 210 TDevice& operator=(const TDevice&) = delete; 211 }; 212 213 struct TSubTableBase { TSubTableBaseTSubTableBase214 TSubTableBase() : SubstFormat(0) {} TSubTableBaseTSubTableBase215 explicit TSubTableBase(uint16_t format) : SubstFormat(format) {} ~TSubTableBaseTSubTableBase216 virtual ~TSubTableBase() {} 217 218 uint16_t SubstFormat; 219 220 private: 221 TSubTableBase(const TSubTableBase&) = delete; 222 TSubTableBase& operator=(const TSubTableBase&) = delete; 223 }; 224 225 struct TSingleSubstFormat1 : public TSubTableBase { 226 TSingleSubstFormat1(); 227 ~TSingleSubstFormat1() override; 228 229 std::unique_ptr<TCoverageFormatBase> Coverage; 230 int16_t DeltaGlyphID; 231 232 private: 233 TSingleSubstFormat1(const TSingleSubstFormat1&) = delete; 234 TSingleSubstFormat1& operator=(const TSingleSubstFormat1&) = delete; 235 }; 236 237 struct TSingleSubstFormat2 : public TSubTableBase { 238 TSingleSubstFormat2(); 239 ~TSingleSubstFormat2() override; 240 241 std::unique_ptr<TCoverageFormatBase> Coverage; 242 std::vector<uint16_t> Substitutes; 243 244 private: 245 TSingleSubstFormat2(const TSingleSubstFormat2&) = delete; 246 TSingleSubstFormat2& operator=(const TSingleSubstFormat2&) = delete; 247 }; 248 249 struct TLookup { 250 TLookup(); 251 ~TLookup(); 252 253 uint16_t LookupType; 254 uint16_t LookupFlag; 255 std::vector<std::unique_ptr<TSubTableBase>> SubTables; 256 257 private: 258 TLookup(const TLookup&) = delete; 259 TLookup& operator=(const TLookup&) = delete; 260 }; 261 262 struct TLookupList { 263 TLookupList(); 264 ~TLookupList(); 265 266 std::vector<TLookup> Lookups; 267 268 private: 269 TLookupList(const TLookupList&) = delete; 270 TLookupList& operator=(const TLookupList&) = delete; 271 }; 272 273 bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); 274 void ParseScriptList(FT_Bytes raw, TScriptList* rec); 275 void ParseScript(FT_Bytes raw, TScript* rec); 276 void ParseLangSys(FT_Bytes raw, TLangSys* rec); 277 void ParseFeatureList(FT_Bytes raw, TFeatureList* rec); 278 void ParseFeature(FT_Bytes raw, TFeature* rec); 279 void ParseLookupList(FT_Bytes raw, TLookupList* rec); 280 void ParseLookup(FT_Bytes raw, TLookup* rec); 281 TCoverageFormatBase* ParseCoverage(FT_Bytes raw); 282 void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); 283 void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); 284 void ParseSingleSubst(FT_Bytes raw, std::unique_ptr<TSubTableBase>* rec); 285 void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec); 286 void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec); 287 288 bool GetVerticalGlyphSub(uint32_t glyphnum, 289 uint32_t* vglyphnum, 290 TFeature* Feature); 291 bool GetVerticalGlyphSub2(uint32_t glyphnum, 292 uint32_t* vglyphnum, 293 TLookup* Lookup); 294 int GetCoverageIndex(TCoverageFormatBase* Coverage, uint32_t g) const; 295 296 uint8_t GetUInt8(FT_Bytes& p) const; 297 int16_t GetInt16(FT_Bytes& p) const; 298 uint16_t GetUInt16(FT_Bytes& p) const; 299 int32_t GetInt32(FT_Bytes& p) const; 300 uint32_t GetUInt32(FT_Bytes& p) const; 301 302 std::set<uint32_t> m_featureSet; 303 bool m_bFeautureMapLoad; 304 bool loaded; 305 tt_gsub_header header; 306 TScriptList ScriptList; 307 TFeatureList FeatureList; 308 TLookupList LookupList; 309 }; 310 311 #endif // CORE_FPDFAPI_FONT_TTGSUBTABLE_H_ 312