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_GLAT_H_
6 #define OTS_GLAT_H_
7 
8 #include <vector>
9 
10 #include "ots.h"
11 #include "graphite.h"
12 
13 namespace ots {
14 
15 // -----------------------------------------------------------------------------
16 // OpenTypeGLAT_Basic Interface
17 // -----------------------------------------------------------------------------
18 
19 class OpenTypeGLAT_Basic : public Table {
20  public:
OpenTypeGLAT_Basic(Font * font,uint32_t tag)21   explicit OpenTypeGLAT_Basic(Font* font, uint32_t tag)
22       : Table(font, tag, tag) { }
23 
24   virtual bool Parse(const uint8_t* data, size_t length) = 0;
25   virtual bool Serialize(OTSStream* out) = 0;
26 };
27 
28 // -----------------------------------------------------------------------------
29 // OpenTypeGLAT_v1
30 // -----------------------------------------------------------------------------
31 
32 class OpenTypeGLAT_v1 : public OpenTypeGLAT_Basic {
33  public:
OpenTypeGLAT_v1(Font * font,uint32_t tag)34   explicit OpenTypeGLAT_v1(Font* font, uint32_t tag)
35       : OpenTypeGLAT_Basic(font, tag) { }
36 
37   bool Parse(const uint8_t* data, size_t length);
38   bool Serialize(OTSStream* out);
39 
40  private:
41   struct GlatEntry : public TablePart<OpenTypeGLAT_v1> {
GlatEntryGlatEntry42     explicit GlatEntry(OpenTypeGLAT_v1* parent)
43         : TablePart<OpenTypeGLAT_v1>(parent) { }
44     bool ParsePart(Buffer& table);
45     bool SerializePart(OTSStream* out) const;
46     uint8_t attNum;
47     uint8_t num;
48     std::vector<int16_t> attributes;
49   };
50   uint32_t version;
51   std::vector<GlatEntry> entries;
52 };
53 
54 // -----------------------------------------------------------------------------
55 // OpenTypeGLAT_v2
56 // -----------------------------------------------------------------------------
57 
58 class OpenTypeGLAT_v2 : public OpenTypeGLAT_Basic {
59  public:
OpenTypeGLAT_v2(Font * font,uint32_t tag)60   explicit OpenTypeGLAT_v2(Font* font, uint32_t tag)
61       : OpenTypeGLAT_Basic(font, tag) { }
62 
63   bool Parse(const uint8_t* data, size_t length);
64   bool Serialize(OTSStream* out);
65 
66  private:
67  struct GlatEntry : public TablePart<OpenTypeGLAT_v2> {
GlatEntryGlatEntry68    explicit GlatEntry(OpenTypeGLAT_v2* parent)
69       : TablePart<OpenTypeGLAT_v2>(parent) { }
70    bool ParsePart(Buffer& table);
71    bool SerializePart(OTSStream* out) const;
72    int16_t attNum;
73    int16_t num;
74    std::vector<int16_t> attributes;
75   };
76   uint32_t version;
77   std::vector<GlatEntry> entries;
78 };
79 
80 // -----------------------------------------------------------------------------
81 // OpenTypeGLAT_v3
82 // -----------------------------------------------------------------------------
83 
84 class OpenTypeGLAT_v3 : public OpenTypeGLAT_Basic {
85  public:
OpenTypeGLAT_v3(Font * font,uint32_t tag)86   explicit OpenTypeGLAT_v3(Font* font, uint32_t tag)
87      : OpenTypeGLAT_Basic(font, tag) { }
88 
Parse(const uint8_t * data,size_t length)89   bool Parse(const uint8_t* data, size_t length) {
90     return this->Parse(data, length, false);
91   }
92   bool Serialize(OTSStream* out);
93 
94  private:
95   bool Parse(const uint8_t* data, size_t length, bool prevent_decompression);
96   struct GlyphAttrs : public TablePart<OpenTypeGLAT_v3> {
GlyphAttrsGlyphAttrs97     explicit GlyphAttrs(OpenTypeGLAT_v3* parent)
98       : TablePart<OpenTypeGLAT_v3>(parent), octabox(parent) { }
ParsePartGlyphAttrs99     bool ParsePart(Buffer& table) { return false; }
100     bool ParsePart(Buffer& table, const size_t size);
101     bool SerializePart(OTSStream* out) const;
102     struct OctaboxMetrics : public TablePart<OpenTypeGLAT_v3> {
OctaboxMetricsGlyphAttrs::OctaboxMetrics103       explicit OctaboxMetrics(OpenTypeGLAT_v3* parent)
104           : TablePart<OpenTypeGLAT_v3>(parent) { }
105       bool ParsePart(Buffer& table);
106       bool SerializePart(OTSStream* out) const;
107       struct SubboxEntry : public TablePart<OpenTypeGLAT_v3> {
SubboxEntryGlyphAttrs::OctaboxMetrics::SubboxEntry108         explicit SubboxEntry(OpenTypeGLAT_v3* parent)
109             : TablePart<OpenTypeGLAT_v3>(parent) { }
110         bool ParsePart(Buffer& table);
111         bool SerializePart(OTSStream* out) const;
112         uint8_t left;
113         uint8_t right;
114         uint8_t bottom;
115         uint8_t top;
116         uint8_t diag_pos_min;
117         uint8_t diag_pos_max;
118         uint8_t diag_neg_min;
119         uint8_t diag_neg_max;
120       };
121       uint16_t subbox_bitmap;
122       uint8_t diag_neg_min;
123       uint8_t diag_neg_max;
124       uint8_t diag_pos_min;
125       uint8_t diag_pos_max;
126       std::vector<SubboxEntry> subboxes;
127     };
128     struct GlatEntry : public TablePart<OpenTypeGLAT_v3> {
GlatEntryGlyphAttrs::GlatEntry129       explicit GlatEntry(OpenTypeGLAT_v3* parent)
130           : TablePart<OpenTypeGLAT_v3>(parent) { }
131       bool ParsePart(Buffer& table);
132       bool SerializePart(OTSStream* out) const;
133       int16_t attNum;
134       int16_t num;
135       std::vector<int16_t> attributes;
136      };
137     OctaboxMetrics octabox;
138     std::vector<GlatEntry> entries;
139   };
140   uint32_t version;
141   uint32_t compHead;  // compression header
142   static const uint32_t SCHEME = 0xF8000000;
143   static const uint32_t FULL_SIZE = 0x07FFFFFF;
144   static const uint32_t RESERVED = 0x07FFFFFE;
145   static const uint32_t OCTABOXES = 0x00000001;
146   std::vector<GlyphAttrs> entries;
147 };
148 
149 // -----------------------------------------------------------------------------
150 // OpenTypeGLAT
151 // -----------------------------------------------------------------------------
152 
153 class OpenTypeGLAT : public Table {
154  public:
OpenTypeGLAT(Font * font,uint32_t tag)155   explicit OpenTypeGLAT(Font* font, uint32_t tag)
156       : Table(font, tag, tag), font(font), tag(tag) { }
157   OpenTypeGLAT(const OpenTypeGLAT& other) = delete;
158   OpenTypeGLAT& operator=(const OpenTypeGLAT& other) = delete;
~OpenTypeGLAT()159   ~OpenTypeGLAT() { delete handler; }
160 
161   bool Parse(const uint8_t* data, size_t length);
162   bool Serialize(OTSStream* out);
163 
164  private:
165   Font* font;
166   uint32_t tag;
167   OpenTypeGLAT_Basic* handler = nullptr;
168 };
169 
170 }  // namespace ots
171 
172 #endif  // OTS_GLAT_H_
173