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