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