1/****************************************************************************
2 *
3 * pfrtypes.h
4 *
5 * FreeType PFR data structures (specification only).
6 *
7 * Copyright (C) 2002-2023 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
10 * This file is part of the FreeType project, and may only be used,
11 * modified, and distributed under the terms of the FreeType project
12 * license, LICENSE.TXT. By continuing to use, modify, or distribute
13 * this file you indicate that you have read the license and
14 * understand and accept it fully.
15 *
16 */
17
18
19#ifndef PFRTYPES_H_
20#define PFRTYPES_H_
21
22#include <freetype/internal/ftobjs.h>
23
24FT_BEGIN_HEADER
25
26 /************************************************************************/
27
28 /* the PFR Header structure */
29 typedef struct PFR_HeaderRec_
30 {
31 FT_UInt32 signature;
32 FT_UInt version;
33 FT_UInt signature2;
34 FT_UInt header_size;
35
36 FT_UInt log_dir_size;
37 FT_UInt log_dir_offset;
38
39 FT_UInt log_font_max_size;
40 FT_UInt32 log_font_section_size;
41 FT_UInt32 log_font_section_offset;
42
43 FT_UInt32 phy_font_max_size;
44 FT_UInt32 phy_font_section_size;
45 FT_UInt32 phy_font_section_offset;
46
47 FT_UInt gps_max_size;
48 FT_UInt32 gps_section_size;
49 FT_UInt32 gps_section_offset;
50
51 FT_UInt max_blue_values;
52 FT_UInt max_x_orus;
53 FT_UInt max_y_orus;
54
55 FT_UInt phy_font_max_size_high;
56 FT_UInt color_flags;
57
58 FT_UInt32 bct_max_size;
59 FT_UInt32 bct_set_max_size;
60 FT_UInt32 phy_bct_set_max_size;
61
62 FT_UInt num_phy_fonts;
63 FT_UInt max_vert_stem_snap;
64 FT_UInt max_horz_stem_snap;
65 FT_UInt max_chars;
66
67 } PFR_HeaderRec, *PFR_Header;
68
69
70 /* used in `color_flags' field of the PFR_Header */
71#define PFR_FLAG_BLACK_PIXEL 0x01U
72#define PFR_FLAG_INVERT_BITMAP 0x02U
73
74
75 /************************************************************************/
76
77 typedef struct PFR_LogFontRec_
78 {
79 FT_UInt32 size;
80 FT_UInt32 offset;
81
82 FT_Int32 matrix[4];
83 FT_UInt stroke_flags;
84 FT_Int stroke_thickness;
85 FT_Int bold_thickness;
86 FT_Int32 miter_limit;
87
88 FT_UInt32 phys_size;
89 FT_UInt32 phys_offset;
90
91 } PFR_LogFontRec, *PFR_LogFont;
92
93
94#define PFR_LINE_JOIN_MITER 0x00U
95#define PFR_LINE_JOIN_ROUND 0x01U
96#define PFR_LINE_JOIN_BEVEL 0x02U
97#define PFR_LINE_JOIN_MASK ( PFR_LINE_JOIN_ROUND | PFR_LINE_JOIN_BEVEL )
98
99#define PFR_LOG_STROKE 0x04U
100#define PFR_LOG_2BYTE_STROKE 0x08U
101#define PFR_LOG_BOLD 0x10U
102#define PFR_LOG_2BYTE_BOLD 0x20U
103#define PFR_LOG_EXTRA_ITEMS 0x40U
104
105
106 /************************************************************************/
107
108#define PFR_BITMAP_2BYTE_CHARCODE 0x01U
109#define PFR_BITMAP_2BYTE_SIZE 0x02U
110#define PFR_BITMAP_3BYTE_OFFSET 0x04U
111
112 /* not part of the specification but used for implementation */
113#define PFR_BITMAP_CHARCODES_VALIDATED 0x40U
114#define PFR_BITMAP_VALID_CHARCODES 0x80U
115
116
117 typedef struct PFR_BitmapCharRec_
118 {
119 FT_UInt char_code;
120 FT_UInt gps_size;
121 FT_UInt32 gps_offset;
122
123 } PFR_BitmapCharRec, *PFR_BitmapChar;
124
125
126#define PFR_STRIKE_2BYTE_XPPM 0x01U
127#define PFR_STRIKE_2BYTE_YPPM 0x02U
128#define PFR_STRIKE_3BYTE_SIZE 0x04U
129#define PFR_STRIKE_3BYTE_OFFSET 0x08U
130#define PFR_STRIKE_2BYTE_COUNT 0x10U
131
132
133 typedef struct PFR_StrikeRec_
134 {
135 FT_UInt x_ppm;
136 FT_UInt y_ppm;
137 FT_UInt flags;
138
139 FT_UInt32 gps_size;
140 FT_UInt32 gps_offset;
141
142 FT_UInt32 bct_size;
143 FT_UInt32 bct_offset;
144
145 /* optional */
146 FT_UInt num_bitmaps;
147 PFR_BitmapChar bitmaps;
148
149 } PFR_StrikeRec, *PFR_Strike;
150
151
152 /************************************************************************/
153
154 typedef struct PFR_CharRec_
155 {
156 FT_UInt char_code;
157 FT_Int advance;
158 FT_UInt gps_size;
159 FT_UInt32 gps_offset;
160
161 } PFR_CharRec, *PFR_Char;
162
163
164 /************************************************************************/
165
166 typedef struct PFR_DimensionRec_
167 {
168 FT_UInt standard;
169 FT_UInt num_stem_snaps;
170 FT_Int* stem_snaps;
171
172 } PFR_DimensionRec, *PFR_Dimension;
173
174 /************************************************************************/
175
176 typedef struct PFR_KernItemRec_* PFR_KernItem;
177
178 typedef struct PFR_KernItemRec_
179 {
180 PFR_KernItem next;
181 FT_Byte pair_count;
182 FT_Byte flags;
183 FT_Short base_adj;
184 FT_UInt pair_size;
185 FT_Offset offset;
186 FT_UInt32 pair1;
187 FT_UInt32 pair2;
188
189 } PFR_KernItemRec;
190
191
192#define PFR_KERN_INDEX( g1, g2 ) \
193 ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )
194
195#define PFR_KERN_PAIR_INDEX( pair ) \
196 PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 )
197
198#define PFR_NEXT_KPAIR( p ) ( p += 2, \
199 ( (FT_UInt32)p[-2] << 16 ) | p[-1] )
200
201
202 /************************************************************************/
203
204 typedef struct PFR_PhyFontRec_
205 {
206 FT_Memory memory;
207 FT_UInt32 offset;
208
209 FT_UInt font_ref_number;
210 FT_UInt outline_resolution;
211 FT_UInt metrics_resolution;
212 FT_BBox bbox;
213 FT_UInt flags;
214 FT_Int standard_advance;
215
216 FT_Int ascent; /* optional, bbox.yMax if not present */
217 FT_Int descent; /* optional, bbox.yMin if not present */
218 FT_Int leading; /* optional, 0 if not present */
219
220 PFR_DimensionRec horizontal;
221 PFR_DimensionRec vertical;
222
223 FT_String* font_id;
224 FT_String* family_name;
225 FT_String* style_name;
226
227 FT_UInt num_strikes;
228 FT_UInt max_strikes;
229 PFR_StrikeRec* strikes;
230
231 FT_UInt num_blue_values;
232 FT_Int *blue_values;
233 FT_UInt blue_fuzz;
234 FT_UInt blue_scale;
235
236 FT_UInt num_chars;
237 FT_Offset chars_offset;
238 PFR_Char chars;
239
240 FT_UInt num_kern_pairs;
241 PFR_KernItem kern_items;
242 PFR_KernItem* kern_items_tail;
243
244 /* not part of the spec, but used during load */
245 FT_ULong bct_offset;
246 FT_Byte* cursor;
247
248 } PFR_PhyFontRec, *PFR_PhyFont;
249
250
251#define PFR_PHY_VERTICAL 0x01U
252#define PFR_PHY_2BYTE_CHARCODE 0x02U
253#define PFR_PHY_PROPORTIONAL 0x04U
254#define PFR_PHY_ASCII_CODE 0x08U
255#define PFR_PHY_2BYTE_GPS_SIZE 0x10U
256#define PFR_PHY_3BYTE_GPS_OFFSET 0x20U
257#define PFR_PHY_EXTRA_ITEMS 0x80U
258
259
260#define PFR_KERN_2BYTE_CHAR 0x01U
261#define PFR_KERN_2BYTE_ADJ 0x02U
262
263
264 /************************************************************************/
265
266#define PFR_GLYPH_YCOUNT 0x01U
267#define PFR_GLYPH_XCOUNT 0x02U
268#define PFR_GLYPH_1BYTE_XYCOUNT 0x04U
269
270#define PFR_GLYPH_SINGLE_EXTRA_ITEMS 0x08U
271#define PFR_GLYPH_COMPOUND_EXTRA_ITEMS 0x40U
272
273#define PFR_GLYPH_IS_COMPOUND 0x80U
274
275
276 /* controlled coordinate */
277 typedef struct PFR_CoordRec_
278 {
279 FT_UInt org;
280 FT_UInt cur;
281
282 } PFR_CoordRec, *PFR_Coord;
283
284
285 typedef struct PFR_SubGlyphRec_
286 {
287 FT_Fixed x_scale;
288 FT_Fixed y_scale;
289 FT_Int x_delta;
290 FT_Int y_delta;
291 FT_UInt32 gps_offset;
292 FT_UInt gps_size;
293
294 } PFR_SubGlyphRec, *PFR_SubGlyph;
295
296
297#define PFR_SUBGLYPH_XSCALE 0x10U
298#define PFR_SUBGLYPH_YSCALE 0x20U
299#define PFR_SUBGLYPH_2BYTE_SIZE 0x40U
300#define PFR_SUBGLYPH_3BYTE_OFFSET 0x80U
301
302
303 typedef struct PFR_GlyphRec_
304 {
305 FT_Byte format;
306
307#if 0
308 FT_UInt num_x_control;
309 FT_UInt num_y_control;
310#endif
311 FT_UInt max_xy_control;
312 FT_Pos* x_control;
313 FT_Pos* y_control;
314
315
316 FT_UInt num_subs;
317 FT_UInt max_subs;
318 PFR_SubGlyphRec* subs;
319
320 FT_GlyphLoader loader;
321 FT_Bool path_begun;
322
323 } PFR_GlyphRec, *PFR_Glyph;
324
325
326FT_END_HEADER
327
328#endif /* PFRTYPES_H_ */
329
330
331/* END */
332