| OLD | NEW |
| (Empty) |
| 1 /***************************************************************************/ | |
| 2 /* */ | |
| 3 /* ttobjs.h */ | |
| 4 /* */ | |
| 5 /* Objects manager (specification). */ | |
| 6 /* */ | |
| 7 /* Copyright 1996-2009, 2011-2013 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 __TTOBJS_H__ | |
| 20 #define __TTOBJS_H__ | |
| 21 | |
| 22 | |
| 23 #include "../../include/ft2build.h" | |
| 24 #include "../../include/freetype/internal/ftobjs.h" | |
| 25 #include "../../include/freetype/internal/tttypes.h" | |
| 26 | |
| 27 | |
| 28 FT_BEGIN_HEADER | |
| 29 | |
| 30 | |
| 31 /*************************************************************************/ | |
| 32 /* */ | |
| 33 /* <Type> */ | |
| 34 /* TT_Driver */ | |
| 35 /* */ | |
| 36 /* <Description> */ | |
| 37 /* A handle to a TrueType driver object. */ | |
| 38 /* */ | |
| 39 typedef struct TT_DriverRec_* TT_Driver; | |
| 40 | |
| 41 | |
| 42 /*************************************************************************/ | |
| 43 /* */ | |
| 44 /* <Type> */ | |
| 45 /* TT_Instance */ | |
| 46 /* */ | |
| 47 /* <Description> */ | |
| 48 /* A handle to a TrueType size object. */ | |
| 49 /* */ | |
| 50 typedef struct TT_SizeRec_* TT_Size; | |
| 51 | |
| 52 | |
| 53 /*************************************************************************/ | |
| 54 /* */ | |
| 55 /* <Type> */ | |
| 56 /* TT_GlyphSlot */ | |
| 57 /* */ | |
| 58 /* <Description> */ | |
| 59 /* A handle to a TrueType glyph slot object. */ | |
| 60 /* */ | |
| 61 /* <Note> */ | |
| 62 /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ | |
| 63 /* specific about the TrueType glyph slot. */ | |
| 64 /* */ | |
| 65 typedef FT_GlyphSlot TT_GlyphSlot; | |
| 66 | |
| 67 | |
| 68 /*************************************************************************/ | |
| 69 /* */ | |
| 70 /* <Struct> */ | |
| 71 /* TT_GraphicsState */ | |
| 72 /* */ | |
| 73 /* <Description> */ | |
| 74 /* The TrueType graphics state used during bytecode interpretation. */ | |
| 75 /* */ | |
| 76 typedef struct TT_GraphicsState_ | |
| 77 { | |
| 78 FT_UShort rp0; | |
| 79 FT_UShort rp1; | |
| 80 FT_UShort rp2; | |
| 81 | |
| 82 FT_UnitVector dualVector; | |
| 83 FT_UnitVector projVector; | |
| 84 FT_UnitVector freeVector; | |
| 85 | |
| 86 #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING | |
| 87 FT_Bool both_x_axis; | |
| 88 #endif | |
| 89 | |
| 90 FT_Long loop; | |
| 91 FT_F26Dot6 minimum_distance; | |
| 92 FT_Int round_state; | |
| 93 | |
| 94 FT_Bool auto_flip; | |
| 95 FT_F26Dot6 control_value_cutin; | |
| 96 FT_F26Dot6 single_width_cutin; | |
| 97 FT_F26Dot6 single_width_value; | |
| 98 FT_Short delta_base; | |
| 99 FT_Short delta_shift; | |
| 100 | |
| 101 FT_Byte instruct_control; | |
| 102 /* According to Greg Hitchcock from Microsoft, the `scan_control' */ | |
| 103 /* variable as documented in the TrueType specification is a 32-bit */ | |
| 104 /* integer; the high-word part holds the SCANTYPE value, the low-word */ | |
| 105 /* part the SCANCTRL value. We separate it into two fields. */ | |
| 106 FT_Bool scan_control; | |
| 107 FT_Int scan_type; | |
| 108 | |
| 109 FT_UShort gep0; | |
| 110 FT_UShort gep1; | |
| 111 FT_UShort gep2; | |
| 112 | |
| 113 } TT_GraphicsState; | |
| 114 | |
| 115 | |
| 116 #ifdef TT_USE_BYTECODE_INTERPRETER | |
| 117 | |
| 118 FT_LOCAL( void ) | |
| 119 tt_glyphzone_done( TT_GlyphZone zone ); | |
| 120 | |
| 121 FT_LOCAL( FT_Error ) | |
| 122 tt_glyphzone_new( FT_Memory memory, | |
| 123 FT_UShort maxPoints, | |
| 124 FT_Short maxContours, | |
| 125 TT_GlyphZone zone ); | |
| 126 | |
| 127 #endif /* TT_USE_BYTECODE_INTERPRETER */ | |
| 128 | |
| 129 | |
| 130 | |
| 131 /*************************************************************************/ | |
| 132 /* */ | |
| 133 /* EXECUTION SUBTABLES */ | |
| 134 /* */ | |
| 135 /* These sub-tables relate to instruction execution. */ | |
| 136 /* */ | |
| 137 /*************************************************************************/ | |
| 138 | |
| 139 | |
| 140 #define TT_MAX_CODE_RANGES 3 | |
| 141 | |
| 142 | |
| 143 /*************************************************************************/ | |
| 144 /* */ | |
| 145 /* There can only be 3 active code ranges at once: */ | |
| 146 /* - the Font Program */ | |
| 147 /* - the CVT Program */ | |
| 148 /* - a glyph's instructions set */ | |
| 149 /* */ | |
| 150 typedef enum TT_CodeRange_Tag_ | |
| 151 { | |
| 152 tt_coderange_none = 0, | |
| 153 tt_coderange_font, | |
| 154 tt_coderange_cvt, | |
| 155 tt_coderange_glyph | |
| 156 | |
| 157 } TT_CodeRange_Tag; | |
| 158 | |
| 159 | |
| 160 typedef struct TT_CodeRange_ | |
| 161 { | |
| 162 FT_Byte* base; | |
| 163 FT_ULong size; | |
| 164 | |
| 165 } TT_CodeRange; | |
| 166 | |
| 167 typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; | |
| 168 | |
| 169 | |
| 170 /*************************************************************************/ | |
| 171 /* */ | |
| 172 /* Defines a function/instruction definition record. */ | |
| 173 /* */ | |
| 174 typedef struct TT_DefRecord_ | |
| 175 { | |
| 176 FT_Int range; /* in which code range is it located? */ | |
| 177 FT_Long start; /* where does it start? */ | |
| 178 FT_Long end; /* where does it end? */ | |
| 179 FT_UInt opc; /* function #, or instruction code */ | |
| 180 FT_Bool active; /* is it active? */ | |
| 181 FT_Bool inline_delta; /* is function that defines inline delta? */ | |
| 182 FT_ULong sph_fdef_flags; /* flags to identify special functions */ | |
| 183 | |
| 184 } TT_DefRecord, *TT_DefArray; | |
| 185 | |
| 186 | |
| 187 /*************************************************************************/ | |
| 188 /* */ | |
| 189 /* Subglyph transformation record. */ | |
| 190 /* */ | |
| 191 typedef struct TT_Transform_ | |
| 192 { | |
| 193 FT_Fixed xx, xy; /* transformation matrix coefficients */ | |
| 194 FT_Fixed yx, yy; | |
| 195 FT_F26Dot6 ox, oy; /* offsets */ | |
| 196 | |
| 197 } TT_Transform; | |
| 198 | |
| 199 | |
| 200 /*************************************************************************/ | |
| 201 /* */ | |
| 202 /* A note regarding non-squared pixels: */ | |
| 203 /* */ | |
| 204 /* (This text will probably go into some docs at some time; for now, it */ | |
| 205 /* is kept here to explain some definitions in the TT_Size_Metrics */ | |
| 206 /* record). */ | |
| 207 /* */ | |
| 208 /* The CVT is a one-dimensional array containing values that control */ | |
| 209 /* certain important characteristics in a font, like the height of all */ | |
| 210 /* capitals, all lowercase letter, default spacing or stem width/height. */ | |
| 211 /* */ | |
| 212 /* These values are found in FUnits in the font file, and must be scaled */ | |
| 213 /* to pixel coordinates before being used by the CVT and glyph programs. */ | |
| 214 /* Unfortunately, when using distinct x and y resolutions (or distinct x */ | |
| 215 /* and y pointsizes), there are two possible scalings. */ | |
| 216 /* */ | |
| 217 /* A first try was to implement a `lazy' scheme where all values were */ | |
| 218 /* scaled when first used. However, while some values are always used */ | |
| 219 /* in the same direction, some others are used under many different */ | |
| 220 /* circumstances and orientations. */ | |
| 221 /* */ | |
| 222 /* I have found a simpler way to do the same, and it even seems to work */ | |
| 223 /* in most of the cases: */ | |
| 224 /* */ | |
| 225 /* - All CVT values are scaled to the maximum ppem size. */ | |
| 226 /* */ | |
| 227 /* - When performing a read or write in the CVT, a ratio factor is used */ | |
| 228 /* to perform adequate scaling. Example: */ | |
| 229 /* */ | |
| 230 /* x_ppem = 14 */ | |
| 231 /* y_ppem = 10 */ | |
| 232 /* */ | |
| 233 /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ | |
| 234 /* entries are scaled to it. */ | |
| 235 /* */ | |
| 236 /* x_ratio = 1.0 */ | |
| 237 /* y_ratio = y_ppem/ppem (< 1.0) */ | |
| 238 /* */ | |
| 239 /* We compute the current ratio like: */ | |
| 240 /* */ | |
| 241 /* - If projVector is horizontal, */ | |
| 242 /* ratio = x_ratio = 1.0 */ | |
| 243 /* */ | |
| 244 /* - if projVector is vertical, */ | |
| 245 /* ratio = y_ratio */ | |
| 246 /* */ | |
| 247 /* - else, */ | |
| 248 /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ | |
| 249 /* */ | |
| 250 /* Reading a cvt value returns */ | |
| 251 /* ratio * cvt[index] */ | |
| 252 /* */ | |
| 253 /* Writing a cvt value in pixels: */ | |
| 254 /* cvt[index] / ratio */ | |
| 255 /* */ | |
| 256 /* The current ppem is simply */ | |
| 257 /* ratio * ppem */ | |
| 258 /* */ | |
| 259 /*************************************************************************/ | |
| 260 | |
| 261 | |
| 262 /*************************************************************************/ | |
| 263 /* */ | |
| 264 /* Metrics used by the TrueType size and context objects. */ | |
| 265 /* */ | |
| 266 typedef struct TT_Size_Metrics_ | |
| 267 { | |
| 268 /* for non-square pixels */ | |
| 269 FT_Long x_ratio; | |
| 270 FT_Long y_ratio; | |
| 271 | |
| 272 FT_UShort ppem; /* maximum ppem size */ | |
| 273 FT_Long ratio; /* current ratio */ | |
| 274 FT_Fixed scale; | |
| 275 | |
| 276 FT_F26Dot6 compensations[4]; /* device-specific compensations */ | |
| 277 | |
| 278 FT_Bool valid; | |
| 279 | |
| 280 FT_Bool rotated; /* `is the glyph rotated?'-flag */ | |
| 281 FT_Bool stretched; /* `is the glyph stretched?'-flag */ | |
| 282 | |
| 283 } TT_Size_Metrics; | |
| 284 | |
| 285 | |
| 286 /*************************************************************************/ | |
| 287 /* */ | |
| 288 /* TrueType size class. */ | |
| 289 /* */ | |
| 290 typedef struct TT_SizeRec_ | |
| 291 { | |
| 292 FT_SizeRec root; | |
| 293 | |
| 294 /* we have our own copy of metrics so that we can modify */ | |
| 295 /* it without affecting auto-hinting (when used) */ | |
| 296 FT_Size_Metrics metrics; | |
| 297 | |
| 298 TT_Size_Metrics ttmetrics; | |
| 299 | |
| 300 FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ | |
| 301 | |
| 302 #ifdef TT_USE_BYTECODE_INTERPRETER | |
| 303 | |
| 304 FT_UInt num_function_defs; /* number of function definitions */ | |
| 305 FT_UInt max_function_defs; | |
| 306 TT_DefArray function_defs; /* table of function definitions */ | |
| 307 | |
| 308 FT_UInt num_instruction_defs; /* number of ins. definitions */ | |
| 309 FT_UInt max_instruction_defs; | |
| 310 TT_DefArray instruction_defs; /* table of ins. definitions */ | |
| 311 | |
| 312 FT_UInt max_func; | |
| 313 FT_UInt max_ins; | |
| 314 | |
| 315 TT_CodeRangeTable codeRangeTable; | |
| 316 | |
| 317 TT_GraphicsState GS; | |
| 318 | |
| 319 FT_ULong cvt_size; /* the scaled control value table */ | |
| 320 FT_Long* cvt; | |
| 321 | |
| 322 FT_UShort storage_size; /* The storage area is now part of */ | |
| 323 FT_Long* storage; /* the instance */ | |
| 324 | |
| 325 TT_GlyphZoneRec twilight; /* The instance's twilight zone */ | |
| 326 | |
| 327 /* debugging variables */ | |
| 328 | |
| 329 /* When using the debugger, we must keep the */ | |
| 330 /* execution context tied to the instance */ | |
| 331 /* object rather than asking it on demand. */ | |
| 332 | |
| 333 FT_Bool debug; | |
| 334 TT_ExecContext context; | |
| 335 | |
| 336 FT_Bool bytecode_ready; | |
| 337 FT_Bool cvt_ready; | |
| 338 | |
| 339 #endif /* TT_USE_BYTECODE_INTERPRETER */ | |
| 340 | |
| 341 } TT_SizeRec; | |
| 342 | |
| 343 | |
| 344 /*************************************************************************/ | |
| 345 /* */ | |
| 346 /* TrueType driver class. */ | |
| 347 /* */ | |
| 348 typedef struct TT_DriverRec_ | |
| 349 { | |
| 350 FT_DriverRec root; | |
| 351 | |
| 352 TT_ExecContext context; /* execution context */ | |
| 353 TT_GlyphZoneRec zone; /* glyph loader points zone */ | |
| 354 | |
| 355 FT_UInt interpreter_version; | |
| 356 | |
| 357 } TT_DriverRec; | |
| 358 | |
| 359 | |
| 360 /* Note: All of the functions below (except tt_size_reset()) are used */ | |
| 361 /* as function pointers in a FT_Driver_ClassRec. Therefore their */ | |
| 362 /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ | |
| 363 /* TT_Size, etc., so that the compiler can confirm that the types and */ | |
| 364 /* number of parameters are correct. In all cases the FT_xxx types are */ | |
| 365 /* cast to their TT_xxx counterparts inside the functions since FreeType */ | |
| 366 /* will always use the TT driver to create them. */ | |
| 367 | |
| 368 | |
| 369 /*************************************************************************/ | |
| 370 /* */ | |
| 371 /* Face functions */ | |
| 372 /* */ | |
| 373 FT_LOCAL( FT_Error ) | |
| 374 tt_face_init( FT_Stream stream, | |
| 375 FT_Face ttface, /* TT_Face */ | |
| 376 FT_Int face_index, | |
| 377 FT_Int num_params, | |
| 378 FT_Parameter* params ); | |
| 379 | |
| 380 FT_LOCAL( void ) | |
| 381 tt_face_done( FT_Face ttface ); /* TT_Face */ | |
| 382 | |
| 383 | |
| 384 /*************************************************************************/ | |
| 385 /* */ | |
| 386 /* Size functions */ | |
| 387 /* */ | |
| 388 FT_LOCAL( FT_Error ) | |
| 389 tt_size_init( FT_Size ttsize ); /* TT_Size */ | |
| 390 | |
| 391 FT_LOCAL( void ) | |
| 392 tt_size_done( FT_Size ttsize ); /* TT_Size */ | |
| 393 | |
| 394 #ifdef TT_USE_BYTECODE_INTERPRETER | |
| 395 | |
| 396 FT_LOCAL( FT_Error ) | |
| 397 tt_size_run_fpgm( TT_Size size, | |
| 398 FT_Bool pedantic ); | |
| 399 | |
| 400 FT_LOCAL( FT_Error ) | |
| 401 tt_size_run_prep( TT_Size size, | |
| 402 FT_Bool pedantic ); | |
| 403 | |
| 404 FT_LOCAL( FT_Error ) | |
| 405 tt_size_ready_bytecode( TT_Size size, | |
| 406 FT_Bool pedantic ); | |
| 407 | |
| 408 #endif /* TT_USE_BYTECODE_INTERPRETER */ | |
| 409 | |
| 410 FT_LOCAL( FT_Error ) | |
| 411 tt_size_reset( TT_Size size ); | |
| 412 | |
| 413 | |
| 414 /*************************************************************************/ | |
| 415 /* */ | |
| 416 /* Driver functions */ | |
| 417 /* */ | |
| 418 FT_LOCAL( FT_Error ) | |
| 419 tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ | |
| 420 | |
| 421 FT_LOCAL( void ) | |
| 422 tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ | |
| 423 | |
| 424 | |
| 425 /*************************************************************************/ | |
| 426 /* */ | |
| 427 /* Slot functions */ | |
| 428 /* */ | |
| 429 FT_LOCAL( FT_Error ) | |
| 430 tt_slot_init( FT_GlyphSlot slot ); | |
| 431 | |
| 432 | |
| 433 /* auxiliary */ | |
| 434 #define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) | |
| 435 | |
| 436 | |
| 437 FT_END_HEADER | |
| 438 | |
| 439 #endif /* __TTOBJS_H__ */ | |
| 440 | |
| 441 | |
| 442 /* END */ | |
| OLD | NEW |