xref: /aosp_15_r20/external/pdfium/core/fpdfapi/font/cfx_cttgsubtable.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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