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