summaryrefslogtreecommitdiffstats
path: root/gfx/ots/src/silf.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/ots/src/silf.h')
-rw-r--r--gfx/ots/src/silf.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/gfx/ots/src/silf.h b/gfx/ots/src/silf.h
new file mode 100644
index 000000000..b6c08032f
--- /dev/null
+++ b/gfx/ots/src/silf.h
@@ -0,0 +1,196 @@
+// 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_