tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

silf.h (6351B)


      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:
     17  explicit OpenTypeSILF(Font* font, uint32_t tag)
     18      : Table(font, tag, tag) { }
     19 
     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> {
     28    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> {
     33      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> {
     47      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> {
     55      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> {
     60        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> {
     65          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> {
     85      explicit SILPass(OpenTypeSILF* parent)
     86          : TablePart<OpenTypeSILF>(parent) { }
     87      bool ParsePart(Buffer& table OTS_UNUSED) { 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> {
     92        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 attrCollisions;  // reserved3 before v4.1
    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_