123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- // 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_
|