1 /****************************************************************************
2  *
3  * wofftypes.h
4  *
5  *   Basic WOFF/WOFF2 type definitions and interface (specification
6  *   only).
7  *
8  * Copyright (C) 1996-2020 by
9  * David Turner, Robert Wilhelm, and Werner Lemberg.
10  *
11  * This file is part of the FreeType project, and may only be used,
12  * modified, and distributed under the terms of the FreeType project
13  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
14  * this file you indicate that you have read the license and
15  * understand and accept it fully.
16  *
17  */
18 
19 
20 #ifndef WOFFTYPES_H_
21 #define WOFFTYPES_H_
22 
23 
24 #include <ft2build.h>
25 #include FT_TRUETYPE_TABLES_H
26 #include FT_INTERNAL_OBJECTS_H
27 
28 
29 FT_BEGIN_HEADER
30 
31 
32   /**************************************************************************
33    *
34    * @struct:
35    *   WOFF_HeaderRec
36    *
37    * @description:
38    *   WOFF file format header.
39    *
40    * @fields:
41    *   See
42    *
43    *     https://www.w3.org/TR/WOFF/#WOFFHeader
44    */
45   typedef struct  WOFF_HeaderRec_
46   {
47     FT_ULong   signature;
48     FT_ULong   flavor;
49     FT_ULong   length;
50     FT_UShort  num_tables;
51     FT_UShort  reserved;
52     FT_ULong   totalSfntSize;
53     FT_UShort  majorVersion;
54     FT_UShort  minorVersion;
55     FT_ULong   metaOffset;
56     FT_ULong   metaLength;
57     FT_ULong   metaOrigLength;
58     FT_ULong   privOffset;
59     FT_ULong   privLength;
60 
61   } WOFF_HeaderRec, *WOFF_Header;
62 
63 
64   /**************************************************************************
65    *
66    * @struct:
67    *   WOFF_TableRec
68    *
69    * @description:
70    *   This structure describes a given table of a WOFF font.
71    *
72    * @fields:
73    *   Tag ::
74    *     A four-bytes tag describing the table.
75    *
76    *   Offset ::
77    *     The offset of the table from the start of the WOFF font in its
78    *     resource.
79    *
80    *   CompLength ::
81    *     Compressed table length (in bytes).
82    *
83    *   OrigLength ::
84    *     Uncompressed table length (in bytes).
85    *
86    *   CheckSum ::
87    *     The table checksum.  This value can be ignored.
88    *
89    *   OrigOffset ::
90    *     The uncompressed table file offset.  This value gets computed while
91    *     constructing the (uncompressed) SFNT header.  It is not contained in
92    *     the WOFF file.
93    */
94   typedef struct  WOFF_TableRec_
95   {
96     FT_ULong  Tag;           /* table ID                  */
97     FT_ULong  Offset;        /* table file offset         */
98     FT_ULong  CompLength;    /* compressed table length   */
99     FT_ULong  OrigLength;    /* uncompressed table length */
100     FT_ULong  CheckSum;      /* uncompressed checksum     */
101 
102     FT_ULong  OrigOffset;    /* uncompressed table file offset */
103                              /* (not in the WOFF file)         */
104   } WOFF_TableRec, *WOFF_Table;
105 
106 
107   /**************************************************************************
108    *
109    * @struct:
110    *   WOFF2_TtcFontRec
111    *
112    * @description:
113    *   Metadata for a TTC font entry in WOFF2.
114    *
115    * @fields:
116    *   flavor ::
117    *     TTC font flavor.
118    *
119    *   num_tables ::
120    *     Number of tables in TTC, indicating number of elements in
121    *     `table_indices`.
122    *
123    *   table_indices ::
124    *     Array of table indices for each TTC font.
125    */
126   typedef struct  WOFF2_TtcFontRec_
127   {
128     FT_ULong    flavor;
129     FT_UShort   num_tables;
130     FT_UShort*  table_indices;
131 
132   } WOFF2_TtcFontRec, *WOFF2_TtcFont;
133 
134 
135   /**************************************************************************
136    *
137    * @struct:
138    *   WOFF2_HeaderRec
139    *
140    * @description:
141    *   WOFF2 file format header.
142    *
143    * @fields:
144    *   See
145    *
146    *     https://www.w3.org/TR/WOFF2/#woff20Header
147    *
148    * @note:
149    *   We don't care about the fields `reserved`, `majorVersion` and
150    *   `minorVersion`, so they are not included.  The `totalSfntSize` field
151    *   does not necessarily represent the actual size of the uncompressed
152    *   SFNT font stream, so that is used as a reference value instead.
153    */
154   typedef struct  WOFF2_HeaderRec_
155   {
156     FT_ULong   signature;
157     FT_ULong   flavor;
158     FT_ULong   length;
159     FT_UShort  num_tables;
160     FT_ULong   totalSfntSize;
161     FT_ULong   totalCompressedSize;
162     FT_ULong   metaOffset;
163     FT_ULong   metaLength;
164     FT_ULong   metaOrigLength;
165     FT_ULong   privOffset;
166     FT_ULong   privLength;
167 
168     FT_ULong   uncompressed_size;    /* uncompressed brotli stream size */
169     FT_ULong   compressed_offset;    /* compressed stream offset        */
170     FT_ULong   header_version;       /* version of original TTC Header  */
171     FT_UShort  num_fonts;            /* number of fonts in TTC          */
172     FT_ULong   actual_sfnt_size;     /* actual size of sfnt stream      */
173 
174     WOFF2_TtcFont  ttc_fonts;        /* metadata for fonts in a TTC     */
175 
176   } WOFF2_HeaderRec, *WOFF2_Header;
177 
178 
179   /**************************************************************************
180    *
181    * @struct:
182    *   WOFF2_TableRec
183    *
184    * @description:
185    *   This structure describes a given table of a WOFF2 font.
186    *
187    * @fields:
188    *   See
189    *
190    *     https://www.w3.org/TR/WOFF2/#table_dir_format
191    */
192   typedef struct  WOFF2_TableRec_
193   {
194     FT_Byte   FlagByte;           /* table type and flags      */
195     FT_ULong  Tag;                /* table file offset         */
196     FT_ULong  dst_length;         /* uncompressed table length */
197     FT_ULong  TransformLength;    /* transformed length        */
198 
199     FT_ULong  flags;              /* calculated flags          */
200     FT_ULong  src_offset;         /* compressed table offset   */
201     FT_ULong  src_length;         /* compressed table length   */
202     FT_ULong  dst_offset;         /* uncompressed table offset */
203 
204   } WOFF2_TableRec, *WOFF2_Table;
205 
206 
207   /**************************************************************************
208    *
209    * @struct:
210    *   WOFF2_InfoRec
211    *
212    * @description:
213    *   Metadata for WOFF2 font that may be required for reconstruction of
214    *   sfnt tables.
215    *
216    * @fields:
217    *   header_checksum ::
218    *     Checksum of SFNT offset table.
219    *
220    *   num_glyphs ::
221    *     Number of glyphs in the font.
222    *
223    *   num_hmetrics ::
224    *     `numberOfHMetrics` field in the 'hhea' table.
225    *
226    *   x_mins ::
227    *     `xMin` values of glyph bounding box.
228    *
229    *   glyf_table ::
230    *     A pointer to the `glyf' table record.
231    *
232    *   loca_table ::
233    *     A pointer to the `loca' table record.
234    *
235    *   head_table ::
236    *     A pointer to the `head' table record.
237    */
238   typedef struct  WOFF2_InfoRec_
239   {
240     FT_ULong   header_checksum;
241     FT_UShort  num_glyphs;
242     FT_UShort  num_hmetrics;
243     FT_Short*  x_mins;
244 
245     WOFF2_Table  glyf_table;
246     WOFF2_Table  loca_table;
247     WOFF2_Table  head_table;
248 
249   } WOFF2_InfoRec, *WOFF2_Info;
250 
251 
252   /**************************************************************************
253    *
254    * @struct:
255    *   WOFF2_SubstreamRec
256    *
257    * @description:
258    *   This structure stores information about a substream in the transformed
259    *   'glyf' table in a WOFF2 stream.
260    *
261    * @fields:
262    *   start ::
263    *     Beginning of the substream relative to uncompressed table stream.
264    *
265    *   offset ::
266    *     Offset of the substream relative to uncompressed table stream.
267    *
268    *   size ::
269    *     Size of the substream.
270    */
271   typedef struct  WOFF2_SubstreamRec_
272   {
273     FT_ULong  start;
274     FT_ULong  offset;
275     FT_ULong  size;
276 
277   } WOFF2_SubstreamRec, *WOFF2_Substream;
278 
279 
280   /**************************************************************************
281    *
282    * @struct:
283    *   WOFF2_PointRec
284    *
285    * @description:
286    *   This structure stores information about a point in the transformed
287    *   'glyf' table in a WOFF2 stream.
288    *
289    * @fields:
290    *   x ::
291    *     x-coordinate of point.
292    *
293    *   y ::
294    *     y-coordinate of point.
295    *
296    *   on_curve ::
297    *     Set if point is on-curve.
298    */
299   typedef struct  WOFF2_PointRec_
300   {
301     FT_Int   x;
302     FT_Int   y;
303     FT_Bool  on_curve;
304 
305   } WOFF2_PointRec, *WOFF2_Point;
306 
307 
308 FT_END_HEADER
309 
310 #endif /* WOFFTYPES_H_ */
311 
312 
313 /* END */
314