1 /***************************************************************************/ 2 /* */ 3 /* pfrtypes.h */ 4 /* */ 5 /* FreeType PFR data structures (specification only). */ 6 /* */ 7 /* Copyright 2002-2018 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