| 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 | |