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:
OpenTypeSILF(Font * font,uint32_t tag)17   explicit OpenTypeSILF(Font* font, uint32_t tag)
18       : Table(font, tag, tag) { }
19 
Parse(const uint8_t * data,size_t length)20   bool Parse(const uint8_t* data, size_t length) {
21     return this->Parse(data, length, false);
22   }
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> {
SILSubSILSub28     explicit SILSub(OpenTypeSILF* parent)
29         : TablePart<OpenTypeSILF>(parent), classes(parent) { }
30     bool ParsePart(Buffer& table);
31     bool SerializePart(OTSStream* out) const;
32     struct JustificationLevel : public TablePart<OpenTypeSILF> {
JustificationLevelSILSub::JustificationLevel33       explicit JustificationLevel(OpenTypeSILF* parent)
34           : 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> {
PseudoMapSILSub::PseudoMap47       explicit PseudoMap(OpenTypeSILF* parent)
48           : 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> {
ClassMapSILSub::ClassMap55       explicit ClassMap(OpenTypeSILF* parent)
56           : TablePart<OpenTypeSILF>(parent) { }
57       bool ParsePart(Buffer& table);
58       bool SerializePart(OTSStream* out) const;
59       struct LookupClass : public TablePart<OpenTypeSILF> {
LookupClassSILSub::ClassMap::LookupClass60         explicit LookupClass(OpenTypeSILF* parent)
61             : TablePart<OpenTypeSILF>(parent) { }
62         bool ParsePart(Buffer& table);
63         bool SerializePart(OTSStream* out) const;
64         struct LookupPair : public TablePart<OpenTypeSILF> {
LookupPairSILSub::ClassMap::LookupClass::LookupPair65           explicit LookupPair(OpenTypeSILF* parent)
66               : 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> {
SILPassSILSub::SILPass85       explicit SILPass(OpenTypeSILF* parent)
86           : TablePart<OpenTypeSILF>(parent) { }
ParsePartSILSub::SILPass87       bool ParsePart(Buffer& table) { 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> {
PassRangeSILSub::SILPass::PassRange92         explicit PassRange(OpenTypeSILF* parent)
93             : 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 attCollisions;  // reserved3 before v5
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_
197