| // Copyright (c) 2009-2017 The OTS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef OTS_SILF_H_ |
| #define OTS_SILF_H_ |
| |
| #include <vector> |
| |
| #include "ots.h" |
| #include "graphite.h" |
| |
| namespace ots { |
| |
| class OpenTypeSILF : public Table { |
| public: |
| explicit OpenTypeSILF(Font* font, uint32_t tag) |
| : Table(font, tag, tag) { } |
| |
| bool Parse(const uint8_t* data, size_t length) { |
| return this->Parse(data, length, false); |
| } |
| bool Serialize(OTSStream* out); |
| |
| private: |
| bool Parse(const uint8_t* data, size_t length, bool prevent_decompression); |
| struct SILSub : public TablePart<OpenTypeSILF> { |
| explicit SILSub(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent), classes(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| struct JustificationLevel : public TablePart<OpenTypeSILF> { |
| explicit JustificationLevel(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| uint8_t attrStretch; |
| uint8_t attrShrink; |
| uint8_t attrStep; |
| uint8_t attrWeight; |
| uint8_t runto; |
| uint8_t reserved; |
| uint8_t reserved2; |
| uint8_t reserved3; |
| }; |
| struct PseudoMap : public TablePart<OpenTypeSILF> { |
| explicit PseudoMap(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| uint32_t unicode; |
| uint16_t nPseudo; |
| }; |
| struct ClassMap : public TablePart<OpenTypeSILF> { |
| explicit ClassMap(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| struct LookupClass : public TablePart<OpenTypeSILF> { |
| explicit LookupClass(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| struct LookupPair : public TablePart<OpenTypeSILF> { |
| explicit LookupPair(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| uint16_t glyphId; |
| uint16_t index; |
| }; |
| uint16_t numIDs; |
| uint16_t searchRange; |
| uint16_t entrySelector; |
| uint16_t rangeShift; |
| std::vector<LookupPair> lookups; |
| }; |
| uint16_t numClass; |
| uint16_t numLinear; |
| std::vector<uint32_t> oClass; // uint16_t before v4 |
| std::vector<uint16_t> glyphs; |
| std::vector<LookupClass> lookups; |
| }; |
| struct SILPass : public TablePart<OpenTypeSILF> { |
| explicit SILPass(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table) { return false; } |
| bool ParsePart(Buffer& table, const size_t SILSub_init_offset, |
| const size_t next_pass_offset); |
| bool SerializePart(OTSStream* out) const; |
| struct PassRange : public TablePart<OpenTypeSILF> { |
| explicit PassRange(OpenTypeSILF* parent) |
| : TablePart<OpenTypeSILF>(parent) { } |
| bool ParsePart(Buffer& table); |
| bool SerializePart(OTSStream* out) const; |
| uint16_t firstId; |
| uint16_t lastId; |
| uint16_t colId; |
| }; |
| uint8_t flags; |
| uint8_t maxRuleLoop; |
| uint8_t maxRuleContext; |
| uint8_t maxBackup; |
| uint16_t numRules; |
| uint16_t fsmOffset; |
| uint32_t pcCode; |
| uint32_t rcCode; |
| uint32_t aCode; |
| uint32_t oDebug; |
| uint16_t numRows; |
| uint16_t numTransitional; |
| uint16_t numSuccess; |
| uint16_t numColumns; |
| uint16_t numRange; |
| uint16_t searchRange; |
| uint16_t entrySelector; |
| uint16_t rangeShift; |
| std::vector<PassRange> ranges; |
| std::vector<uint16_t> oRuleMap; |
| std::vector<uint16_t> ruleMap; |
| uint8_t minRulePreContext; |
| uint8_t maxRulePreContext; |
| std::vector<int16_t> startStates; |
| std::vector<uint16_t> ruleSortKeys; |
| std::vector<uint8_t> rulePreContext; |
| uint8_t collisionThreshold; // reserved before v5 |
| uint16_t pConstraint; |
| std::vector<uint16_t> oConstraints; |
| std::vector<uint16_t> oActions; |
| std::vector<std::vector<uint16_t>> stateTrans; |
| uint8_t reserved2; |
| std::vector<uint8_t> passConstraints; |
| std::vector<uint8_t> ruleConstraints; |
| std::vector<uint8_t> actions; |
| std::vector<uint16_t> dActions; |
| std::vector<uint16_t> dStates; |
| std::vector<uint16_t> dCols; |
| }; |
| uint32_t ruleVersion; |
| uint16_t passOffset; |
| uint16_t pseudosOffset; |
| uint16_t maxGlyphID; |
| int16_t extraAscent; |
| int16_t extraDescent; |
| uint8_t numPasses; |
| uint8_t iSubst; |
| uint8_t iPos; |
| uint8_t iJust; |
| uint8_t iBidi; |
| uint8_t flags; |
| uint8_t maxPreContext; |
| uint8_t maxPostContext; |
| uint8_t attrPseudo; |
| uint8_t attrBreakWeight; |
| uint8_t attrDirectionality; |
| uint8_t attrMirroring; // reserved before v4 |
| uint8_t attrSkipPasses; // reserved2 before v4 |
| uint8_t numJLevels; |
| std::vector<JustificationLevel> jLevels; |
| uint16_t numLigComp; |
| uint8_t numUserDefn; |
| uint8_t maxCompPerLig; |
| uint8_t direction; |
| uint8_t attCollisions; // reserved3 before v5 |
| uint8_t reserved4; |
| uint8_t reserved5; |
| uint8_t reserved6; |
| uint8_t numCritFeatures; |
| std::vector<uint16_t> critFeatures; |
| uint8_t reserved7; |
| uint8_t numScriptTag; |
| std::vector<uint32_t> scriptTag; |
| uint16_t lbGID; |
| std::vector<uint32_t> oPasses; |
| uint16_t numPseudo; |
| uint16_t searchPseudo; |
| uint16_t pseudoSelector; |
| uint16_t pseudoShift; |
| std::vector<PseudoMap> pMaps; |
| ClassMap classes; |
| std::vector<SILPass> passes; |
| }; |
| uint32_t version; |
| uint32_t compHead; // compression header |
| static const uint32_t SCHEME = 0xF8000000; |
| static const uint32_t FULL_SIZE = 0x07FFFFFF; |
| static const uint32_t COMPILER_VERSION = 0x07FFFFFF; |
| uint16_t numSub; |
| uint16_t reserved; |
| std::vector<uint32_t> offset; |
| std::vector<SILSub> tables; |
| }; |
| |
| } // namespace ots |
| |
| #endif // OTS_SILF_H_ |