Coverage Report

Created: 2026-03-12 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ots/src/silf.h
Line
Count
Source
1
// Copyright (c) 2009-2017 The OTS 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
#ifndef OTS_SILF_H_
6
#define OTS_SILF_H_
7
8
#include <vector>
9
10
#include "ots.h"
11
#include "graphite.h"
12
13
namespace ots {
14
15
class OpenTypeSILF : public Table {
16
 public:
17
  explicit OpenTypeSILF(Font* font, uint32_t tag)
18
8.91k
      : Table(font, tag, tag) { }
19
20
8.91k
  bool Parse(const uint8_t* data, size_t length) {
21
8.91k
    return this->Parse(data, length, false);
22
8.91k
  }
23
  bool Serialize(OTSStream* out);
24
25
 private:
26
  bool Parse(const uint8_t* data, size_t length, bool prevent_decompression);
27
  struct SILSub : public TablePart<OpenTypeSILF> {
28
    explicit SILSub(OpenTypeSILF* parent)
29
5.18k
        : TablePart<OpenTypeSILF>(parent), classes(parent) { }
30
    bool ParsePart(Buffer& table);
31
    bool SerializePart(OTSStream* out) const;
32
    struct JustificationLevel : public TablePart<OpenTypeSILF> {
33
      explicit JustificationLevel(OpenTypeSILF* parent)
34
228k
          : TablePart<OpenTypeSILF>(parent) { }
35
      bool ParsePart(Buffer& table);
36
      bool SerializePart(OTSStream* out) const;
37
      uint8_t attrStretch;
38
      uint8_t attrShrink;
39
      uint8_t attrStep;
40
      uint8_t attrWeight;
41
      uint8_t runto;
42
      uint8_t reserved;
43
      uint8_t reserved2;
44
      uint8_t reserved3;
45
    };
46
    struct PseudoMap : public TablePart<OpenTypeSILF> {
47
      explicit PseudoMap(OpenTypeSILF* parent)
48
69.8k
          : TablePart<OpenTypeSILF>(parent) { }
49
      bool ParsePart(Buffer& table);
50
      bool SerializePart(OTSStream* out) const;
51
      uint32_t unicode;
52
      uint16_t nPseudo;
53
    };
54
    struct ClassMap : public TablePart<OpenTypeSILF> {
55
      explicit ClassMap(OpenTypeSILF* parent)
56
5.18k
          : TablePart<OpenTypeSILF>(parent) { }
57
      bool ParsePart(Buffer& table);
58
      bool SerializePart(OTSStream* out) const;
59
      struct LookupClass : public TablePart<OpenTypeSILF> {
60
        explicit LookupClass(OpenTypeSILF* parent)
61
13.0k
            : TablePart<OpenTypeSILF>(parent) { }
62
        bool ParsePart(Buffer& table);
63
        bool SerializePart(OTSStream* out) const;
64
        struct LookupPair : public TablePart<OpenTypeSILF> {
65
          explicit LookupPair(OpenTypeSILF* parent)
66
231k
              : TablePart<OpenTypeSILF>(parent) { }
67
          bool ParsePart(Buffer& table);
68
          bool SerializePart(OTSStream* out) const;
69
          uint16_t glyphId;
70
          uint16_t index;
71
        };
72
        uint16_t numIDs;
73
        uint16_t searchRange;
74
        uint16_t entrySelector;
75
        uint16_t rangeShift;
76
        std::vector<LookupPair> lookups;
77
      };
78
      uint16_t numClass;
79
      uint16_t numLinear;
80
      std::vector<uint32_t> oClass;  // uint16_t before v4
81
      std::vector<uint16_t> glyphs;
82
      std::vector<LookupClass> lookups;
83
    };
84
    struct SILPass : public TablePart<OpenTypeSILF> {
85
      explicit SILPass(OpenTypeSILF* parent)
86
2.46k
          : TablePart<OpenTypeSILF>(parent) { }
87
0
      bool ParsePart(Buffer& table OTS_UNUSED) { return false; }
88
      bool ParsePart(Buffer& table, const size_t SILSub_init_offset,
89
                                    const size_t next_pass_offset);
90
      bool SerializePart(OTSStream* out) const;
91
      struct PassRange : public TablePart<OpenTypeSILF> {
92
        explicit PassRange(OpenTypeSILF* parent)
93
55.4k
            : TablePart<OpenTypeSILF>(parent) { }
94
        bool ParsePart(Buffer& table);
95
        bool SerializePart(OTSStream* out) const;
96
        uint16_t firstId;
97
        uint16_t lastId;
98
        uint16_t colId;
99
      };
100
      uint8_t flags;
101
      uint8_t maxRuleLoop;
102
      uint8_t maxRuleContext;
103
      uint8_t maxBackup;
104
      uint16_t numRules;
105
      uint16_t fsmOffset;
106
      uint32_t pcCode;
107
      uint32_t rcCode;
108
      uint32_t aCode;
109
      uint32_t oDebug;
110
      uint16_t numRows;
111
      uint16_t numTransitional;
112
      uint16_t numSuccess;
113
      uint16_t numColumns;
114
      uint16_t numRange;
115
      uint16_t searchRange;
116
      uint16_t entrySelector;
117
      uint16_t rangeShift;
118
      std::vector<PassRange> ranges;
119
      std::vector<uint16_t> oRuleMap;
120
      std::vector<uint16_t> ruleMap;
121
      uint8_t minRulePreContext;
122
      uint8_t maxRulePreContext;
123
      std::vector<int16_t> startStates;
124
      std::vector<uint16_t> ruleSortKeys;
125
      std::vector<uint8_t> rulePreContext;
126
      uint8_t collisionThreshold;  // reserved before v5
127
      uint16_t pConstraint;
128
      std::vector<uint16_t> oConstraints;
129
      std::vector<uint16_t> oActions;
130
      std::vector<std::vector<uint16_t>> stateTrans;
131
      uint8_t reserved2;
132
      std::vector<uint8_t> passConstraints;
133
      std::vector<uint8_t> ruleConstraints;
134
      std::vector<uint8_t> actions;
135
      std::vector<uint16_t> dActions;
136
      std::vector<uint16_t> dStates;
137
      std::vector<uint16_t> dCols;
138
    };
139
    uint32_t ruleVersion;
140
    uint16_t passOffset;
141
    uint16_t pseudosOffset;
142
    uint16_t maxGlyphID;
143
    int16_t extraAscent;
144
    int16_t extraDescent;
145
    uint8_t numPasses;
146
    uint8_t iSubst;
147
    uint8_t iPos;
148
    uint8_t iJust;
149
    uint8_t iBidi;
150
    uint8_t flags;
151
    uint8_t maxPreContext;
152
    uint8_t maxPostContext;
153
    uint8_t attrPseudo;
154
    uint8_t attrBreakWeight;
155
    uint8_t attrDirectionality;
156
    uint8_t attrMirroring;  // reserved before v4
157
    uint8_t attrSkipPasses;  // reserved2 before v4
158
    uint8_t numJLevels;
159
    std::vector<JustificationLevel> jLevels;
160
    uint16_t numLigComp;
161
    uint8_t numUserDefn;
162
    uint8_t maxCompPerLig;
163
    uint8_t direction;
164
    uint8_t attrCollisions;  // reserved3 before v4.1
165
    uint8_t reserved4;
166
    uint8_t reserved5;
167
    uint8_t reserved6;
168
    uint8_t numCritFeatures;
169
    std::vector<uint16_t> critFeatures;
170
    uint8_t reserved7;
171
    uint8_t numScriptTag;
172
    std::vector<uint32_t> scriptTag;
173
    uint16_t lbGID;
174
    std::vector<uint32_t> oPasses;
175
    uint16_t numPseudo;
176
    uint16_t searchPseudo;
177
    uint16_t pseudoSelector;
178
    uint16_t pseudoShift;
179
    std::vector<PseudoMap> pMaps;
180
    ClassMap classes;
181
    std::vector<SILPass> passes;
182
  };
183
  uint32_t version;
184
  uint32_t compHead;  // compression header
185
  static const uint32_t SCHEME = 0xF8000000;
186
  static const uint32_t FULL_SIZE = 0x07FFFFFF;
187
  static const uint32_t COMPILER_VERSION = 0x07FFFFFF;
188
  uint16_t numSub;
189
  uint16_t reserved;
190
  std::vector<uint32_t> offset;
191
  std::vector<SILSub> tables;
192
};
193
194
}  // namespace ots
195
196
#endif  // OTS_SILF_H_