197 lines
6.2 KiB
C++
197 lines
6.2 KiB
C++
// 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_
|