1 // Copyright 2014 The PDFium Authors 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 <set> 13 #include <vector> 14 15 #include "core/fxcrt/data_vector.h" 16 #include "core/fxge/freetype/fx_freetype.h" 17 #include "third_party/abseil-cpp/absl/types/optional.h" 18 #include "third_party/abseil-cpp/absl/types/variant.h" 19 #include "third_party/base/containers/span.h" 20 21 class CFX_CTTGSUBTable { 22 public: 23 explicit CFX_CTTGSUBTable(pdfium::span<const uint8_t> gsub); 24 ~CFX_CTTGSUBTable(); 25 26 uint32_t GetVerticalGlyph(uint32_t glyphnum) const; 27 28 private: 29 using FeatureIndices = DataVector<uint16_t>; 30 using ScriptRecord = std::vector<FeatureIndices>; 31 32 struct FeatureRecord { 33 FeatureRecord(); 34 ~FeatureRecord(); 35 36 uint32_t feature_tag = 0; 37 DataVector<uint16_t> lookup_list_indices; 38 }; 39 40 struct RangeRecord { 41 RangeRecord(); 42 43 uint16_t start = 0; 44 uint16_t end = 0; 45 uint16_t start_coverage_index = 0; 46 }; 47 48 // GlyphArray for format 1. 49 // RangeRecords for format 2. 50 using CoverageFormat = absl:: 51 variant<absl::monostate, DataVector<uint16_t>, std::vector<RangeRecord>>; 52 53 struct SubTable { 54 SubTable(); 55 SubTable(const SubTable& that) = delete; 56 SubTable& operator=(const SubTable& that) = delete; 57 SubTable(SubTable&& that) noexcept; 58 SubTable& operator=(SubTable&& that) noexcept; 59 ~SubTable(); 60 61 CoverageFormat coverage; 62 // DeltaGlyphID for format 1. 63 // Substitutes for format 2. 64 absl::variant<absl::monostate, int16_t, DataVector<uint16_t>> table_data; 65 }; 66 67 struct Lookup { 68 using SubTables = std::vector<SubTable>; 69 70 Lookup(); 71 Lookup(const Lookup& that) = delete; 72 Lookup& operator=(const Lookup& that) = delete; 73 Lookup(Lookup&& that) noexcept; 74 Lookup& operator=(Lookup&& that) noexcept; 75 ~Lookup(); 76 77 uint16_t lookup_type = 0; 78 SubTables sub_tables; 79 }; 80 81 bool LoadGSUBTable(pdfium::span<const uint8_t> gsub); 82 void Parse(pdfium::span<const uint8_t> scriptlist, 83 pdfium::span<const uint8_t> featurelist, 84 pdfium::span<const uint8_t> lookuplist); 85 void ParseScriptList(pdfium::span<const uint8_t> raw); 86 ScriptRecord ParseScript(const uint8_t* raw); 87 FeatureIndices ParseLangSys(const uint8_t* raw); 88 void ParseFeatureList(pdfium::span<const uint8_t> raw); 89 DataVector<uint16_t> ParseFeatureLookupListIndices(const uint8_t* raw); 90 void ParseLookupList(pdfium::span<const uint8_t> raw); 91 Lookup ParseLookup(const uint8_t* raw); 92 CoverageFormat ParseCoverage(const uint8_t* raw); 93 SubTable ParseSingleSubst(const uint8_t* raw); 94 95 absl::optional<uint32_t> GetVerticalGlyphSub(const FeatureRecord& feature, 96 uint32_t glyphnum) const; 97 absl::optional<uint32_t> GetVerticalGlyphSub2(const Lookup& lookup, 98 uint32_t glyphnum) const; 99 int GetCoverageIndex(const CoverageFormat& coverage, uint32_t g) const; 100 101 uint8_t GetUInt8(const uint8_t*& p) const; 102 int16_t GetInt16(const uint8_t*& p) const; 103 uint16_t GetUInt16(const uint8_t*& p) const; 104 int32_t GetInt32(const uint8_t*& p) const; 105 uint32_t GetUInt32(const uint8_t*& p) const; 106 107 std::set<uint32_t> feature_set_; 108 std::vector<ScriptRecord> script_list_; 109 std::vector<FeatureRecord> feature_list_; 110 std::vector<Lookup> lookup_list_; 111 }; 112 113 #endif // CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ 114