silf.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. #ifndef OTS_SILF_H_
  5. #define OTS_SILF_H_
  6. #include <vector>
  7. #include "ots.h"
  8. #include "graphite.h"
  9. namespace ots {
  10. class OpenTypeSILF : public Table {
  11. public:
  12. explicit OpenTypeSILF(Font* font, uint32_t tag)
  13. : Table(font, tag, tag) { }
  14. bool Parse(const uint8_t* data, size_t length) {
  15. return this->Parse(data, length, false);
  16. }
  17. bool Serialize(OTSStream* out);
  18. private:
  19. bool Parse(const uint8_t* data, size_t length, bool prevent_decompression);
  20. struct SILSub : public TablePart<OpenTypeSILF> {
  21. explicit SILSub(OpenTypeSILF* parent)
  22. : TablePart<OpenTypeSILF>(parent), classes(parent) { }
  23. bool ParsePart(Buffer& table);
  24. bool SerializePart(OTSStream* out) const;
  25. struct JustificationLevel : public TablePart<OpenTypeSILF> {
  26. explicit JustificationLevel(OpenTypeSILF* parent)
  27. : TablePart<OpenTypeSILF>(parent) { }
  28. bool ParsePart(Buffer& table);
  29. bool SerializePart(OTSStream* out) const;
  30. uint8_t attrStretch;
  31. uint8_t attrShrink;
  32. uint8_t attrStep;
  33. uint8_t attrWeight;
  34. uint8_t runto;
  35. uint8_t reserved;
  36. uint8_t reserved2;
  37. uint8_t reserved3;
  38. };
  39. struct PseudoMap : public TablePart<OpenTypeSILF> {
  40. explicit PseudoMap(OpenTypeSILF* parent)
  41. : TablePart<OpenTypeSILF>(parent) { }
  42. bool ParsePart(Buffer& table);
  43. bool SerializePart(OTSStream* out) const;
  44. uint32_t unicode;
  45. uint16_t nPseudo;
  46. };
  47. struct ClassMap : public TablePart<OpenTypeSILF> {
  48. explicit ClassMap(OpenTypeSILF* parent)
  49. : TablePart<OpenTypeSILF>(parent) { }
  50. bool ParsePart(Buffer& table);
  51. bool SerializePart(OTSStream* out) const;
  52. struct LookupClass : public TablePart<OpenTypeSILF> {
  53. explicit LookupClass(OpenTypeSILF* parent)
  54. : TablePart<OpenTypeSILF>(parent) { }
  55. bool ParsePart(Buffer& table);
  56. bool SerializePart(OTSStream* out) const;
  57. struct LookupPair : public TablePart<OpenTypeSILF> {
  58. explicit LookupPair(OpenTypeSILF* parent)
  59. : TablePart<OpenTypeSILF>(parent) { }
  60. bool ParsePart(Buffer& table);
  61. bool SerializePart(OTSStream* out) const;
  62. uint16_t glyphId;
  63. uint16_t index;
  64. };
  65. uint16_t numIDs;
  66. uint16_t searchRange;
  67. uint16_t entrySelector;
  68. uint16_t rangeShift;
  69. std::vector<LookupPair> lookups;
  70. };
  71. uint16_t numClass;
  72. uint16_t numLinear;
  73. std::vector<uint32_t> oClass; // uint16_t before v4
  74. std::vector<uint16_t> glyphs;
  75. std::vector<LookupClass> lookups;
  76. };
  77. struct SILPass : public TablePart<OpenTypeSILF> {
  78. explicit SILPass(OpenTypeSILF* parent)
  79. : TablePart<OpenTypeSILF>(parent) { }
  80. bool ParsePart(Buffer& table) { return false; }
  81. bool ParsePart(Buffer& table, const size_t SILSub_init_offset,
  82. const size_t next_pass_offset);
  83. bool SerializePart(OTSStream* out) const;
  84. struct PassRange : public TablePart<OpenTypeSILF> {
  85. explicit PassRange(OpenTypeSILF* parent)
  86. : TablePart<OpenTypeSILF>(parent) { }
  87. bool ParsePart(Buffer& table);
  88. bool SerializePart(OTSStream* out) const;
  89. uint16_t firstId;
  90. uint16_t lastId;
  91. uint16_t colId;
  92. };
  93. uint8_t flags;
  94. uint8_t maxRuleLoop;
  95. uint8_t maxRuleContext;
  96. uint8_t maxBackup;
  97. uint16_t numRules;
  98. uint16_t fsmOffset;
  99. uint32_t pcCode;
  100. uint32_t rcCode;
  101. uint32_t aCode;
  102. uint32_t oDebug;
  103. uint16_t numRows;
  104. uint16_t numTransitional;
  105. uint16_t numSuccess;
  106. uint16_t numColumns;
  107. uint16_t numRange;
  108. uint16_t searchRange;
  109. uint16_t entrySelector;
  110. uint16_t rangeShift;
  111. std::vector<PassRange> ranges;
  112. std::vector<uint16_t> oRuleMap;
  113. std::vector<uint16_t> ruleMap;
  114. uint8_t minRulePreContext;
  115. uint8_t maxRulePreContext;
  116. std::vector<int16_t> startStates;
  117. std::vector<uint16_t> ruleSortKeys;
  118. std::vector<uint8_t> rulePreContext;
  119. uint8_t collisionThreshold; // reserved before v5
  120. uint16_t pConstraint;
  121. std::vector<uint16_t> oConstraints;
  122. std::vector<uint16_t> oActions;
  123. std::vector<std::vector<uint16_t>> stateTrans;
  124. uint8_t reserved2;
  125. std::vector<uint8_t> passConstraints;
  126. std::vector<uint8_t> ruleConstraints;
  127. std::vector<uint8_t> actions;
  128. std::vector<uint16_t> dActions;
  129. std::vector<uint16_t> dStates;
  130. std::vector<uint16_t> dCols;
  131. };
  132. uint32_t ruleVersion;
  133. uint16_t passOffset;
  134. uint16_t pseudosOffset;
  135. uint16_t maxGlyphID;
  136. int16_t extraAscent;
  137. int16_t extraDescent;
  138. uint8_t numPasses;
  139. uint8_t iSubst;
  140. uint8_t iPos;
  141. uint8_t iJust;
  142. uint8_t iBidi;
  143. uint8_t flags;
  144. uint8_t maxPreContext;
  145. uint8_t maxPostContext;
  146. uint8_t attrPseudo;
  147. uint8_t attrBreakWeight;
  148. uint8_t attrDirectionality;
  149. uint8_t attrMirroring; // reserved before v4
  150. uint8_t attrSkipPasses; // reserved2 before v4
  151. uint8_t numJLevels;
  152. std::vector<JustificationLevel> jLevels;
  153. uint16_t numLigComp;
  154. uint8_t numUserDefn;
  155. uint8_t maxCompPerLig;
  156. uint8_t direction;
  157. uint8_t attCollisions; // reserved3 before v5
  158. uint8_t reserved4;
  159. uint8_t reserved5;
  160. uint8_t reserved6;
  161. uint8_t numCritFeatures;
  162. std::vector<uint16_t> critFeatures;
  163. uint8_t reserved7;
  164. uint8_t numScriptTag;
  165. std::vector<uint32_t> scriptTag;
  166. uint16_t lbGID;
  167. std::vector<uint32_t> oPasses;
  168. uint16_t numPseudo;
  169. uint16_t searchPseudo;
  170. uint16_t pseudoSelector;
  171. uint16_t pseudoShift;
  172. std::vector<PseudoMap> pMaps;
  173. ClassMap classes;
  174. std::vector<SILPass> passes;
  175. };
  176. uint32_t version;
  177. uint32_t compHead; // compression header
  178. static const uint32_t SCHEME = 0xF8000000;
  179. static const uint32_t FULL_SIZE = 0x07FFFFFF;
  180. static const uint32_t COMPILER_VERSION = 0x07FFFFFF;
  181. uint16_t numSub;
  182. uint16_t reserved;
  183. std::vector<uint32_t> offset;
  184. std::vector<SILSub> tables;
  185. };
  186. } // namespace ots
  187. #endif // OTS_SILF_H_