[FREETYPE] Update to v2.9.0 and use this as a chance to slim down our lib a bit....
[reactos.git] / sdk / lib / 3rdparty / freetype / include / freetype / internal / cfftypes.h
1 /***************************************************************************/
2 /* */
3 /* cfftypes.h */
4 /* */
5 /* Basic OpenType/CFF type definitions and interface (specification */
6 /* only). */
7 /* */
8 /* Copyright 1996-2018 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 CFFTYPES_H_
21 #define CFFTYPES_H_
22
23
24 #include <ft2build.h>
25 #include FT_FREETYPE_H
26 #include FT_TYPE1_TABLES_H
27 #include FT_INTERNAL_SERVICE_H
28 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
29 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
30 #include FT_INTERNAL_TYPE1_TYPES_H
31
32
33 FT_BEGIN_HEADER
34
35
36 /*************************************************************************/
37 /* */
38 /* <Struct> */
39 /* CFF_IndexRec */
40 /* */
41 /* <Description> */
42 /* A structure used to model a CFF Index table. */
43 /* */
44 /* <Fields> */
45 /* stream :: The source input stream. */
46 /* */
47 /* start :: The position of the first index byte in the */
48 /* input stream. */
49 /* */
50 /* count :: The number of elements in the index. */
51 /* */
52 /* off_size :: The size in bytes of object offsets in index. */
53 /* */
54 /* data_offset :: The position of first data byte in the index's */
55 /* bytes. */
56 /* */
57 /* data_size :: The size of the data table in this index. */
58 /* */
59 /* offsets :: A table of element offsets in the index. Must be */
60 /* loaded explicitly. */
61 /* */
62 /* bytes :: If the index is loaded in memory, its bytes. */
63 /* */
64 typedef struct CFF_IndexRec_
65 {
66 FT_Stream stream;
67 FT_ULong start;
68 FT_UInt hdr_size;
69 FT_UInt count;
70 FT_Byte off_size;
71 FT_ULong data_offset;
72 FT_ULong data_size;
73
74 FT_ULong* offsets;
75 FT_Byte* bytes;
76
77 } CFF_IndexRec, *CFF_Index;
78
79
80 typedef struct CFF_EncodingRec_
81 {
82 FT_UInt format;
83 FT_ULong offset;
84
85 FT_UInt count;
86 FT_UShort sids [256]; /* avoid dynamic allocations */
87 FT_UShort codes[256];
88
89 } CFF_EncodingRec, *CFF_Encoding;
90
91
92 typedef struct CFF_CharsetRec_
93 {
94
95 FT_UInt format;
96 FT_ULong offset;
97
98 FT_UShort* sids;
99 FT_UShort* cids; /* the inverse mapping of `sids'; only needed */
100 /* for CID-keyed fonts */
101 FT_UInt max_cid;
102 FT_UInt num_glyphs;
103
104 } CFF_CharsetRec, *CFF_Charset;
105
106
107 /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */
108
109 typedef struct CFF_VarData_
110 {
111 #if 0
112 FT_UInt itemCount; /* not used; always zero */
113 FT_UInt shortDeltaCount; /* not used; always zero */
114 #endif
115
116 FT_UInt regionIdxCount; /* number of region indexes */
117 FT_UInt* regionIndices; /* array of `regionIdxCount' indices; */
118 /* these index `varRegionList' */
119 } CFF_VarData;
120
121
122 /* contribution of one axis to a region */
123 typedef struct CFF_AxisCoords_
124 {
125 FT_Fixed startCoord;
126 FT_Fixed peakCoord; /* zero peak means no effect (factor = 1) */
127 FT_Fixed endCoord;
128
129 } CFF_AxisCoords;
130
131
132 typedef struct CFF_VarRegion_
133 {
134 CFF_AxisCoords* axisList; /* array of axisCount records */
135
136 } CFF_VarRegion;
137
138
139 typedef struct CFF_VStoreRec_
140 {
141 FT_UInt dataCount;
142 CFF_VarData* varData; /* array of dataCount records */
143 /* vsindex indexes this array */
144 FT_UShort axisCount;
145 FT_UInt regionCount; /* total number of regions defined */
146 CFF_VarRegion* varRegionList;
147
148 } CFF_VStoreRec, *CFF_VStore;
149
150
151 /* forward reference */
152 typedef struct CFF_FontRec_* CFF_Font;
153
154
155 /* This object manages one cached blend vector. */
156 /* */
157 /* There is a BlendRec for Private DICT parsing in each subfont */
158 /* and a BlendRec for charstrings in CF2_Font instance data. */
159 /* A cached BV may be used across DICTs or Charstrings if inputs */
160 /* have not changed. */
161 /* */
162 /* `usedBV' is reset at the start of each parse or charstring. */
163 /* vsindex cannot be changed after a BV is used. */
164 /* */
165 /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32). */
166 typedef struct CFF_BlendRec_
167 {
168 FT_Bool builtBV; /* blendV has been built */
169 FT_Bool usedBV; /* blendV has been used */
170 CFF_Font font; /* top level font struct */
171 FT_UInt lastVsindex; /* last vsindex used */
172 FT_UInt lenNDV; /* normDV length (aka numAxes) */
173 FT_Fixed* lastNDV; /* last NDV used */
174 FT_UInt lenBV; /* BlendV length (aka numMasters) */
175 FT_Int32* BV; /* current blendV (per DICT/glyph) */
176
177 } CFF_BlendRec, *CFF_Blend;
178
179
180 typedef struct CFF_FontRecDictRec_
181 {
182 FT_UInt version;
183 FT_UInt notice;
184 FT_UInt copyright;
185 FT_UInt full_name;
186 FT_UInt family_name;
187 FT_UInt weight;
188 FT_Bool is_fixed_pitch;
189 FT_Fixed italic_angle;
190 FT_Fixed underline_position;
191 FT_Fixed underline_thickness;
192 FT_Int paint_type;
193 FT_Int charstring_type;
194 FT_Matrix font_matrix;
195 FT_Bool has_font_matrix;
196 FT_ULong units_per_em; /* temporarily used as scaling value also */
197 FT_Vector font_offset;
198 FT_ULong unique_id;
199 FT_BBox font_bbox;
200 FT_Pos stroke_width;
201 FT_ULong charset_offset;
202 FT_ULong encoding_offset;
203 FT_ULong charstrings_offset;
204 FT_ULong private_offset;
205 FT_ULong private_size;
206 FT_Long synthetic_base;
207 FT_UInt embedded_postscript;
208
209 /* these should only be used for the top-level font dictionary */
210 FT_UInt cid_registry;
211 FT_UInt cid_ordering;
212 FT_Long cid_supplement;
213
214 FT_Long cid_font_version;
215 FT_Long cid_font_revision;
216 FT_Long cid_font_type;
217 FT_ULong cid_count;
218 FT_ULong cid_uid_base;
219 FT_ULong cid_fd_array_offset;
220 FT_ULong cid_fd_select_offset;
221 FT_UInt cid_font_name;
222
223 /* the next fields come from the data of the deprecated */
224 /* `MultipleMaster' operator; they are needed to parse the (also */
225 /* deprecated) `blend' operator in Type 2 charstrings */
226 FT_UShort num_designs;
227 FT_UShort num_axes;
228
229 /* fields for CFF2 */
230 FT_ULong vstore_offset;
231 FT_UInt maxstack;
232
233 } CFF_FontRecDictRec, *CFF_FontRecDict;
234
235
236 /* forward reference */
237 typedef struct CFF_SubFontRec_* CFF_SubFont;
238
239
240 typedef struct CFF_PrivateRec_
241 {
242 FT_Byte num_blue_values;
243 FT_Byte num_other_blues;
244 FT_Byte num_family_blues;
245 FT_Byte num_family_other_blues;
246
247 FT_Pos blue_values[14];
248 FT_Pos other_blues[10];
249 FT_Pos family_blues[14];
250 FT_Pos family_other_blues[10];
251
252 FT_Fixed blue_scale;
253 FT_Pos blue_shift;
254 FT_Pos blue_fuzz;
255 FT_Pos standard_width;
256 FT_Pos standard_height;
257
258 FT_Byte num_snap_widths;
259 FT_Byte num_snap_heights;
260 FT_Pos snap_widths[13];
261 FT_Pos snap_heights[13];
262 FT_Bool force_bold;
263 FT_Fixed force_bold_threshold;
264 FT_Int lenIV;
265 FT_Int language_group;
266 FT_Fixed expansion_factor;
267 FT_Long initial_random_seed;
268 FT_ULong local_subrs_offset;
269 FT_Pos default_width;
270 FT_Pos nominal_width;
271
272 /* fields for CFF2 */
273 FT_UInt vsindex;
274 CFF_SubFont subfont;
275
276 } CFF_PrivateRec, *CFF_Private;
277
278
279 typedef struct CFF_FDSelectRec_
280 {
281 FT_Byte format;
282 FT_UInt range_count;
283
284 /* that's the table, taken from the file `as is' */
285 FT_Byte* data;
286 FT_UInt data_size;
287
288 /* small cache for format 3 only */
289 FT_UInt cache_first;
290 FT_UInt cache_count;
291 FT_Byte cache_fd;
292
293 } CFF_FDSelectRec, *CFF_FDSelect;
294
295
296 /* A SubFont packs a font dict and a private dict together. They are */
297 /* needed to support CID-keyed CFF fonts. */
298 typedef struct CFF_SubFontRec_
299 {
300 CFF_FontRecDictRec font_dict;
301 CFF_PrivateRec private_dict;
302
303 /* fields for CFF2 */
304 CFF_BlendRec blend; /* current blend vector */
305 FT_UInt lenNDV; /* current length NDV or zero */
306 FT_Fixed* NDV; /* ptr to current NDV or NULL */
307
308 /* `blend_stack' is a writable buffer to hold blend results. */
309 /* This buffer is to the side of the normal cff parser stack; */
310 /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */
311 /* The normal stack then points to these values instead of the DICT */
312 /* because all other operators in Private DICT clear the stack. */
313 /* `blend_stack' could be cleared at each operator other than blend. */
314 /* Blended values are stored as 5-byte fixed point values. */
315
316 FT_Byte* blend_stack; /* base of stack allocation */
317 FT_Byte* blend_top; /* first empty slot */
318 FT_UInt blend_used; /* number of bytes in use */
319 FT_UInt blend_alloc; /* number of bytes allocated */
320
321 CFF_IndexRec local_subrs_index;
322 FT_Byte** local_subrs; /* array of pointers */
323 /* into Local Subrs INDEX data */
324
325 FT_UInt32 random;
326
327 } CFF_SubFontRec;
328
329
330 #define CFF_MAX_CID_FONTS 256
331
332
333 typedef struct CFF_FontRec_
334 {
335 FT_Library library;
336 FT_Stream stream;
337 FT_Memory memory; /* TODO: take this from stream->memory? */
338 FT_ULong base_offset; /* offset to start of CFF */
339 FT_UInt num_faces;
340 FT_UInt num_glyphs;
341
342 FT_Byte version_major;
343 FT_Byte version_minor;
344 FT_Byte header_size;
345
346 FT_UInt top_dict_length; /* cff2 only */
347
348 FT_Bool cff2;
349
350 CFF_IndexRec name_index;
351 CFF_IndexRec top_dict_index;
352 CFF_IndexRec global_subrs_index;
353
354 CFF_EncodingRec encoding;
355 CFF_CharsetRec charset;
356
357 CFF_IndexRec charstrings_index;
358 CFF_IndexRec font_dict_index;
359 CFF_IndexRec private_index;
360 CFF_IndexRec local_subrs_index;
361
362 FT_String* font_name;
363
364 /* array of pointers into Global Subrs INDEX data */
365 FT_Byte** global_subrs;
366
367 /* array of pointers into String INDEX data stored at string_pool */
368 FT_UInt num_strings;
369 FT_Byte** strings;
370 FT_Byte* string_pool;
371 FT_ULong string_pool_size;
372
373 CFF_SubFontRec top_font;
374 FT_UInt num_subfonts;
375 CFF_SubFont subfonts[CFF_MAX_CID_FONTS];
376
377 CFF_FDSelectRec fd_select;
378
379 /* interface to PostScript hinter */
380 PSHinter_Service pshinter;
381
382 /* interface to Postscript Names service */
383 FT_Service_PsCMaps psnames;
384
385 /* interface to CFFLoad service */
386 const void* cffload;
387
388 /* since version 2.3.0 */
389 PS_FontInfoRec* font_info; /* font info dictionary */
390
391 /* since version 2.3.6 */
392 FT_String* registry;
393 FT_String* ordering;
394
395 /* since version 2.4.12 */
396 FT_Generic cf2_instance;
397
398 /* since version 2.7.1 */
399 CFF_VStoreRec vstore; /* parsed vstore structure */
400
401 /* since version 2.9 */
402 PS_FontExtraRec* font_extra;
403
404 } CFF_FontRec;
405
406
407 FT_END_HEADER
408
409 #endif /* CFFTYPES_H_ */
410
411
412 /* END */