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_CFX_CTTGSUBTABLE_H_ 8 #define CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ 9 10 #include <stdint.h> 11 12 #include <memory> 13 #include <set> 14 #include <vector> 15 16 #include "core/fxge/fx_freetype.h" 17 18 class CFX_CTTGSUBTable { 19 public: 20 CFX_CTTGSUBTable(); 21 ~CFX_CTTGSUBTable(); 22 23 bool LoadGSUBTable(FT_Bytes gsub); 24 bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); 25 26 private: 27 struct TLangSysRecord { 28 TLangSysRecord(); 29 ~TLangSysRecord(); 30 31 uint32_t LangSysTag; 32 uint16_t LookupOrder; 33 uint16_t ReqFeatureIndex; 34 std::vector<uint16_t> FeatureIndices; 35 }; 36 37 struct TScriptRecord { 38 TScriptRecord(); 39 ~TScriptRecord(); 40 41 uint32_t ScriptTag; 42 uint16_t DefaultLangSys; 43 std::vector<TLangSysRecord> LangSysRecords; 44 }; 45 46 struct TFeatureRecord { 47 TFeatureRecord(); 48 ~TFeatureRecord(); 49 50 uint32_t FeatureTag; 51 uint16_t FeatureParams; 52 std::vector<uint16_t> LookupListIndices; 53 }; 54 55 struct TRangeRecord { 56 TRangeRecord(); 57 58 uint16_t Start; 59 uint16_t End; 60 uint16_t StartCoverageIndex; 61 }; 62 63 struct TCoverageFormatBase { ~TCoverageFormatBaseTCoverageFormatBase64 virtual ~TCoverageFormatBase() {} 65 uint16_t CoverageFormat; 66 }; 67 68 struct TCoverageFormat1 : public TCoverageFormatBase { 69 TCoverageFormat1(); 70 ~TCoverageFormat1() override; 71 72 std::vector<uint16_t> GlyphArray; 73 }; 74 75 struct TCoverageFormat2 : public TCoverageFormatBase { 76 TCoverageFormat2(); 77 ~TCoverageFormat2() override; 78 79 std::vector<TRangeRecord> RangeRecords; 80 }; 81 82 struct TDevice { TDeviceTDevice83 TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} 84 85 uint16_t StartSize; 86 uint16_t EndSize; 87 uint16_t DeltaFormat; 88 }; 89 90 struct TSubTableBase { 91 TSubTableBase(); 92 virtual ~TSubTableBase(); 93 94 std::unique_ptr<TCoverageFormatBase> Coverage; 95 uint16_t SubstFormat; 96 }; 97 98 struct TSubTable1 : public TSubTableBase { 99 TSubTable1(); 100 ~TSubTable1() override; 101 102 int16_t DeltaGlyphID; 103 }; 104 105 struct TSubTable2 : public TSubTableBase { 106 TSubTable2(); 107 ~TSubTable2() override; 108 109 std::vector<uint16_t> Substitutes; 110 }; 111 112 struct TLookup { 113 TLookup(); 114 ~TLookup(); 115 116 uint16_t LookupType; 117 uint16_t LookupFlag; 118 std::vector<std::unique_ptr<TSubTableBase>> SubTables; 119 }; 120 121 bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); 122 void ParseScriptList(FT_Bytes raw); 123 void ParseScript(FT_Bytes raw, TScriptRecord* rec); 124 void ParseLangSys(FT_Bytes raw, TLangSysRecord* rec); 125 void ParseFeatureList(FT_Bytes raw); 126 void ParseFeature(FT_Bytes raw, TFeatureRecord* rec); 127 void ParseLookupList(FT_Bytes raw); 128 void ParseLookup(FT_Bytes raw, TLookup* rec); 129 std::unique_ptr<TCoverageFormatBase> ParseCoverage(FT_Bytes raw); 130 void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); 131 void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); 132 void ParseSingleSubst(FT_Bytes raw, std::unique_ptr<TSubTableBase>* rec); 133 void ParseSingleSubstFormat1(FT_Bytes raw, TSubTable1* rec); 134 void ParseSingleSubstFormat2(FT_Bytes raw, TSubTable2* rec); 135 136 bool GetVerticalGlyphSub(uint32_t glyphnum, 137 uint32_t* vglyphnum, 138 TFeatureRecord* Feature); 139 bool GetVerticalGlyphSub2(uint32_t glyphnum, 140 uint32_t* vglyphnum, 141 TLookup* Lookup); 142 int GetCoverageIndex(TCoverageFormatBase* Coverage, uint32_t g) const; 143 144 uint8_t GetUInt8(FT_Bytes& p) const; 145 int16_t GetInt16(FT_Bytes& p) const; 146 uint16_t GetUInt16(FT_Bytes& p) const; 147 int32_t GetInt32(FT_Bytes& p) const; 148 uint32_t GetUInt32(FT_Bytes& p) const; 149 150 std::set<uint32_t> m_featureSet; 151 bool m_bFeautureMapLoad; 152 std::vector<TScriptRecord> ScriptList; 153 std::vector<TFeatureRecord> FeatureList; 154 std::vector<TLookup> LookupList; 155 }; 156 157 #endif // CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ 158