| OLD | NEW |
| (Empty) |
| 1 /***************************************************************************/ | |
| 2 /* */ | |
| 3 /* ftobjs.h */ | |
| 4 /* */ | |
| 5 /* The FreeType private base classes (specification). */ | |
| 6 /* */ | |
| 7 /* Copyright 1996-2006, 2008, 2010, 2012-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 /*************************************************************************/ | |
| 20 /* */ | |
| 21 /* This file contains the definition of all internal FreeType classes. */ | |
| 22 /* */ | |
| 23 /*************************************************************************/ | |
| 24 | |
| 25 | |
| 26 #ifndef __FTOBJS_H__ | |
| 27 #define __FTOBJS_H__ | |
| 28 | |
| 29 #include <ft2build.h> | |
| 30 #include FT_RENDER_H | |
| 31 #include FT_SIZES_H | |
| 32 #include FT_LCD_FILTER_H | |
| 33 #include FT_INTERNAL_MEMORY_H | |
| 34 #include FT_INTERNAL_GLYPH_LOADER_H | |
| 35 #include FT_INTERNAL_DRIVER_H | |
| 36 #include FT_INTERNAL_AUTOHINT_H | |
| 37 #include FT_INTERNAL_SERVICE_H | |
| 38 #include FT_INTERNAL_PIC_H | |
| 39 | |
| 40 #ifdef FT_CONFIG_OPTION_INCREMENTAL | |
| 41 #include FT_INCREMENTAL_H | |
| 42 #endif | |
| 43 | |
| 44 | |
| 45 FT_BEGIN_HEADER | |
| 46 | |
| 47 | |
| 48 /*************************************************************************/ | |
| 49 /* */ | |
| 50 /* Some generic definitions. */ | |
| 51 /* */ | |
| 52 #ifndef TRUE | |
| 53 #define TRUE 1 | |
| 54 #endif | |
| 55 | |
| 56 #ifndef FALSE | |
| 57 #define FALSE 0 | |
| 58 #endif | |
| 59 | |
| 60 #ifndef NULL | |
| 61 #define NULL (void*)0 | |
| 62 #endif | |
| 63 | |
| 64 | |
| 65 /*************************************************************************/ | |
| 66 /* */ | |
| 67 /* The min and max functions missing in C. As usual, be careful not to */ | |
| 68 /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ | |
| 69 /* */ | |
| 70 #define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) | |
| 71 #define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) | |
| 72 | |
| 73 #define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) | |
| 74 | |
| 75 /* | |
| 76 * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' | |
| 77 * algorithm. We use alpha = 1, beta = 3/8, giving us results with a | |
| 78 * largest error less than 7% compared to the exact value. | |
| 79 */ | |
| 80 #define FT_HYPOT( x, y ) \ | |
| 81 ( x = FT_ABS( x ), \ | |
| 82 y = FT_ABS( y ), \ | |
| 83 x > y ? x + ( 3 * y >> 3 ) \ | |
| 84 : y + ( 3 * x >> 3 ) ) | |
| 85 | |
| 86 #define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) | |
| 87 #define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) | |
| 88 #define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) | |
| 89 | |
| 90 #define FT_PIX_FLOOR( x ) ( (x) & ~63 ) | |
| 91 #define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) | |
| 92 #define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) | |
| 93 | |
| 94 | |
| 95 /* | |
| 96 * character classification functions -- since these are used to parse | |
| 97 * font files, we must not use those in <ctypes.h> which are | |
| 98 * locale-dependent | |
| 99 */ | |
| 100 #define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) | |
| 101 | |
| 102 #define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ | |
| 103 ( (unsigned)(x) - 'a' ) < 6U || \ | |
| 104 ( (unsigned)(x) - 'A' ) < 6U ) | |
| 105 | |
| 106 /* the next two macros assume ASCII representation */ | |
| 107 #define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) | |
| 108 #define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) | |
| 109 | |
| 110 #define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) | |
| 111 #define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) | |
| 112 | |
| 113 | |
| 114 /*************************************************************************/ | |
| 115 /*************************************************************************/ | |
| 116 /*************************************************************************/ | |
| 117 /**** ****/ | |
| 118 /**** ****/ | |
| 119 /**** C H A R M A P S ****/ | |
| 120 /**** ****/ | |
| 121 /**** ****/ | |
| 122 /*************************************************************************/ | |
| 123 /*************************************************************************/ | |
| 124 /*************************************************************************/ | |
| 125 | |
| 126 /* handle to internal charmap object */ | |
| 127 typedef struct FT_CMapRec_* FT_CMap; | |
| 128 | |
| 129 /* handle to charmap class structure */ | |
| 130 typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; | |
| 131 | |
| 132 /* internal charmap object structure */ | |
| 133 typedef struct FT_CMapRec_ | |
| 134 { | |
| 135 FT_CharMapRec charmap; | |
| 136 FT_CMap_Class clazz; | |
| 137 | |
| 138 } FT_CMapRec; | |
| 139 | |
| 140 /* typecase any pointer to a charmap handle */ | |
| 141 #define FT_CMAP( x ) ((FT_CMap)( x )) | |
| 142 | |
| 143 /* obvious macros */ | |
| 144 #define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id | |
| 145 #define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id | |
| 146 #define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding | |
| 147 #define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face | |
| 148 | |
| 149 | |
| 150 /* class method definitions */ | |
| 151 typedef FT_Error | |
| 152 (*FT_CMap_InitFunc)( FT_CMap cmap, | |
| 153 FT_Pointer init_data ); | |
| 154 | |
| 155 typedef void | |
| 156 (*FT_CMap_DoneFunc)( FT_CMap cmap ); | |
| 157 | |
| 158 typedef FT_UInt | |
| 159 (*FT_CMap_CharIndexFunc)( FT_CMap cmap, | |
| 160 FT_UInt32 char_code ); | |
| 161 | |
| 162 typedef FT_UInt | |
| 163 (*FT_CMap_CharNextFunc)( FT_CMap cmap, | |
| 164 FT_UInt32 *achar_code ); | |
| 165 | |
| 166 typedef FT_UInt | |
| 167 (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, | |
| 168 FT_CMap unicode_cmap, | |
| 169 FT_UInt32 char_code, | |
| 170 FT_UInt32 variant_selector ); | |
| 171 | |
| 172 typedef FT_Bool | |
| 173 (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, | |
| 174 FT_UInt32 char_code, | |
| 175 FT_UInt32 variant_selector ); | |
| 176 | |
| 177 typedef FT_UInt32 * | |
| 178 (*FT_CMap_VariantListFunc)( FT_CMap cmap, | |
| 179 FT_Memory mem ); | |
| 180 | |
| 181 typedef FT_UInt32 * | |
| 182 (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, | |
| 183 FT_Memory mem, | |
| 184 FT_UInt32 char_code ); | |
| 185 | |
| 186 typedef FT_UInt32 * | |
| 187 (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, | |
| 188 FT_Memory mem, | |
| 189 FT_UInt32 variant_selector ); | |
| 190 | |
| 191 | |
| 192 typedef struct FT_CMap_ClassRec_ | |
| 193 { | |
| 194 FT_ULong size; | |
| 195 FT_CMap_InitFunc init; | |
| 196 FT_CMap_DoneFunc done; | |
| 197 FT_CMap_CharIndexFunc char_index; | |
| 198 FT_CMap_CharNextFunc char_next; | |
| 199 | |
| 200 /* Subsequent entries are special ones for format 14 -- the variant */ | |
| 201 /* selector subtable which behaves like no other */ | |
| 202 | |
| 203 FT_CMap_CharVarIndexFunc char_var_index; | |
| 204 FT_CMap_CharVarIsDefaultFunc char_var_default; | |
| 205 FT_CMap_VariantListFunc variant_list; | |
| 206 FT_CMap_CharVariantListFunc charvariant_list; | |
| 207 FT_CMap_VariantCharListFunc variantchar_list; | |
| 208 | |
| 209 } FT_CMap_ClassRec; | |
| 210 | |
| 211 | |
| 212 #ifndef FT_CONFIG_OPTION_PIC | |
| 213 | |
| 214 #define FT_DECLARE_CMAP_CLASS( class_ ) \ | |
| 215 FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; | |
| 216 | |
| 217 #define FT_DEFINE_CMAP_CLASS( \ | |
| 218 class_, \ | |
| 219 size_, \ | |
| 220 init_, \ | |
| 221 done_, \ | |
| 222 char_index_, \ | |
| 223 char_next_, \ | |
| 224 char_var_index_, \ | |
| 225 char_var_default_, \ | |
| 226 variant_list_, \ | |
| 227 charvariant_list_, \ | |
| 228 variantchar_list_ ) \ | |
| 229 FT_CALLBACK_TABLE_DEF \ | |
| 230 const FT_CMap_ClassRec class_ = \ | |
| 231 { \ | |
| 232 size_, \ | |
| 233 init_, \ | |
| 234 done_, \ | |
| 235 char_index_, \ | |
| 236 char_next_, \ | |
| 237 char_var_index_, \ | |
| 238 char_var_default_, \ | |
| 239 variant_list_, \ | |
| 240 charvariant_list_, \ | |
| 241 variantchar_list_ \ | |
| 242 }; | |
| 243 | |
| 244 #else /* FT_CONFIG_OPTION_PIC */ | |
| 245 | |
| 246 #define FT_DECLARE_CMAP_CLASS( class_ ) \ | |
| 247 void \ | |
| 248 FT_Init_Class_ ## class_( FT_Library library, \ | |
| 249 FT_CMap_ClassRec* clazz ); | |
| 250 | |
| 251 #define FT_DEFINE_CMAP_CLASS( \ | |
| 252 class_, \ | |
| 253 size_, \ | |
| 254 init_, \ | |
| 255 done_, \ | |
| 256 char_index_, \ | |
| 257 char_next_, \ | |
| 258 char_var_index_, \ | |
| 259 char_var_default_, \ | |
| 260 variant_list_, \ | |
| 261 charvariant_list_, \ | |
| 262 variantchar_list_ ) \ | |
| 263 void \ | |
| 264 FT_Init_Class_ ## class_( FT_Library library, \ | |
| 265 FT_CMap_ClassRec* clazz ) \ | |
| 266 { \ | |
| 267 FT_UNUSED( library ); \ | |
| 268 \ | |
| 269 clazz->size = size_; \ | |
| 270 clazz->init = init_; \ | |
| 271 clazz->done = done_; \ | |
| 272 clazz->char_index = char_index_; \ | |
| 273 clazz->char_next = char_next_; \ | |
| 274 clazz->char_var_index = char_var_index_; \ | |
| 275 clazz->char_var_default = char_var_default_; \ | |
| 276 clazz->variant_list = variant_list_; \ | |
| 277 clazz->charvariant_list = charvariant_list_; \ | |
| 278 clazz->variantchar_list = variantchar_list_; \ | |
| 279 } | |
| 280 | |
| 281 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 282 | |
| 283 | |
| 284 /* create a new charmap and add it to charmap->face */ | |
| 285 FT_BASE( FT_Error ) | |
| 286 FT_CMap_New( FT_CMap_Class clazz, | |
| 287 FT_Pointer init_data, | |
| 288 FT_CharMap charmap, | |
| 289 FT_CMap *acmap ); | |
| 290 | |
| 291 /* destroy a charmap and remove it from face's list */ | |
| 292 FT_BASE( void ) | |
| 293 FT_CMap_Done( FT_CMap cmap ); | |
| 294 | |
| 295 | |
| 296 /*************************************************************************/ | |
| 297 /* */ | |
| 298 /* <Struct> */ | |
| 299 /* FT_Face_InternalRec */ | |
| 300 /* */ | |
| 301 /* <Description> */ | |
| 302 /* This structure contains the internal fields of each FT_Face */ | |
| 303 /* object. These fields may change between different releases of */ | |
| 304 /* FreeType. */ | |
| 305 /* */ | |
| 306 /* <Fields> */ | |
| 307 /* max_points :: */ | |
| 308 /* The maximum number of points used to store the vectorial outline */ | |
| 309 /* of any glyph in this face. If this value cannot be known in */ | |
| 310 /* advance, or if the face isn't scalable, this should be set to 0. */ | |
| 311 /* Only relevant for scalable formats. */ | |
| 312 /* */ | |
| 313 /* max_contours :: */ | |
| 314 /* The maximum number of contours used to store the vectorial */ | |
| 315 /* outline of any glyph in this face. If this value cannot be */ | |
| 316 /* known in advance, or if the face isn't scalable, this should be */ | |
| 317 /* set to 0. Only relevant for scalable formats. */ | |
| 318 /* */ | |
| 319 /* transform_matrix :: */ | |
| 320 /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ | |
| 321 /* outlines after they are loaded from the font. Only used by the */ | |
| 322 /* convenience functions. */ | |
| 323 /* */ | |
| 324 /* transform_delta :: */ | |
| 325 /* A translation vector used to transform glyph outlines after they */ | |
| 326 /* are loaded from the font. Only used by the convenience */ | |
| 327 /* functions. */ | |
| 328 /* */ | |
| 329 /* transform_flags :: */ | |
| 330 /* Some flags used to classify the transform. Only used by the */ | |
| 331 /* convenience functions. */ | |
| 332 /* */ | |
| 333 /* services :: */ | |
| 334 /* A cache for frequently used services. It should be only */ | |
| 335 /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ | |
| 336 /* */ | |
| 337 /* incremental_interface :: */ | |
| 338 /* If non-null, the interface through which glyph data and metrics */ | |
| 339 /* are loaded incrementally for faces that do not provide all of */ | |
| 340 /* this data when first opened. This field exists only if */ | |
| 341 /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ | |
| 342 /* */ | |
| 343 /* ignore_unpatented_hinter :: */ | |
| 344 /* This boolean flag instructs the glyph loader to ignore the */ | |
| 345 /* native font hinter, if one is found. This is exclusively used */ | |
| 346 /* in the case when the unpatented hinter is compiled within the */ | |
| 347 /* library. */ | |
| 348 /* */ | |
| 349 /* refcount :: */ | |
| 350 /* A counter initialized to~1 at the time an @FT_Face structure is */ | |
| 351 /* created. @FT_Reference_Face increments this counter, and */ | |
| 352 /* @FT_Done_Face only destroys a face if the counter is~1, */ | |
| 353 /* otherwise it simply decrements it. */ | |
| 354 /* */ | |
| 355 typedef struct FT_Face_InternalRec_ | |
| 356 { | |
| 357 FT_Matrix transform_matrix; | |
| 358 FT_Vector transform_delta; | |
| 359 FT_Int transform_flags; | |
| 360 | |
| 361 FT_ServiceCacheRec services; | |
| 362 | |
| 363 #ifdef FT_CONFIG_OPTION_INCREMENTAL | |
| 364 FT_Incremental_InterfaceRec* incremental_interface; | |
| 365 #endif | |
| 366 | |
| 367 FT_Bool ignore_unpatented_hinter; | |
| 368 FT_Int refcount; | |
| 369 | |
| 370 } FT_Face_InternalRec; | |
| 371 | |
| 372 | |
| 373 /*************************************************************************/ | |
| 374 /* */ | |
| 375 /* <Struct> */ | |
| 376 /* FT_Slot_InternalRec */ | |
| 377 /* */ | |
| 378 /* <Description> */ | |
| 379 /* This structure contains the internal fields of each FT_GlyphSlot */ | |
| 380 /* object. These fields may change between different releases of */ | |
| 381 /* FreeType. */ | |
| 382 /* */ | |
| 383 /* <Fields> */ | |
| 384 /* loader :: The glyph loader object used to load outlines */ | |
| 385 /* into the glyph slot. */ | |
| 386 /* */ | |
| 387 /* flags :: Possible values are zero or */ | |
| 388 /* FT_GLYPH_OWN_BITMAP. The latter indicates */ | |
| 389 /* that the FT_GlyphSlot structure owns the */ | |
| 390 /* bitmap buffer. */ | |
| 391 /* */ | |
| 392 /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ | |
| 393 /* must be transformed through a specific */ | |
| 394 /* font transformation. This is _not_ the same */ | |
| 395 /* as the face transform set through */ | |
| 396 /* FT_Set_Transform(). */ | |
| 397 /* */ | |
| 398 /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ | |
| 399 /* transformation, if necessary. */ | |
| 400 /* */ | |
| 401 /* glyph_delta :: The 2d translation vector corresponding to */ | |
| 402 /* the glyph transformation, if necessary. */ | |
| 403 /* */ | |
| 404 /* glyph_hints :: Format-specific glyph hints management. */ | |
| 405 /* */ | |
| 406 | |
| 407 #define FT_GLYPH_OWN_BITMAP 0x1 | |
| 408 | |
| 409 typedef struct FT_Slot_InternalRec_ | |
| 410 { | |
| 411 FT_GlyphLoader loader; | |
| 412 FT_UInt flags; | |
| 413 FT_Bool glyph_transformed; | |
| 414 FT_Matrix glyph_matrix; | |
| 415 FT_Vector glyph_delta; | |
| 416 void* glyph_hints; | |
| 417 | |
| 418 } FT_GlyphSlot_InternalRec; | |
| 419 | |
| 420 | |
| 421 #if 0 | |
| 422 | |
| 423 /*************************************************************************/ | |
| 424 /* */ | |
| 425 /* <Struct> */ | |
| 426 /* FT_Size_InternalRec */ | |
| 427 /* */ | |
| 428 /* <Description> */ | |
| 429 /* This structure contains the internal fields of each FT_Size */ | |
| 430 /* object. Currently, it's empty. */ | |
| 431 /* */ | |
| 432 /*************************************************************************/ | |
| 433 | |
| 434 typedef struct FT_Size_InternalRec_ | |
| 435 { | |
| 436 /* empty */ | |
| 437 | |
| 438 } FT_Size_InternalRec; | |
| 439 | |
| 440 #endif | |
| 441 | |
| 442 | |
| 443 /*************************************************************************/ | |
| 444 /*************************************************************************/ | |
| 445 /*************************************************************************/ | |
| 446 /**** ****/ | |
| 447 /**** ****/ | |
| 448 /**** M O D U L E S ****/ | |
| 449 /**** ****/ | |
| 450 /**** ****/ | |
| 451 /*************************************************************************/ | |
| 452 /*************************************************************************/ | |
| 453 /*************************************************************************/ | |
| 454 | |
| 455 | |
| 456 /*************************************************************************/ | |
| 457 /* */ | |
| 458 /* <Struct> */ | |
| 459 /* FT_ModuleRec */ | |
| 460 /* */ | |
| 461 /* <Description> */ | |
| 462 /* A module object instance. */ | |
| 463 /* */ | |
| 464 /* <Fields> */ | |
| 465 /* clazz :: A pointer to the module's class. */ | |
| 466 /* */ | |
| 467 /* library :: A handle to the parent library object. */ | |
| 468 /* */ | |
| 469 /* memory :: A handle to the memory manager. */ | |
| 470 /* */ | |
| 471 typedef struct FT_ModuleRec_ | |
| 472 { | |
| 473 FT_Module_Class* clazz; | |
| 474 FT_Library library; | |
| 475 FT_Memory memory; | |
| 476 | |
| 477 } FT_ModuleRec; | |
| 478 | |
| 479 | |
| 480 /* typecast an object to an FT_Module */ | |
| 481 #define FT_MODULE( x ) ((FT_Module)( x )) | |
| 482 #define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz | |
| 483 #define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library | |
| 484 #define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory | |
| 485 | |
| 486 | |
| 487 #define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 488 FT_MODULE_FONT_DRIVER ) | |
| 489 | |
| 490 #define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 491 FT_MODULE_RENDERER ) | |
| 492 | |
| 493 #define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 494 FT_MODULE_HINTER ) | |
| 495 | |
| 496 #define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 497 FT_MODULE_STYLER ) | |
| 498 | |
| 499 #define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 500 FT_MODULE_DRIVER_SCALABLE ) | |
| 501 | |
| 502 #define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ | |
| 503 FT_MODULE_DRIVER_NO_OUTLINES ) | |
| 504 | |
| 505 #define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ | |
| 506 FT_MODULE_DRIVER_HAS_HINTER ) | |
| 507 | |
| 508 | |
| 509 /*************************************************************************/ | |
| 510 /* */ | |
| 511 /* <Function> */ | |
| 512 /* FT_Get_Module_Interface */ | |
| 513 /* */ | |
| 514 /* <Description> */ | |
| 515 /* Finds a module and returns its specific interface as a typeless */ | |
| 516 /* pointer. */ | |
| 517 /* */ | |
| 518 /* <Input> */ | |
| 519 /* library :: A handle to the library object. */ | |
| 520 /* */ | |
| 521 /* module_name :: The module's name (as an ASCII string). */ | |
| 522 /* */ | |
| 523 /* <Return> */ | |
| 524 /* A module-specific interface if available, 0 otherwise. */ | |
| 525 /* */ | |
| 526 /* <Note> */ | |
| 527 /* You should better be familiar with FreeType internals to know */ | |
| 528 /* which module to look for, and what its interface is :-) */ | |
| 529 /* */ | |
| 530 FT_BASE( const void* ) | |
| 531 FT_Get_Module_Interface( FT_Library library, | |
| 532 const char* mod_name ); | |
| 533 | |
| 534 FT_BASE( FT_Pointer ) | |
| 535 ft_module_get_service( FT_Module module, | |
| 536 const char* service_id ); | |
| 537 | |
| 538 /* */ | |
| 539 | |
| 540 | |
| 541 /*************************************************************************/ | |
| 542 /*************************************************************************/ | |
| 543 /*************************************************************************/ | |
| 544 /**** ****/ | |
| 545 /**** ****/ | |
| 546 /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/ | |
| 547 /**** ****/ | |
| 548 /**** ****/ | |
| 549 /*************************************************************************/ | |
| 550 /*************************************************************************/ | |
| 551 /*************************************************************************/ | |
| 552 | |
| 553 /* a few macros used to perform easy typecasts with minimal brain damage */ | |
| 554 | |
| 555 #define FT_FACE( x ) ((FT_Face)(x)) | |
| 556 #define FT_SIZE( x ) ((FT_Size)(x)) | |
| 557 #define FT_SLOT( x ) ((FT_GlyphSlot)(x)) | |
| 558 | |
| 559 #define FT_FACE_DRIVER( x ) FT_FACE( x )->driver | |
| 560 #define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library | |
| 561 #define FT_FACE_MEMORY( x ) FT_FACE( x )->memory | |
| 562 #define FT_FACE_STREAM( x ) FT_FACE( x )->stream | |
| 563 | |
| 564 #define FT_SIZE_FACE( x ) FT_SIZE( x )->face | |
| 565 #define FT_SLOT_FACE( x ) FT_SLOT( x )->face | |
| 566 | |
| 567 #define FT_FACE_SLOT( x ) FT_FACE( x )->glyph | |
| 568 #define FT_FACE_SIZE( x ) FT_FACE( x )->size | |
| 569 | |
| 570 | |
| 571 /*************************************************************************/ | |
| 572 /* */ | |
| 573 /* <Function> */ | |
| 574 /* FT_New_GlyphSlot */ | |
| 575 /* */ | |
| 576 /* <Description> */ | |
| 577 /* It is sometimes useful to have more than one glyph slot for a */ | |
| 578 /* given face object. This function is used to create additional */ | |
| 579 /* slots. All of them are automatically discarded when the face is */ | |
| 580 /* destroyed. */ | |
| 581 /* */ | |
| 582 /* <Input> */ | |
| 583 /* face :: A handle to a parent face object. */ | |
| 584 /* */ | |
| 585 /* <Output> */ | |
| 586 /* aslot :: A handle to a new glyph slot object. */ | |
| 587 /* */ | |
| 588 /* <Return> */ | |
| 589 /* FreeType error code. 0 means success. */ | |
| 590 /* */ | |
| 591 FT_BASE( FT_Error ) | |
| 592 FT_New_GlyphSlot( FT_Face face, | |
| 593 FT_GlyphSlot *aslot ); | |
| 594 | |
| 595 | |
| 596 /*************************************************************************/ | |
| 597 /* */ | |
| 598 /* <Function> */ | |
| 599 /* FT_Done_GlyphSlot */ | |
| 600 /* */ | |
| 601 /* <Description> */ | |
| 602 /* Destroys a given glyph slot. Remember however that all slots are */ | |
| 603 /* automatically destroyed with its parent. Using this function is */ | |
| 604 /* not always mandatory. */ | |
| 605 /* */ | |
| 606 /* <Input> */ | |
| 607 /* slot :: A handle to a target glyph slot. */ | |
| 608 /* */ | |
| 609 FT_BASE( void ) | |
| 610 FT_Done_GlyphSlot( FT_GlyphSlot slot ); | |
| 611 | |
| 612 /* */ | |
| 613 | |
| 614 #define FT_REQUEST_WIDTH( req ) \ | |
| 615 ( (req)->horiResolution \ | |
| 616 ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ | |
| 617 : (req)->width ) | |
| 618 | |
| 619 #define FT_REQUEST_HEIGHT( req ) \ | |
| 620 ( (req)->vertResolution \ | |
| 621 ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ | |
| 622 : (req)->height ) | |
| 623 | |
| 624 | |
| 625 /* Set the metrics according to a bitmap strike. */ | |
| 626 FT_BASE( void ) | |
| 627 FT_Select_Metrics( FT_Face face, | |
| 628 FT_ULong strike_index ); | |
| 629 | |
| 630 | |
| 631 /* Set the metrics according to a size request. */ | |
| 632 FT_BASE( void ) | |
| 633 FT_Request_Metrics( FT_Face face, | |
| 634 FT_Size_Request req ); | |
| 635 | |
| 636 | |
| 637 /* Match a size request against `available_sizes'. */ | |
| 638 FT_BASE( FT_Error ) | |
| 639 FT_Match_Size( FT_Face face, | |
| 640 FT_Size_Request req, | |
| 641 FT_Bool ignore_width, | |
| 642 FT_ULong* size_index ); | |
| 643 | |
| 644 | |
| 645 /* Use the horizontal metrics to synthesize the vertical metrics. */ | |
| 646 /* If `advance' is zero, it is also synthesized. */ | |
| 647 FT_BASE( void ) | |
| 648 ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, | |
| 649 FT_Pos advance ); | |
| 650 | |
| 651 | |
| 652 /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ | |
| 653 /* was allocated with ft_glyphslot_alloc_bitmap). */ | |
| 654 FT_BASE( void ) | |
| 655 ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); | |
| 656 | |
| 657 | |
| 658 /* Allocate a new bitmap buffer in a glyph slot. */ | |
| 659 FT_BASE( FT_Error ) | |
| 660 ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, | |
| 661 FT_ULong size ); | |
| 662 | |
| 663 | |
| 664 /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ | |
| 665 /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ | |
| 666 FT_BASE( void ) | |
| 667 ft_glyphslot_set_bitmap( FT_GlyphSlot slot, | |
| 668 FT_Byte* buffer ); | |
| 669 | |
| 670 | |
| 671 /*************************************************************************/ | |
| 672 /*************************************************************************/ | |
| 673 /*************************************************************************/ | |
| 674 /**** ****/ | |
| 675 /**** ****/ | |
| 676 /**** R E N D E R E R S ****/ | |
| 677 /**** ****/ | |
| 678 /**** ****/ | |
| 679 /*************************************************************************/ | |
| 680 /*************************************************************************/ | |
| 681 /*************************************************************************/ | |
| 682 | |
| 683 | |
| 684 #define FT_RENDERER( x ) ((FT_Renderer)( x )) | |
| 685 #define FT_GLYPH( x ) ((FT_Glyph)( x )) | |
| 686 #define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) | |
| 687 #define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) | |
| 688 | |
| 689 | |
| 690 typedef struct FT_RendererRec_ | |
| 691 { | |
| 692 FT_ModuleRec root; | |
| 693 FT_Renderer_Class* clazz; | |
| 694 FT_Glyph_Format glyph_format; | |
| 695 FT_Glyph_Class glyph_class; | |
| 696 | |
| 697 FT_Raster raster; | |
| 698 FT_Raster_Render_Func raster_render; | |
| 699 FT_Renderer_RenderFunc render; | |
| 700 | |
| 701 } FT_RendererRec; | |
| 702 | |
| 703 | |
| 704 /*************************************************************************/ | |
| 705 /*************************************************************************/ | |
| 706 /*************************************************************************/ | |
| 707 /**** ****/ | |
| 708 /**** ****/ | |
| 709 /**** F O N T D R I V E R S ****/ | |
| 710 /**** ****/ | |
| 711 /**** ****/ | |
| 712 /*************************************************************************/ | |
| 713 /*************************************************************************/ | |
| 714 /*************************************************************************/ | |
| 715 | |
| 716 | |
| 717 /* typecast a module into a driver easily */ | |
| 718 #define FT_DRIVER( x ) ((FT_Driver)(x)) | |
| 719 | |
| 720 /* typecast a module as a driver, and get its driver class */ | |
| 721 #define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz | |
| 722 | |
| 723 | |
| 724 /*************************************************************************/ | |
| 725 /* */ | |
| 726 /* <Struct> */ | |
| 727 /* FT_DriverRec */ | |
| 728 /* */ | |
| 729 /* <Description> */ | |
| 730 /* The root font driver class. A font driver is responsible for */ | |
| 731 /* managing and loading font files of a given format. */ | |
| 732 /* */ | |
| 733 /* <Fields> */ | |
| 734 /* root :: Contains the fields of the root module class. */ | |
| 735 /* */ | |
| 736 /* clazz :: A pointer to the font driver's class. Note that */ | |
| 737 /* this is NOT root.clazz. `class' wasn't used */ | |
| 738 /* as it is a reserved word in C++. */ | |
| 739 /* */ | |
| 740 /* faces_list :: The list of faces currently opened by this */ | |
| 741 /* driver. */ | |
| 742 /* */ | |
| 743 /* glyph_loader :: The glyph loader for all faces managed by this */ | |
| 744 /* driver. This object isn't defined for unscalable */ | |
| 745 /* formats. */ | |
| 746 /* */ | |
| 747 typedef struct FT_DriverRec_ | |
| 748 { | |
| 749 FT_ModuleRec root; | |
| 750 FT_Driver_Class clazz; | |
| 751 FT_ListRec faces_list; | |
| 752 FT_GlyphLoader glyph_loader; | |
| 753 | |
| 754 } FT_DriverRec; | |
| 755 | |
| 756 | |
| 757 /*************************************************************************/ | |
| 758 /*************************************************************************/ | |
| 759 /*************************************************************************/ | |
| 760 /**** ****/ | |
| 761 /**** ****/ | |
| 762 /**** L I B R A R I E S ****/ | |
| 763 /**** ****/ | |
| 764 /**** ****/ | |
| 765 /*************************************************************************/ | |
| 766 /*************************************************************************/ | |
| 767 /*************************************************************************/ | |
| 768 | |
| 769 | |
| 770 /* This hook is used by the TrueType debugger. It must be set to an */ | |
| 771 /* alternate truetype bytecode interpreter function. */ | |
| 772 #define FT_DEBUG_HOOK_TRUETYPE 0 | |
| 773 | |
| 774 | |
| 775 /* Set this debug hook to a non-null pointer to force unpatented hinting */ | |
| 776 /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ | |
| 777 /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ | |
| 778 /* during debugging. */ | |
| 779 #define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 | |
| 780 | |
| 781 | |
| 782 typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, | |
| 783 FT_Render_Mode render_mode, | |
| 784 FT_Library library ); | |
| 785 | |
| 786 | |
| 787 /*************************************************************************/ | |
| 788 /* */ | |
| 789 /* <Struct> */ | |
| 790 /* FT_LibraryRec */ | |
| 791 /* */ | |
| 792 /* <Description> */ | |
| 793 /* The FreeType library class. This is the root of all FreeType */ | |
| 794 /* data. Use FT_New_Library() to create a library object, and */ | |
| 795 /* FT_Done_Library() to discard it and all child objects. */ | |
| 796 /* */ | |
| 797 /* <Fields> */ | |
| 798 /* memory :: The library's memory object. Manages memory */ | |
| 799 /* allocation. */ | |
| 800 /* */ | |
| 801 /* version_major :: The major version number of the library. */ | |
| 802 /* */ | |
| 803 /* version_minor :: The minor version number of the library. */ | |
| 804 /* */ | |
| 805 /* version_patch :: The current patch level of the library. */ | |
| 806 /* */ | |
| 807 /* num_modules :: The number of modules currently registered */ | |
| 808 /* within this library. This is set to 0 for new */ | |
| 809 /* libraries. New modules are added through the */ | |
| 810 /* FT_Add_Module() API function. */ | |
| 811 /* */ | |
| 812 /* modules :: A table used to store handles to the currently */ | |
| 813 /* registered modules. Note that each font driver */ | |
| 814 /* contains a list of its opened faces. */ | |
| 815 /* */ | |
| 816 /* renderers :: The list of renderers currently registered */ | |
| 817 /* within the library. */ | |
| 818 /* */ | |
| 819 /* cur_renderer :: The current outline renderer. This is a */ | |
| 820 /* shortcut used to avoid parsing the list on */ | |
| 821 /* each call to FT_Outline_Render(). It is a */ | |
| 822 /* handle to the current renderer for the */ | |
| 823 /* FT_GLYPH_FORMAT_OUTLINE format. */ | |
| 824 /* */ | |
| 825 /* auto_hinter :: XXX */ | |
| 826 /* */ | |
| 827 /* raster_pool :: The raster object's render pool. This can */ | |
| 828 /* ideally be changed dynamically at run-time. */ | |
| 829 /* */ | |
| 830 /* raster_pool_size :: The size of the render pool in bytes. */ | |
| 831 /* */ | |
| 832 /* debug_hooks :: XXX */ | |
| 833 /* */ | |
| 834 /* lcd_filter :: If subpixel rendering is activated, the */ | |
| 835 /* selected LCD filter mode. */ | |
| 836 /* */ | |
| 837 /* lcd_extra :: If subpixel rendering is activated, the number */ | |
| 838 /* of extra pixels needed for the LCD filter. */ | |
| 839 /* */ | |
| 840 /* lcd_weights :: If subpixel rendering is activated, the LCD */ | |
| 841 /* filter weights, if any. */ | |
| 842 /* */ | |
| 843 /* lcd_filter_func :: If subpixel rendering is activated, the LCD */ | |
| 844 /* filtering callback function. */ | |
| 845 /* */ | |
| 846 /* pic_container :: Contains global structs and tables, instead */ | |
| 847 /* of defining them globallly. */ | |
| 848 /* */ | |
| 849 /* refcount :: A counter initialized to~1 at the time an */ | |
| 850 /* @FT_Library structure is created. */ | |
| 851 /* @FT_Reference_Library increments this counter, */ | |
| 852 /* and @FT_Done_Library only destroys a library */ | |
| 853 /* if the counter is~1, otherwise it simply */ | |
| 854 /* decrements it. */ | |
| 855 /* */ | |
| 856 typedef struct FT_LibraryRec_ | |
| 857 { | |
| 858 FT_Memory memory; /* library's memory manager */ | |
| 859 | |
| 860 FT_Int version_major; | |
| 861 FT_Int version_minor; | |
| 862 FT_Int version_patch; | |
| 863 | |
| 864 FT_UInt num_modules; | |
| 865 FT_Module modules[FT_MAX_MODULES]; /* module objects */ | |
| 866 | |
| 867 FT_ListRec renderers; /* list of renderers */ | |
| 868 FT_Renderer cur_renderer; /* current outline renderer */ | |
| 869 FT_Module auto_hinter; | |
| 870 | |
| 871 FT_Byte* raster_pool; /* scan-line conversion */ | |
| 872 /* render pool */ | |
| 873 FT_ULong raster_pool_size; /* size of render pool in bytes */ | |
| 874 | |
| 875 FT_DebugHook_Func debug_hooks[4]; | |
| 876 | |
| 877 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING | |
| 878 FT_LcdFilter lcd_filter; | |
| 879 FT_Int lcd_extra; /* number of extra pixels */ | |
| 880 FT_Byte lcd_weights[7]; /* filter weights, if any */ | |
| 881 FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ | |
| 882 #endif | |
| 883 | |
| 884 #ifdef FT_CONFIG_OPTION_PIC | |
| 885 FT_PIC_Container pic_container; | |
| 886 #endif | |
| 887 | |
| 888 FT_Int refcount; | |
| 889 | |
| 890 } FT_LibraryRec; | |
| 891 | |
| 892 | |
| 893 FT_BASE( FT_Renderer ) | |
| 894 FT_Lookup_Renderer( FT_Library library, | |
| 895 FT_Glyph_Format format, | |
| 896 FT_ListNode* node ); | |
| 897 | |
| 898 FT_BASE( FT_Error ) | |
| 899 FT_Render_Glyph_Internal( FT_Library library, | |
| 900 FT_GlyphSlot slot, | |
| 901 FT_Render_Mode render_mode ); | |
| 902 | |
| 903 typedef const char* | |
| 904 (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); | |
| 905 | |
| 906 typedef FT_Error | |
| 907 (*FT_Face_GetGlyphNameFunc)( FT_Face face, | |
| 908 FT_UInt glyph_index, | |
| 909 FT_Pointer buffer, | |
| 910 FT_UInt buffer_max ); | |
| 911 | |
| 912 typedef FT_UInt | |
| 913 (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, | |
| 914 FT_String* glyph_name ); | |
| 915 | |
| 916 | |
| 917 #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM | |
| 918 | |
| 919 /*************************************************************************/ | |
| 920 /* */ | |
| 921 /* <Function> */ | |
| 922 /* FT_New_Memory */ | |
| 923 /* */ | |
| 924 /* <Description> */ | |
| 925 /* Creates a new memory object. */ | |
| 926 /* */ | |
| 927 /* <Return> */ | |
| 928 /* A pointer to the new memory object. 0 in case of error. */ | |
| 929 /* */ | |
| 930 FT_BASE( FT_Memory ) | |
| 931 FT_New_Memory( void ); | |
| 932 | |
| 933 | |
| 934 /*************************************************************************/ | |
| 935 /* */ | |
| 936 /* <Function> */ | |
| 937 /* FT_Done_Memory */ | |
| 938 /* */ | |
| 939 /* <Description> */ | |
| 940 /* Discards memory manager. */ | |
| 941 /* */ | |
| 942 /* <Input> */ | |
| 943 /* memory :: A handle to the memory manager. */ | |
| 944 /* */ | |
| 945 FT_BASE( void ) | |
| 946 FT_Done_Memory( FT_Memory memory ); | |
| 947 | |
| 948 #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ | |
| 949 | |
| 950 | |
| 951 /* Define default raster's interface. The default raster is located in */ | |
| 952 /* `src/base/ftraster.c'. */ | |
| 953 /* */ | |
| 954 /* Client applications can register new rasters through the */ | |
| 955 /* FT_Set_Raster() API. */ | |
| 956 | |
| 957 #ifndef FT_NO_DEFAULT_RASTER | |
| 958 FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; | |
| 959 #endif | |
| 960 | |
| 961 | |
| 962 /*************************************************************************/ | |
| 963 /*************************************************************************/ | |
| 964 /*************************************************************************/ | |
| 965 /**** ****/ | |
| 966 /**** ****/ | |
| 967 /**** P I C S U P P O R T ****/ | |
| 968 /**** ****/ | |
| 969 /**** ****/ | |
| 970 /*************************************************************************/ | |
| 971 /*************************************************************************/ | |
| 972 /*************************************************************************/ | |
| 973 | |
| 974 | |
| 975 /* PIC support macros for ftimage.h */ | |
| 976 | |
| 977 | |
| 978 /*************************************************************************/ | |
| 979 /* */ | |
| 980 /* <Macro> */ | |
| 981 /* FT_DEFINE_OUTLINE_FUNCS */ | |
| 982 /* */ | |
| 983 /* <Description> */ | |
| 984 /* Used to initialize an instance of FT_Outline_Funcs struct. */ | |
| 985 /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ | |
| 986 /* be called with a pre-allocated structure to be filled. */ | |
| 987 /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ | |
| 988 /* allocated in the global scope (or the scope where the macro */ | |
| 989 /* is used). */ | |
| 990 /* */ | |
| 991 #ifndef FT_CONFIG_OPTION_PIC | |
| 992 | |
| 993 #define FT_DEFINE_OUTLINE_FUNCS( \ | |
| 994 class_, \ | |
| 995 move_to_, \ | |
| 996 line_to_, \ | |
| 997 conic_to_, \ | |
| 998 cubic_to_, \ | |
| 999 shift_, \ | |
| 1000 delta_ ) \ | |
| 1001 static const FT_Outline_Funcs class_ = \ | |
| 1002 { \ | |
| 1003 move_to_, \ | |
| 1004 line_to_, \ | |
| 1005 conic_to_, \ | |
| 1006 cubic_to_, \ | |
| 1007 shift_, \ | |
| 1008 delta_ \ | |
| 1009 }; | |
| 1010 | |
| 1011 #else /* FT_CONFIG_OPTION_PIC */ | |
| 1012 | |
| 1013 #define FT_DEFINE_OUTLINE_FUNCS( \ | |
| 1014 class_, \ | |
| 1015 move_to_, \ | |
| 1016 line_to_, \ | |
| 1017 conic_to_, \ | |
| 1018 cubic_to_, \ | |
| 1019 shift_, \ | |
| 1020 delta_ ) \ | |
| 1021 static FT_Error \ | |
| 1022 Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \ | |
| 1023 { \ | |
| 1024 clazz->move_to = move_to_; \ | |
| 1025 clazz->line_to = line_to_; \ | |
| 1026 clazz->conic_to = conic_to_; \ | |
| 1027 clazz->cubic_to = cubic_to_; \ | |
| 1028 clazz->shift = shift_; \ | |
| 1029 clazz->delta = delta_; \ | |
| 1030 \ | |
| 1031 return FT_Err_Ok; \ | |
| 1032 } | |
| 1033 | |
| 1034 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 1035 | |
| 1036 | |
| 1037 /*************************************************************************/ | |
| 1038 /* */ | |
| 1039 /* <Macro> */ | |
| 1040 /* FT_DEFINE_RASTER_FUNCS */ | |
| 1041 /* */ | |
| 1042 /* <Description> */ | |
| 1043 /* Used to initialize an instance of FT_Raster_Funcs struct. */ | |
| 1044 /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ | |
| 1045 /* be called with a pre-allocated structure to be filled. */ | |
| 1046 /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ | |
| 1047 /* allocated in the global scope (or the scope where the macro */ | |
| 1048 /* is used). */ | |
| 1049 /* */ | |
| 1050 #ifndef FT_CONFIG_OPTION_PIC | |
| 1051 | |
| 1052 #define FT_DEFINE_RASTER_FUNCS( \ | |
| 1053 class_, \ | |
| 1054 glyph_format_, \ | |
| 1055 raster_new_, \ | |
| 1056 raster_reset_, \ | |
| 1057 raster_set_mode_, \ | |
| 1058 raster_render_, \ | |
| 1059 raster_done_ ) \ | |
| 1060 const FT_Raster_Funcs class_ = \ | |
| 1061 { \ | |
| 1062 glyph_format_, \ | |
| 1063 raster_new_, \ | |
| 1064 raster_reset_, \ | |
| 1065 raster_set_mode_, \ | |
| 1066 raster_render_, \ | |
| 1067 raster_done_ \ | |
| 1068 }; | |
| 1069 | |
| 1070 #else /* FT_CONFIG_OPTION_PIC */ | |
| 1071 | |
| 1072 #define FT_DEFINE_RASTER_FUNCS( \ | |
| 1073 class_, \ | |
| 1074 glyph_format_, \ | |
| 1075 raster_new_, \ | |
| 1076 raster_reset_, \ | |
| 1077 raster_set_mode_, \ | |
| 1078 raster_render_, \ | |
| 1079 raster_done_ ) \ | |
| 1080 void \ | |
| 1081 FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \ | |
| 1082 { \ | |
| 1083 clazz->glyph_format = glyph_format_; \ | |
| 1084 clazz->raster_new = raster_new_; \ | |
| 1085 clazz->raster_reset = raster_reset_; \ | |
| 1086 clazz->raster_set_mode = raster_set_mode_; \ | |
| 1087 clazz->raster_render = raster_render_; \ | |
| 1088 clazz->raster_done = raster_done_; \ | |
| 1089 } | |
| 1090 | |
| 1091 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 1092 | |
| 1093 | |
| 1094 /* PIC support macros for ftrender.h */ | |
| 1095 | |
| 1096 | |
| 1097 /*************************************************************************/ | |
| 1098 /* */ | |
| 1099 /* <Macro> */ | |
| 1100 /* FT_DEFINE_GLYPH */ | |
| 1101 /* */ | |
| 1102 /* <Description> */ | |
| 1103 /* Used to initialize an instance of FT_Glyph_Class struct. */ | |
| 1104 /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ | |
| 1105 /* be called with a pre-allocated stcture to be filled. */ | |
| 1106 /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ | |
| 1107 /* allocated in the global scope (or the scope where the macro */ | |
| 1108 /* is used). */ | |
| 1109 /* */ | |
| 1110 #ifndef FT_CONFIG_OPTION_PIC | |
| 1111 | |
| 1112 #define FT_DEFINE_GLYPH( \ | |
| 1113 class_, \ | |
| 1114 size_, \ | |
| 1115 format_, \ | |
| 1116 init_, \ | |
| 1117 done_, \ | |
| 1118 copy_, \ | |
| 1119 transform_, \ | |
| 1120 bbox_, \ | |
| 1121 prepare_ ) \ | |
| 1122 FT_CALLBACK_TABLE_DEF \ | |
| 1123 const FT_Glyph_Class class_ = \ | |
| 1124 { \ | |
| 1125 size_, \ | |
| 1126 format_, \ | |
| 1127 init_, \ | |
| 1128 done_, \ | |
| 1129 copy_, \ | |
| 1130 transform_, \ | |
| 1131 bbox_, \ | |
| 1132 prepare_ \ | |
| 1133 }; | |
| 1134 | |
| 1135 #else /* FT_CONFIG_OPTION_PIC */ | |
| 1136 | |
| 1137 #define FT_DEFINE_GLYPH( \ | |
| 1138 class_, \ | |
| 1139 size_, \ | |
| 1140 format_, \ | |
| 1141 init_, \ | |
| 1142 done_, \ | |
| 1143 copy_, \ | |
| 1144 transform_, \ | |
| 1145 bbox_, \ | |
| 1146 prepare_ ) \ | |
| 1147 void \ | |
| 1148 FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \ | |
| 1149 { \ | |
| 1150 clazz->glyph_size = size_; \ | |
| 1151 clazz->glyph_format = format_; \ | |
| 1152 clazz->glyph_init = init_; \ | |
| 1153 clazz->glyph_done = done_; \ | |
| 1154 clazz->glyph_copy = copy_; \ | |
| 1155 clazz->glyph_transform = transform_; \ | |
| 1156 clazz->glyph_bbox = bbox_; \ | |
| 1157 clazz->glyph_prepare = prepare_; \ | |
| 1158 } | |
| 1159 | |
| 1160 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 1161 | |
| 1162 | |
| 1163 /*************************************************************************/ | |
| 1164 /* */ | |
| 1165 /* <Macro> */ | |
| 1166 /* FT_DECLARE_RENDERER */ | |
| 1167 /* */ | |
| 1168 /* <Description> */ | |
| 1169 /* Used to create a forward declaration of a */ | |
| 1170 /* FT_Renderer_Class struct instance. */ | |
| 1171 /* */ | |
| 1172 /* <Macro> */ | |
| 1173 /* FT_DEFINE_RENDERER */ | |
| 1174 /* */ | |
| 1175 /* <Description> */ | |
| 1176 /* Used to initialize an instance of FT_Renderer_Class struct. */ | |
| 1177 /* */ | |
| 1178 /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need */ | |
| 1179 /* to be called with a pointer where the allocated structure is */ | |
| 1180 /* returned. And when it is no longer needed a `destroy' function */ | |
| 1181 /* needs to be called to release that allocation. */ | |
| 1182 /* `fcinit.c' (ft_create_default_module_classes) already contains */ | |
| 1183 /* a mechanism to call these functions for the default modules */ | |
| 1184 /* described in `ftmodule.h'. */ | |
| 1185 /* */ | |
| 1186 /* Notice that the created `create' and `destroy' functions call */ | |
| 1187 /* `pic_init' and `pic_free' to allow you to manually allocate and */ | |
| 1188 /* initialize any additional global data, like a module specific */ | |
| 1189 /* interface, and put them in the global pic container defined in */ | |
| 1190 /* `ftpic.h'. If you don't need them just implement the functions as */ | |
| 1191 /* empty to resolve the link error. Also the `pic_init' and */ | |
| 1192 /* `pic_free' functions should be declared in `pic.h', to be referred */ | |
| 1193 /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */ | |
| 1194 /* following. */ | |
| 1195 /* */ | |
| 1196 /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ | |
| 1197 /* allocated in the global scope (or the scope where the macro */ | |
| 1198 /* is used). */ | |
| 1199 /* */ | |
| 1200 #ifndef FT_CONFIG_OPTION_PIC | |
| 1201 | |
| 1202 #define FT_DECLARE_RENDERER( class_ ) \ | |
| 1203 FT_EXPORT_VAR( const FT_Renderer_Class ) class_; | |
| 1204 | |
| 1205 #define FT_DEFINE_RENDERER( \ | |
| 1206 class_, \ | |
| 1207 flags_, \ | |
| 1208 size_, \ | |
| 1209 name_, \ | |
| 1210 version_, \ | |
| 1211 requires_, \ | |
| 1212 interface_, \ | |
| 1213 init_, \ | |
| 1214 done_, \ | |
| 1215 get_interface_, \ | |
| 1216 glyph_format_, \ | |
| 1217 render_glyph_, \ | |
| 1218 transform_glyph_, \ | |
| 1219 get_glyph_cbox_, \ | |
| 1220 set_mode_, \ | |
| 1221 raster_class_ ) \ | |
| 1222 FT_CALLBACK_TABLE_DEF \ | |
| 1223 const FT_Renderer_Class class_ = \ | |
| 1224 { \ | |
| 1225 FT_DEFINE_ROOT_MODULE( flags_, \ | |
| 1226 size_, \ | |
| 1227 name_, \ | |
| 1228 version_, \ | |
| 1229 requires_, \ | |
| 1230 interface_, \ | |
| 1231 init_, \ | |
| 1232 done_, \ | |
| 1233 get_interface_ ) \ | |
| 1234 glyph_format_, \ | |
| 1235 \ | |
| 1236 render_glyph_, \ | |
| 1237 transform_glyph_, \ | |
| 1238 get_glyph_cbox_, \ | |
| 1239 set_mode_, \ | |
| 1240 \ | |
| 1241 raster_class_ \ | |
| 1242 }; | |
| 1243 | |
| 1244 #else /* FT_CONFIG_OPTION_PIC */ | |
| 1245 | |
| 1246 #define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ ) | |
| 1247 | |
| 1248 #define FT_DEFINE_RENDERER( \ | |
| 1249 class_, \ | |
| 1250 flags_, \ | |
| 1251 size_, \ | |
| 1252 name_, \ | |
| 1253 version_, \ | |
| 1254 requires_, \ | |
| 1255 interface_, \ | |
| 1256 init_, \ | |
| 1257 done_, \ | |
| 1258 get_interface_, \ | |
| 1259 glyph_format_, \ | |
| 1260 render_glyph_, \ | |
| 1261 transform_glyph_, \ | |
| 1262 get_glyph_cbox_, \ | |
| 1263 set_mode_, \ | |
| 1264 raster_class_ ) \ | |
| 1265 void \ | |
| 1266 FT_Destroy_Class_ ## class_( FT_Library library, \ | |
| 1267 FT_Module_Class* clazz ) \ | |
| 1268 { \ | |
| 1269 FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ | |
| 1270 FT_Memory memory = library->memory; \ | |
| 1271 \ | |
| 1272 \ | |
| 1273 class_ ## _pic_free( library ); \ | |
| 1274 if ( rclazz ) \ | |
| 1275 FT_FREE( rclazz ); \ | |
| 1276 } \ | |
| 1277 \ | |
| 1278 \ | |
| 1279 FT_Error \ | |
| 1280 FT_Create_Class_ ## class_( FT_Library library, \ | |
| 1281 FT_Module_Class** output_class ) \ | |
| 1282 { \ | |
| 1283 FT_Renderer_Class* clazz = NULL; \ | |
| 1284 FT_Error error; \ | |
| 1285 FT_Memory memory = library->memory; \ | |
| 1286 \ | |
| 1287 \ | |
| 1288 if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ | |
| 1289 return error; \ | |
| 1290 \ | |
| 1291 error = class_ ## _pic_init( library ); \ | |
| 1292 if ( error ) \ | |
| 1293 { \ | |
| 1294 FT_FREE( clazz ); \ | |
| 1295 return error; \ | |
| 1296 } \ | |
| 1297 \ | |
| 1298 FT_DEFINE_ROOT_MODULE( flags_, \ | |
| 1299 size_, \ | |
| 1300 name_, \ | |
| 1301 version_, \ | |
| 1302 requires_, \ | |
| 1303 interface_, \ | |
| 1304 init_, \ | |
| 1305 done_, \ | |
| 1306 get_interface_ ) \ | |
| 1307 \ | |
| 1308 clazz->glyph_format = glyph_format_; \ | |
| 1309 \ | |
| 1310 clazz->render_glyph = render_glyph_; \ | |
| 1311 clazz->transform_glyph = transform_glyph_; \ | |
| 1312 clazz->get_glyph_cbox = get_glyph_cbox_; \ | |
| 1313 clazz->set_mode = set_mode_; \ | |
| 1314 \ | |
| 1315 clazz->raster_class = raster_class_; \ | |
| 1316 \ | |
| 1317 *output_class = (FT_Module_Class*)clazz; \ | |
| 1318 \ | |
| 1319 return FT_Err_Ok; \ | |
| 1320 } | |
| 1321 | |
| 1322 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 1323 | |
| 1324 | |
| 1325 /* PIC support macros for ftmodapi.h **/ | |
| 1326 | |
| 1327 | |
| 1328 #ifdef FT_CONFIG_OPTION_PIC | |
| 1329 | |
| 1330 /*************************************************************************/ | |
| 1331 /* */ | |
| 1332 /* <FuncType> */ | |
| 1333 /* FT_Module_Creator */ | |
| 1334 /* */ | |
| 1335 /* <Description> */ | |
| 1336 /* A function used to create (allocate) a new module class object. */ | |
| 1337 /* The object's members are initialized, but the module itself is */ | |
| 1338 /* not. */ | |
| 1339 /* */ | |
| 1340 /* <Input> */ | |
| 1341 /* memory :: A handle to the memory manager. */ | |
| 1342 /* output_class :: Initialized with the newly allocated class. */ | |
| 1343 /* */ | |
| 1344 typedef FT_Error | |
| 1345 (*FT_Module_Creator)( FT_Memory memory, | |
| 1346 FT_Module_Class** output_class ); | |
| 1347 | |
| 1348 /*************************************************************************/ | |
| 1349 /* */ | |
| 1350 /* <FuncType> */ | |
| 1351 /* FT_Module_Destroyer */ | |
| 1352 /* */ | |
| 1353 /* <Description> */ | |
| 1354 /* A function used to destroy (deallocate) a module class object. */ | |
| 1355 /* */ | |
| 1356 /* <Input> */ | |
| 1357 /* memory :: A handle to the memory manager. */ | |
| 1358 /* clazz :: Module class to destroy. */ | |
| 1359 /* */ | |
| 1360 typedef void | |
| 1361 (*FT_Module_Destroyer)( FT_Memory memory, | |
| 1362 FT_Module_Class* clazz ); | |
| 1363 | |
| 1364 #endif | |
| 1365 | |
| 1366 | |
| 1367 /*************************************************************************/ | |
| 1368 /* */ | |
| 1369 /* <Macro> */ | |
| 1370 /* FT_DECLARE_MODULE */ | |
| 1371 /* */ | |
| 1372 /* <Description> */ | |
| 1373 /* Used to create a forward declaration of a */ | |
| 1374 /* FT_Module_Class struct instance. */ | |
| 1375 /* */ | |
| 1376 /* <Macro> */ | |
| 1377 /* FT_DEFINE_MODULE */ | |
| 1378 /* */ | |
| 1379 /* <Description> */ | |
| 1380 /* Used to initialize an instance of an FT_Module_Class struct. */ | |
| 1381 /* */ | |
| 1382 /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to */ | |
| 1383 /* be called with a pointer where the allocated structure is */ | |
| 1384 /* returned. And when it is no longer needed a `destroy' function */ | |
| 1385 /* needs to be called to release that allocation. */ | |
| 1386 /* `fcinit.c' (ft_create_default_module_classes) already contains */ | |
| 1387 /* a mechanism to call these functions for the default modules */ | |
| 1388 /* described in `ftmodule.h'. */ | |
| 1389 /* */ | |
| 1390 /* Notice that the created `create' and `destroy' functions call */ | |
| 1391 /* `pic_init' and `pic_free' to allow you to manually allocate and */ | |
| 1392 /* initialize any additional global data, like a module specific */ | |
| 1393 /* interface, and put them in the global pic container defined in */ | |
| 1394 /* `ftpic.h'. If you don't need them just implement the functions as */ | |
| 1395 /* empty to resolve the link error. Also the `pic_init' and */ | |
| 1396 /* `pic_free' functions should be declared in `pic.h', to be referred */ | |
| 1397 /* by the module definition calling `FT_DEFINE_MODULE' in the */ | |
| 1398 /* following. */ | |
| 1399 /* */ | |
| 1400 /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ | |
| 1401 /* allocated in the global scope (or the scope where the macro */ | |
| 1402 /* is used). */ | |
| 1403 /* */ | |
| 1404 /* <Macro> */ | |
| 1405 /* FT_DEFINE_ROOT_MODULE */ | |
| 1406 /* */ | |
| 1407 /* <Description> */ | |
| 1408 /* Used to initialize an instance of an FT_Module_Class struct inside */ | |
| 1409 /* another struct that contains it or in a function that initializes */ | |
| 1410 /* that containing struct. */ | |
| 1411 /* */ | |
| 1412 #ifndef FT_CONFIG_OPTION_PIC | |
| 1413 | |
| 1414 #define FT_DECLARE_MODULE( class_ ) \ | |
| 1415 FT_CALLBACK_TABLE \ | |
| 1416 const FT_Module_Class class_; | |
| 1417 | |
| 1418 #define FT_DEFINE_ROOT_MODULE( \ | |
| 1419 flags_, \ | |
| 1420 size_, \ | |
| 1421 name_, \ | |
| 1422 version_, \ | |
| 1423 requires_, \ | |
| 1424 interface_, \ | |
| 1425 init_, \ | |
| 1426 done_, \ | |
| 1427 get_interface_ ) \ | |
| 1428 { \ | |
| 1429 flags_, \ | |
| 1430 size_, \ | |
| 1431 \ | |
| 1432 name_, \ | |
| 1433 version_, \ | |
| 1434 requires_, \ | |
| 1435 \ | |
| 1436 interface_, \ | |
| 1437 \ | |
| 1438 init_, \ | |
| 1439 done_, \ | |
| 1440 get_interface_, \ | |
| 1441 }, | |
| 1442 | |
| 1443 #define FT_DEFINE_MODULE( \ | |
| 1444 class_, \ | |
| 1445 flags_, \ | |
| 1446 size_, \ | |
| 1447 name_, \ | |
| 1448 version_, \ | |
| 1449 requires_, \ | |
| 1450 interface_, \ | |
| 1451 init_, \ | |
| 1452 done_, \ | |
| 1453 get_interface_ ) \ | |
| 1454 FT_CALLBACK_TABLE_DEF \ | |
| 1455 const FT_Module_Class class_ = \ | |
| 1456 { \ | |
| 1457 flags_, \ | |
| 1458 size_, \ | |
| 1459 \ | |
| 1460 name_, \ | |
| 1461 version_, \ | |
| 1462 requires_, \ | |
| 1463 \ | |
| 1464 interface_, \ | |
| 1465 \ | |
| 1466 init_, \ | |
| 1467 done_, \ | |
| 1468 get_interface_, \ | |
| 1469 }; | |
| 1470 | |
| 1471 | |
| 1472 #else /* FT_CONFIG_OPTION_PIC */ | |
| 1473 | |
| 1474 #define FT_DECLARE_MODULE( class_ ) \ | |
| 1475 FT_Error \ | |
| 1476 FT_Create_Class_ ## class_( FT_Library library, \ | |
| 1477 FT_Module_Class** output_class ); \ | |
| 1478 void \ | |
| 1479 FT_Destroy_Class_ ## class_( FT_Library library, \ | |
| 1480 FT_Module_Class* clazz ); | |
| 1481 | |
| 1482 #define FT_DEFINE_ROOT_MODULE( \ | |
| 1483 flags_, \ | |
| 1484 size_, \ | |
| 1485 name_, \ | |
| 1486 version_, \ | |
| 1487 requires_, \ | |
| 1488 interface_, \ | |
| 1489 init_, \ | |
| 1490 done_, \ | |
| 1491 get_interface_ ) \ | |
| 1492 clazz->root.module_flags = flags_; \ | |
| 1493 clazz->root.module_size = size_; \ | |
| 1494 clazz->root.module_name = name_; \ | |
| 1495 clazz->root.module_version = version_; \ | |
| 1496 clazz->root.module_requires = requires_; \ | |
| 1497 \ | |
| 1498 clazz->root.module_interface = interface_; \ | |
| 1499 \ | |
| 1500 clazz->root.module_init = init_; \ | |
| 1501 clazz->root.module_done = done_; \ | |
| 1502 clazz->root.get_interface = get_interface_; | |
| 1503 | |
| 1504 #define FT_DEFINE_MODULE( \ | |
| 1505 class_, \ | |
| 1506 flags_, \ | |
| 1507 size_, \ | |
| 1508 name_, \ | |
| 1509 version_, \ | |
| 1510 requires_, \ | |
| 1511 interface_, \ | |
| 1512 init_, \ | |
| 1513 done_, \ | |
| 1514 get_interface_ ) \ | |
| 1515 void \ | |
| 1516 FT_Destroy_Class_ ## class_( FT_Library library, \ | |
| 1517 FT_Module_Class* clazz ) \ | |
| 1518 { \ | |
| 1519 FT_Memory memory = library->memory; \ | |
| 1520 \ | |
| 1521 \ | |
| 1522 class_ ## _pic_free( library ); \ | |
| 1523 if ( clazz ) \ | |
| 1524 FT_FREE( clazz ); \ | |
| 1525 } \ | |
| 1526 \ | |
| 1527 \ | |
| 1528 FT_Error \ | |
| 1529 FT_Create_Class_ ## class_( FT_Library library, \ | |
| 1530 FT_Module_Class** output_class ) \ | |
| 1531 { \ | |
| 1532 FT_Memory memory = library->memory; \ | |
| 1533 FT_Module_Class* clazz = NULL; \ | |
| 1534 FT_Error error; \ | |
| 1535 \ | |
| 1536 \ | |
| 1537 if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ | |
| 1538 return error; \ | |
| 1539 error = class_ ## _pic_init( library ); \ | |
| 1540 if ( error ) \ | |
| 1541 { \ | |
| 1542 FT_FREE( clazz ); \ | |
| 1543 return error; \ | |
| 1544 } \ | |
| 1545 \ | |
| 1546 clazz->module_flags = flags_; \ | |
| 1547 clazz->module_size = size_; \ | |
| 1548 clazz->module_name = name_; \ | |
| 1549 clazz->module_version = version_; \ | |
| 1550 clazz->module_requires = requires_; \ | |
| 1551 \ | |
| 1552 clazz->module_interface = interface_; \ | |
| 1553 \ | |
| 1554 clazz->module_init = init_; \ | |
| 1555 clazz->module_done = done_; \ | |
| 1556 clazz->get_interface = get_interface_; \ | |
| 1557 \ | |
| 1558 *output_class = clazz; \ | |
| 1559 \ | |
| 1560 return FT_Err_Ok; \ | |
| 1561 } | |
| 1562 | |
| 1563 #endif /* FT_CONFIG_OPTION_PIC */ | |
| 1564 | |
| 1565 | |
| 1566 FT_END_HEADER | |
| 1567 | |
| 1568 #endif /* __FTOBJS_H__ */ | |
| 1569 | |
| 1570 | |
| 1571 /* END */ | |
| OLD | NEW |