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 | |
24 | FT_BEGIN_HEADER |
25 | |
26 | /************************************************************************/ |
27 | |
28 | /* the PFR Header structure */ |
29 | typedef struct |
30 | { |
31 | FT_UInt32 ; |
32 | FT_UInt ; |
33 | FT_UInt ; |
34 | FT_UInt ; |
35 | |
36 | FT_UInt ; |
37 | FT_UInt ; |
38 | |
39 | FT_UInt ; |
40 | FT_UInt32 ; |
41 | FT_UInt32 ; |
42 | |
43 | FT_UInt32 ; |
44 | FT_UInt32 ; |
45 | FT_UInt32 ; |
46 | |
47 | FT_UInt ; |
48 | FT_UInt32 ; |
49 | FT_UInt32 ; |
50 | |
51 | FT_UInt ; |
52 | FT_UInt ; |
53 | FT_UInt ; |
54 | |
55 | FT_UInt ; |
56 | FT_UInt ; |
57 | |
58 | FT_UInt32 ; |
59 | FT_UInt32 ; |
60 | FT_UInt32 ; |
61 | |
62 | FT_UInt ; |
63 | FT_UInt ; |
64 | FT_UInt ; |
65 | FT_UInt ; |
66 | |
67 | } , *; |
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 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 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 0x08U |
271 | #define 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 | |
326 | FT_END_HEADER |
327 | |
328 | #endif /* PFRTYPES_H_ */ |
329 | |
330 | |
331 | /* END */ |
332 | |