1 /**************************************************************************** 2 * 3 * ftobjs.h 4 * 5 * The FreeType private base classes (specification). 6 * 7 * Copyright (C) 1996-2020 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 <freetype/ftrender.h> 30 #include <freetype/ftsizes.h> 31 #include <freetype/ftlcdfil.h> 32 #include <freetype/internal/ftmemory.h> 33 #include <freetype/internal/ftgloadr.h> 34 #include <freetype/internal/ftdrv.h> 35 #include <freetype/internal/autohint.h> 36 #include <freetype/internal/ftserv.h> 37 #include <freetype/internal/ftcalc.h> 38 39 #ifdef FT_CONFIG_OPTION_INCREMENTAL 40 #include <freetype/ftincrem.h> 41 #endif 42 43 #include "compiler-macros.h" 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' algorithm. 77 * We use alpha = 1, beta = 3/8, giving us results with a largest error 78 * 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 /* we use FT_TYPEOF to suppress signedness compilation warnings */ 87 #define FT_PAD_FLOOR( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) ) 88 #define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + (n) / 2, n ) 89 #define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + (n) - 1, n ) 90 91 #define FT_PIX_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) 92 #define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) 93 #define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) 94 95 /* specialized versions (for signed values) */ 96 /* that don't produce run-time errors due to integer overflow */ 97 #define FT_PAD_ROUND_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \ 98 n ) 99 #define FT_PAD_CEIL_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \ 100 n ) 101 #define FT_PIX_ROUND_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 32 ) ) 102 #define FT_PIX_CEIL_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 63 ) ) 103 104 #define FT_PAD_ROUND_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \ 105 n ) 106 #define FT_PAD_CEIL_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \ 107 n ) 108 #define FT_PIX_ROUND_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 32 ) ) 109 #define FT_PIX_CEIL_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 63 ) ) 110 111 112 /* 113 * character classification functions -- since these are used to parse font 114 * files, we must not use those in <ctypes.h> which are locale-dependent 115 */ 116 #define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) 117 118 #define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ 119 ( (unsigned)(x) - 'a' ) < 6U || \ 120 ( (unsigned)(x) - 'A' ) < 6U ) 121 122 /* the next two macros assume ASCII representation */ 123 #define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) 124 #define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) 125 126 #define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) 127 #define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) 128 129 130 /*************************************************************************/ 131 /*************************************************************************/ 132 /*************************************************************************/ 133 /**** ****/ 134 /**** ****/ 135 /**** C H A R M A P S ****/ 136 /**** ****/ 137 /**** ****/ 138 /*************************************************************************/ 139 /*************************************************************************/ 140 /*************************************************************************/ 141 142 /* handle to internal charmap object */ 143 typedef struct FT_CMapRec_* FT_CMap; 144 145 /* handle to charmap class structure */ 146 typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; 147 148 /* internal charmap object structure */ 149 typedef struct FT_CMapRec_ 150 { 151 FT_CharMapRec charmap; 152 FT_CMap_Class clazz; 153 154 } FT_CMapRec; 155 156 /* typecast any pointer to a charmap handle */ 157 #define FT_CMAP( x ) ( (FT_CMap)( x ) ) 158 159 /* obvious macros */ 160 #define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id 161 #define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id 162 #define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding 163 #define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face 164 165 166 /* class method definitions */ 167 typedef FT_Error 168 (*FT_CMap_InitFunc)( FT_CMap cmap, 169 FT_Pointer init_data ); 170 171 typedef void 172 (*FT_CMap_DoneFunc)( FT_CMap cmap ); 173 174 typedef FT_UInt 175 (*FT_CMap_CharIndexFunc)( FT_CMap cmap, 176 FT_UInt32 char_code ); 177 178 typedef FT_UInt 179 (*FT_CMap_CharNextFunc)( FT_CMap cmap, 180 FT_UInt32 *achar_code ); 181 182 typedef FT_UInt 183 (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, 184 FT_CMap unicode_cmap, 185 FT_UInt32 char_code, 186 FT_UInt32 variant_selector ); 187 188 typedef FT_Int 189 (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, 190 FT_UInt32 char_code, 191 FT_UInt32 variant_selector ); 192 193 typedef FT_UInt32 * 194 (*FT_CMap_VariantListFunc)( FT_CMap cmap, 195 FT_Memory mem ); 196 197 typedef FT_UInt32 * 198 (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, 199 FT_Memory mem, 200 FT_UInt32 char_code ); 201 202 typedef FT_UInt32 * 203 (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, 204 FT_Memory mem, 205 FT_UInt32 variant_selector ); 206 207 208 typedef struct FT_CMap_ClassRec_ 209 { 210 FT_ULong size; 211 212 FT_CMap_InitFunc init; 213 FT_CMap_DoneFunc done; 214 FT_CMap_CharIndexFunc char_index; 215 FT_CMap_CharNextFunc char_next; 216 217 /* Subsequent entries are special ones for format 14 -- the variant */ 218 /* selector subtable which behaves like no other */ 219 220 FT_CMap_CharVarIndexFunc char_var_index; 221 FT_CMap_CharVarIsDefaultFunc char_var_default; 222 FT_CMap_VariantListFunc variant_list; 223 FT_CMap_CharVariantListFunc charvariant_list; 224 FT_CMap_VariantCharListFunc variantchar_list; 225 226 } FT_CMap_ClassRec; 227 228 229 #define FT_DECLARE_CMAP_CLASS( class_ ) \ 230 FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; 231 232 #define FT_DEFINE_CMAP_CLASS( \ 233 class_, \ 234 size_, \ 235 init_, \ 236 done_, \ 237 char_index_, \ 238 char_next_, \ 239 char_var_index_, \ 240 char_var_default_, \ 241 variant_list_, \ 242 charvariant_list_, \ 243 variantchar_list_ ) \ 244 FT_CALLBACK_TABLE_DEF \ 245 const FT_CMap_ClassRec class_ = \ 246 { \ 247 size_, \ 248 init_, \ 249 done_, \ 250 char_index_, \ 251 char_next_, \ 252 char_var_index_, \ 253 char_var_default_, \ 254 variant_list_, \ 255 charvariant_list_, \ 256 variantchar_list_ \ 257 }; 258 259 260 /* create a new charmap and add it to charmap->face */ 261 FT_BASE( FT_Error ) 262 FT_CMap_New( FT_CMap_Class clazz, 263 FT_Pointer init_data, 264 FT_CharMap charmap, 265 FT_CMap *acmap ); 266 267 /* destroy a charmap and remove it from face's list */ 268 FT_BASE( void ) 269 FT_CMap_Done( FT_CMap cmap ); 270 271 272 /* add LCD padding to CBox */ 273 FT_BASE( void ) 274 ft_lcd_padding( FT_BBox* cbox, 275 FT_GlyphSlot slot, 276 FT_Render_Mode mode ); 277 278 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING 279 280 typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, 281 FT_Byte* weights ); 282 283 284 /* This is the default LCD filter, an in-place, 5-tap FIR filter. */ 285 FT_BASE( void ) 286 ft_lcd_filter_fir( FT_Bitmap* bitmap, 287 FT_LcdFiveTapFilter weights ); 288 289 #endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ 290 291 /************************************************************************** 292 * 293 * @struct: 294 * FT_Face_InternalRec 295 * 296 * @description: 297 * This structure contains the internal fields of each FT_Face object. 298 * These fields may change between different releases of FreeType. 299 * 300 * @fields: 301 * max_points :: 302 * The maximum number of points used to store the vectorial outline of 303 * any glyph in this face. If this value cannot be known in advance, 304 * or if the face isn't scalable, this should be set to 0. Only 305 * relevant for scalable formats. 306 * 307 * max_contours :: 308 * The maximum number of contours 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 * transform_matrix :: 314 * A 2x2 matrix of 16.16 coefficients used to transform glyph outlines 315 * after they are loaded from the font. Only used by the convenience 316 * functions. 317 * 318 * transform_delta :: 319 * A translation vector used to transform glyph outlines after they are 320 * loaded from the font. Only used by the convenience functions. 321 * 322 * transform_flags :: 323 * Some flags used to classify the transform. Only used by the 324 * convenience functions. 325 * 326 * services :: 327 * A cache for frequently used services. It should be only accessed 328 * with the macro `FT_FACE_LOOKUP_SERVICE`. 329 * 330 * incremental_interface :: 331 * If non-null, the interface through which glyph data and metrics are 332 * loaded incrementally for faces that do not provide all of this data 333 * when first opened. This field exists only if 334 * @FT_CONFIG_OPTION_INCREMENTAL is defined. 335 * 336 * no_stem_darkening :: 337 * Overrides the module-level default, see @stem-darkening[cff], for 338 * example. FALSE and TRUE toggle stem darkening on and off, 339 * respectively, value~-1 means to use the module/driver default. 340 * 341 * random_seed :: 342 * If positive, override the seed value for the CFF 'random' operator. 343 * Value~0 means to use the font's value. Value~-1 means to use the 344 * CFF driver's default. 345 * 346 * lcd_weights :: 347 * lcd_filter_func :: 348 * These fields specify the LCD filtering weights and callback function 349 * for ClearType-style subpixel rendering. 350 * 351 * refcount :: 352 * A counter initialized to~1 at the time an @FT_Face structure is 353 * created. @FT_Reference_Face increments this counter, and 354 * @FT_Done_Face only destroys a face if the counter is~1, otherwise it 355 * simply decrements it. 356 */ 357 typedef struct FT_Face_InternalRec_ 358 { 359 FT_Matrix transform_matrix; 360 FT_Vector transform_delta; 361 FT_Int transform_flags; 362 363 FT_ServiceCacheRec services; 364 365 #ifdef FT_CONFIG_OPTION_INCREMENTAL 366 FT_Incremental_InterfaceRec* incremental_interface; 367 #endif 368 369 FT_Char no_stem_darkening; 370 FT_Int32 random_seed; 371 372 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING 373 FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ 374 FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ 375 #endif 376 377 FT_Int refcount; 378 379 } FT_Face_InternalRec; 380 381 382 /************************************************************************** 383 * 384 * @struct: 385 * FT_Slot_InternalRec 386 * 387 * @description: 388 * This structure contains the internal fields of each FT_GlyphSlot 389 * object. These fields may change between different releases of 390 * FreeType. 391 * 392 * @fields: 393 * loader :: 394 * The glyph loader object used to load outlines into the glyph slot. 395 * 396 * flags :: 397 * Possible values are zero or FT_GLYPH_OWN_BITMAP. The latter 398 * indicates that the FT_GlyphSlot structure owns the bitmap buffer. 399 * 400 * glyph_transformed :: 401 * Boolean. Set to TRUE when the loaded glyph must be transformed 402 * through a specific font transformation. This is _not_ the same as 403 * the face transform set through FT_Set_Transform(). 404 * 405 * glyph_matrix :: 406 * The 2x2 matrix corresponding to the glyph transformation, if 407 * necessary. 408 * 409 * glyph_delta :: 410 * The 2d translation vector corresponding to the glyph transformation, 411 * if necessary. 412 * 413 * glyph_hints :: 414 * Format-specific glyph hints management. 415 * 416 * load_flags :: 417 * The load flags passed as an argument to @FT_Load_Glyph while 418 * initializing the glyph slot. 419 */ 420 421 #define FT_GLYPH_OWN_BITMAP 0x1U 422 423 typedef struct FT_Slot_InternalRec_ 424 { 425 FT_GlyphLoader loader; 426 FT_UInt flags; 427 FT_Bool glyph_transformed; 428 FT_Matrix glyph_matrix; 429 FT_Vector glyph_delta; 430 void* glyph_hints; 431 432 FT_Int32 load_flags; 433 434 } FT_GlyphSlot_InternalRec; 435 436 437 /************************************************************************** 438 * 439 * @struct: 440 * FT_Size_InternalRec 441 * 442 * @description: 443 * This structure contains the internal fields of each FT_Size object. 444 * 445 * @fields: 446 * module_data :: 447 * Data specific to a driver module. 448 * 449 * autohint_mode :: 450 * The used auto-hinting mode. 451 * 452 * autohint_metrics :: 453 * Metrics used by the auto-hinter. 454 * 455 */ 456 457 typedef struct FT_Size_InternalRec_ 458 { 459 void* module_data; 460 461 FT_Render_Mode autohint_mode; 462 FT_Size_Metrics autohint_metrics; 463 464 } FT_Size_InternalRec; 465 466 467 /*************************************************************************/ 468 /*************************************************************************/ 469 /*************************************************************************/ 470 /**** ****/ 471 /**** ****/ 472 /**** M O D U L E S ****/ 473 /**** ****/ 474 /**** ****/ 475 /*************************************************************************/ 476 /*************************************************************************/ 477 /*************************************************************************/ 478 479 480 /************************************************************************** 481 * 482 * @struct: 483 * FT_ModuleRec 484 * 485 * @description: 486 * A module object instance. 487 * 488 * @fields: 489 * clazz :: 490 * A pointer to the module's class. 491 * 492 * library :: 493 * A handle to the parent library object. 494 * 495 * memory :: 496 * A handle to the memory manager. 497 */ 498 typedef struct FT_ModuleRec_ 499 { 500 FT_Module_Class* clazz; 501 FT_Library library; 502 FT_Memory memory; 503 504 } FT_ModuleRec; 505 506 507 /* typecast an object to an FT_Module */ 508 #define FT_MODULE( x ) ( (FT_Module)(x) ) 509 510 #define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz 511 #define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library 512 #define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory 513 514 515 #define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 516 FT_MODULE_FONT_DRIVER ) 517 518 #define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 519 FT_MODULE_RENDERER ) 520 521 #define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 522 FT_MODULE_HINTER ) 523 524 #define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 525 FT_MODULE_STYLER ) 526 527 #define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 528 FT_MODULE_DRIVER_SCALABLE ) 529 530 #define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ 531 FT_MODULE_DRIVER_NO_OUTLINES ) 532 533 #define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 534 FT_MODULE_DRIVER_HAS_HINTER ) 535 536 #define FT_DRIVER_HINTS_LIGHTLY( x ) ( FT_MODULE_CLASS( x )->module_flags & \ 537 FT_MODULE_DRIVER_HINTS_LIGHTLY ) 538 539 540 /************************************************************************** 541 * 542 * @function: 543 * FT_Get_Module_Interface 544 * 545 * @description: 546 * Finds a module and returns its specific interface as a typeless 547 * pointer. 548 * 549 * @input: 550 * library :: 551 * A handle to the library object. 552 * 553 * module_name :: 554 * The module's name (as an ASCII string). 555 * 556 * @return: 557 * A module-specific interface if available, 0 otherwise. 558 * 559 * @note: 560 * You should better be familiar with FreeType internals to know which 561 * module to look for, and what its interface is :-) 562 */ 563 FT_BASE( const void* ) 564 FT_Get_Module_Interface( FT_Library library, 565 const char* mod_name ); 566 567 FT_BASE( FT_Pointer ) 568 ft_module_get_service( FT_Module module, 569 const char* service_id, 570 FT_Bool global ); 571 572 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES 573 FT_BASE( FT_Error ) 574 ft_property_string_set( FT_Library library, 575 const FT_String* module_name, 576 const FT_String* property_name, 577 FT_String* value ); 578 #endif 579 580 /* */ 581 582 583 /*************************************************************************/ 584 /*************************************************************************/ 585 /*************************************************************************/ 586 /**** ****/ 587 /**** ****/ 588 /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/ 589 /**** ****/ 590 /**** ****/ 591 /*************************************************************************/ 592 /*************************************************************************/ 593 /*************************************************************************/ 594 595 /* a few macros used to perform easy typecasts with minimal brain damage */ 596 597 #define FT_FACE( x ) ( (FT_Face)(x) ) 598 #define FT_SIZE( x ) ( (FT_Size)(x) ) 599 #define FT_SLOT( x ) ( (FT_GlyphSlot)(x) ) 600 601 #define FT_FACE_DRIVER( x ) FT_FACE( x )->driver 602 #define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library 603 #define FT_FACE_MEMORY( x ) FT_FACE( x )->memory 604 #define FT_FACE_STREAM( x ) FT_FACE( x )->stream 605 606 #define FT_SIZE_FACE( x ) FT_SIZE( x )->face 607 #define FT_SLOT_FACE( x ) FT_SLOT( x )->face 608 609 #define FT_FACE_SLOT( x ) FT_FACE( x )->glyph 610 #define FT_FACE_SIZE( x ) FT_FACE( x )->size 611 612 613 /************************************************************************** 614 * 615 * @function: 616 * FT_New_GlyphSlot 617 * 618 * @description: 619 * It is sometimes useful to have more than one glyph slot for a given 620 * face object. This function is used to create additional slots. All 621 * of them are automatically discarded when the face is destroyed. 622 * 623 * @input: 624 * face :: 625 * A handle to a parent face object. 626 * 627 * @output: 628 * aslot :: 629 * A handle to a new glyph slot object. 630 * 631 * @return: 632 * FreeType error code. 0 means success. 633 */ 634 FT_BASE( FT_Error ) 635 FT_New_GlyphSlot( FT_Face face, 636 FT_GlyphSlot *aslot ); 637 638 639 /************************************************************************** 640 * 641 * @function: 642 * FT_Done_GlyphSlot 643 * 644 * @description: 645 * Destroys a given glyph slot. Remember however that all slots are 646 * automatically destroyed with its parent. Using this function is not 647 * always mandatory. 648 * 649 * @input: 650 * slot :: 651 * A handle to a target glyph slot. 652 */ 653 FT_BASE( void ) 654 FT_Done_GlyphSlot( FT_GlyphSlot slot ); 655 656 /* */ 657 658 #define FT_REQUEST_WIDTH( req ) \ 659 ( (req)->horiResolution \ 660 ? ( (req)->width * (FT_Pos)(req)->horiResolution + 36 ) / 72 \ 661 : (req)->width ) 662 663 #define FT_REQUEST_HEIGHT( req ) \ 664 ( (req)->vertResolution \ 665 ? ( (req)->height * (FT_Pos)(req)->vertResolution + 36 ) / 72 \ 666 : (req)->height ) 667 668 669 /* Set the metrics according to a bitmap strike. */ 670 FT_BASE( void ) 671 FT_Select_Metrics( FT_Face face, 672 FT_ULong strike_index ); 673 674 675 /* Set the metrics according to a size request. */ 676 FT_BASE( void ) 677 FT_Request_Metrics( FT_Face face, 678 FT_Size_Request req ); 679 680 681 /* Match a size request against `available_sizes'. */ 682 FT_BASE( FT_Error ) 683 FT_Match_Size( FT_Face face, 684 FT_Size_Request req, 685 FT_Bool ignore_width, 686 FT_ULong* size_index ); 687 688 689 /* Use the horizontal metrics to synthesize the vertical metrics. */ 690 /* If `advance' is zero, it is also synthesized. */ 691 FT_BASE( void ) 692 ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, 693 FT_Pos advance ); 694 695 696 /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ 697 /* was allocated with ft_glyphslot_alloc_bitmap). */ 698 FT_BASE( void ) 699 ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); 700 701 702 /* Preset bitmap metrics of an outline glyphslot prior to rendering */ 703 /* and check whether the truncated bbox is too large for rendering. */ 704 FT_BASE( FT_Bool ) 705 ft_glyphslot_preset_bitmap( FT_GlyphSlot slot, 706 FT_Render_Mode mode, 707 const FT_Vector* origin ); 708 709 /* Allocate a new bitmap buffer in a glyph slot. */ 710 FT_BASE( FT_Error ) 711 ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, 712 FT_ULong size ); 713 714 715 /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ 716 /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ 717 FT_BASE( void ) 718 ft_glyphslot_set_bitmap( FT_GlyphSlot slot, 719 FT_Byte* buffer ); 720 721 722 /*************************************************************************/ 723 /*************************************************************************/ 724 /*************************************************************************/ 725 /**** ****/ 726 /**** ****/ 727 /**** R E N D E R E R S ****/ 728 /**** ****/ 729 /**** ****/ 730 /*************************************************************************/ 731 /*************************************************************************/ 732 /*************************************************************************/ 733 734 735 #define FT_RENDERER( x ) ( (FT_Renderer)(x) ) 736 #define FT_GLYPH( x ) ( (FT_Glyph)(x) ) 737 #define FT_BITMAP_GLYPH( x ) ( (FT_BitmapGlyph)(x) ) 738 #define FT_OUTLINE_GLYPH( x ) ( (FT_OutlineGlyph)(x) ) 739 740 741 typedef struct FT_RendererRec_ 742 { 743 FT_ModuleRec root; 744 FT_Renderer_Class* clazz; 745 FT_Glyph_Format glyph_format; 746 FT_Glyph_Class glyph_class; 747 748 FT_Raster raster; 749 FT_Raster_Render_Func raster_render; 750 FT_Renderer_RenderFunc render; 751 752 } FT_RendererRec; 753 754 755 /*************************************************************************/ 756 /*************************************************************************/ 757 /*************************************************************************/ 758 /**** ****/ 759 /**** ****/ 760 /**** F O N T D R I V E R S ****/ 761 /**** ****/ 762 /**** ****/ 763 /*************************************************************************/ 764 /*************************************************************************/ 765 /*************************************************************************/ 766 767 768 /* typecast a module into a driver easily */ 769 #define FT_DRIVER( x ) ( (FT_Driver)(x) ) 770 771 /* typecast a module as a driver, and get its driver class */ 772 #define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz 773 774 775 /************************************************************************** 776 * 777 * @struct: 778 * FT_DriverRec 779 * 780 * @description: 781 * The root font driver class. A font driver is responsible for managing 782 * and loading font files of a given format. 783 * 784 * @fields: 785 * root :: 786 * Contains the fields of the root module class. 787 * 788 * clazz :: 789 * A pointer to the font driver's class. Note that this is NOT 790 * root.clazz. 'class' wasn't used as it is a reserved word in C++. 791 * 792 * faces_list :: 793 * The list of faces currently opened by this driver. 794 * 795 * glyph_loader :: 796 * Unused. Used to be glyph loader for all faces managed by this 797 * driver. 798 */ 799 typedef struct FT_DriverRec_ 800 { 801 FT_ModuleRec root; 802 FT_Driver_Class clazz; 803 FT_ListRec faces_list; 804 FT_GlyphLoader glyph_loader; 805 806 } FT_DriverRec; 807 808 809 /*************************************************************************/ 810 /*************************************************************************/ 811 /*************************************************************************/ 812 /**** ****/ 813 /**** ****/ 814 /**** L I B R A R I E S ****/ 815 /**** ****/ 816 /**** ****/ 817 /*************************************************************************/ 818 /*************************************************************************/ 819 /*************************************************************************/ 820 821 822 /************************************************************************** 823 * 824 * @struct: 825 * FT_LibraryRec 826 * 827 * @description: 828 * The FreeType library class. This is the root of all FreeType data. 829 * Use FT_New_Library() to create a library object, and FT_Done_Library() 830 * to discard it and all child objects. 831 * 832 * @fields: 833 * memory :: 834 * The library's memory object. Manages memory allocation. 835 * 836 * version_major :: 837 * The major version number of the library. 838 * 839 * version_minor :: 840 * The minor version number of the library. 841 * 842 * version_patch :: 843 * The current patch level of the library. 844 * 845 * num_modules :: 846 * The number of modules currently registered within this library. 847 * This is set to 0 for new libraries. New modules are added through 848 * the FT_Add_Module() API function. 849 * 850 * modules :: 851 * A table used to store handles to the currently registered 852 * modules. Note that each font driver contains a list of its opened 853 * faces. 854 * 855 * renderers :: 856 * The list of renderers currently registered within the library. 857 * 858 * cur_renderer :: 859 * The current outline renderer. This is a shortcut used to avoid 860 * parsing the list on each call to FT_Outline_Render(). It is a 861 * handle to the current renderer for the FT_GLYPH_FORMAT_OUTLINE 862 * format. 863 * 864 * auto_hinter :: 865 * The auto-hinter module interface. 866 * 867 * debug_hooks :: 868 * An array of four function pointers that allow debuggers to hook into 869 * a font format's interpreter. Currently, only the TrueType bytecode 870 * debugger uses this. 871 * 872 * lcd_weights :: 873 * The LCD filter weights for ClearType-style subpixel rendering. 874 * 875 * lcd_filter_func :: 876 * The LCD filtering callback function for for ClearType-style subpixel 877 * rendering. 878 * 879 * lcd_geometry :: 880 * This array specifies LCD subpixel geometry and controls Harmony LCD 881 * rendering technique, alternative to ClearType. 882 * 883 * pic_container :: 884 * Contains global structs and tables, instead of defining them 885 * globally. 886 * 887 * refcount :: 888 * A counter initialized to~1 at the time an @FT_Library structure is 889 * created. @FT_Reference_Library increments this counter, and 890 * @FT_Done_Library only destroys a library if the counter is~1, 891 * otherwise it simply decrements it. 892 */ 893 typedef struct FT_LibraryRec_ 894 { 895 FT_Memory memory; /* library's memory manager */ 896 897 FT_Int version_major; 898 FT_Int version_minor; 899 FT_Int version_patch; 900 901 FT_UInt num_modules; 902 FT_Module modules[FT_MAX_MODULES]; /* module objects */ 903 904 FT_ListRec renderers; /* list of renderers */ 905 FT_Renderer cur_renderer; /* current outline renderer */ 906 FT_Module auto_hinter; 907 908 FT_DebugHook_Func debug_hooks[4]; 909 910 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING 911 FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ 912 FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ 913 #else 914 FT_Vector lcd_geometry[3]; /* RGB subpixel positions */ 915 #endif 916 917 FT_Int refcount; 918 919 } FT_LibraryRec; 920 921 922 FT_BASE( FT_Renderer ) 923 FT_Lookup_Renderer( FT_Library library, 924 FT_Glyph_Format format, 925 FT_ListNode* node ); 926 927 FT_BASE( FT_Error ) 928 FT_Render_Glyph_Internal( FT_Library library, 929 FT_GlyphSlot slot, 930 FT_Render_Mode render_mode ); 931 932 typedef const char* 933 (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); 934 935 typedef FT_Error 936 (*FT_Face_GetGlyphNameFunc)( FT_Face face, 937 FT_UInt glyph_index, 938 FT_Pointer buffer, 939 FT_UInt buffer_max ); 940 941 typedef FT_UInt 942 (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, 943 const FT_String* glyph_name ); 944 945 946 #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM 947 948 /************************************************************************** 949 * 950 * @function: 951 * FT_New_Memory 952 * 953 * @description: 954 * Creates a new memory object. 955 * 956 * @return: 957 * A pointer to the new memory object. 0 in case of error. 958 */ 959 FT_BASE( FT_Memory ) 960 FT_New_Memory( void ); 961 962 963 /************************************************************************** 964 * 965 * @function: 966 * FT_Done_Memory 967 * 968 * @description: 969 * Discards memory manager. 970 * 971 * @input: 972 * memory :: 973 * A handle to the memory manager. 974 */ 975 FT_BASE( void ) 976 FT_Done_Memory( FT_Memory memory ); 977 978 #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ 979 980 981 /* Define default raster's interface. The default raster is located in */ 982 /* `src/base/ftraster.c'. */ 983 /* */ 984 /* Client applications can register new rasters through the */ 985 /* FT_Set_Raster() API. */ 986 987 #ifndef FT_NO_DEFAULT_RASTER 988 FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; 989 #endif 990 991 992 /************************************************************************** 993 * 994 * @macro: 995 * FT_DEFINE_OUTLINE_FUNCS 996 * 997 * @description: 998 * Used to initialize an instance of FT_Outline_Funcs struct. The struct 999 * will be allocated in the global scope (or the scope where the macro is 1000 * used). 1001 */ 1002 #define FT_DEFINE_OUTLINE_FUNCS( \ 1003 class_, \ 1004 move_to_, \ 1005 line_to_, \ 1006 conic_to_, \ 1007 cubic_to_, \ 1008 shift_, \ 1009 delta_ ) \ 1010 static const FT_Outline_Funcs class_ = \ 1011 { \ 1012 move_to_, \ 1013 line_to_, \ 1014 conic_to_, \ 1015 cubic_to_, \ 1016 shift_, \ 1017 delta_ \ 1018 }; 1019 1020 1021 /************************************************************************** 1022 * 1023 * @macro: 1024 * FT_DEFINE_RASTER_FUNCS 1025 * 1026 * @description: 1027 * Used to initialize an instance of FT_Raster_Funcs struct. The struct 1028 * will be allocated in the global scope (or the scope where the macro is 1029 * used). 1030 */ 1031 #define FT_DEFINE_RASTER_FUNCS( \ 1032 class_, \ 1033 glyph_format_, \ 1034 raster_new_, \ 1035 raster_reset_, \ 1036 raster_set_mode_, \ 1037 raster_render_, \ 1038 raster_done_ ) \ 1039 const FT_Raster_Funcs class_ = \ 1040 { \ 1041 glyph_format_, \ 1042 raster_new_, \ 1043 raster_reset_, \ 1044 raster_set_mode_, \ 1045 raster_render_, \ 1046 raster_done_ \ 1047 }; 1048 1049 1050 1051 /************************************************************************** 1052 * 1053 * @macro: 1054 * FT_DEFINE_GLYPH 1055 * 1056 * @description: 1057 * The struct will be allocated in the global scope (or the scope where 1058 * the macro is used). 1059 */ 1060 #define FT_DECLARE_GLYPH( class_ ) \ 1061 FT_CALLBACK_TABLE const FT_Glyph_Class class_; 1062 1063 #define FT_DEFINE_GLYPH( \ 1064 class_, \ 1065 size_, \ 1066 format_, \ 1067 init_, \ 1068 done_, \ 1069 copy_, \ 1070 transform_, \ 1071 bbox_, \ 1072 prepare_ ) \ 1073 FT_CALLBACK_TABLE_DEF \ 1074 const FT_Glyph_Class class_ = \ 1075 { \ 1076 size_, \ 1077 format_, \ 1078 init_, \ 1079 done_, \ 1080 copy_, \ 1081 transform_, \ 1082 bbox_, \ 1083 prepare_ \ 1084 }; 1085 1086 1087 /************************************************************************** 1088 * 1089 * @macro: 1090 * FT_DECLARE_RENDERER 1091 * 1092 * @description: 1093 * Used to create a forward declaration of a FT_Renderer_Class struct 1094 * instance. 1095 * 1096 * @macro: 1097 * FT_DEFINE_RENDERER 1098 * 1099 * @description: 1100 * Used to initialize an instance of FT_Renderer_Class struct. 1101 * 1102 * The struct will be allocated in the global scope (or the scope where 1103 * the macro is used). 1104 */ 1105 #define FT_DECLARE_RENDERER( class_ ) \ 1106 FT_EXPORT_VAR( const FT_Renderer_Class ) class_; 1107 1108 #define FT_DEFINE_RENDERER( \ 1109 class_, \ 1110 flags_, \ 1111 size_, \ 1112 name_, \ 1113 version_, \ 1114 requires_, \ 1115 interface_, \ 1116 init_, \ 1117 done_, \ 1118 get_interface_, \ 1119 glyph_format_, \ 1120 render_glyph_, \ 1121 transform_glyph_, \ 1122 get_glyph_cbox_, \ 1123 set_mode_, \ 1124 raster_class_ ) \ 1125 FT_CALLBACK_TABLE_DEF \ 1126 const FT_Renderer_Class class_ = \ 1127 { \ 1128 FT_DEFINE_ROOT_MODULE( flags_, \ 1129 size_, \ 1130 name_, \ 1131 version_, \ 1132 requires_, \ 1133 interface_, \ 1134 init_, \ 1135 done_, \ 1136 get_interface_ ) \ 1137 glyph_format_, \ 1138 \ 1139 render_glyph_, \ 1140 transform_glyph_, \ 1141 get_glyph_cbox_, \ 1142 set_mode_, \ 1143 \ 1144 raster_class_ \ 1145 }; 1146 1147 1148 /************************************************************************** 1149 * 1150 * @macro: 1151 * FT_DECLARE_MODULE 1152 * 1153 * @description: 1154 * Used to create a forward declaration of a FT_Module_Class struct 1155 * instance. 1156 * 1157 * @macro: 1158 * FT_DEFINE_MODULE 1159 * 1160 * @description: 1161 * Used to initialize an instance of an FT_Module_Class struct. 1162 * 1163 * The struct will be allocated in the global scope (or the scope where 1164 * the macro is used). 1165 * 1166 * @macro: 1167 * FT_DEFINE_ROOT_MODULE 1168 * 1169 * @description: 1170 * Used to initialize an instance of an FT_Module_Class struct inside 1171 * another struct that contains it or in a function that initializes that 1172 * containing struct. 1173 */ 1174 #define FT_DECLARE_MODULE( class_ ) \ 1175 FT_CALLBACK_TABLE \ 1176 const FT_Module_Class class_; 1177 1178 #define FT_DEFINE_ROOT_MODULE( \ 1179 flags_, \ 1180 size_, \ 1181 name_, \ 1182 version_, \ 1183 requires_, \ 1184 interface_, \ 1185 init_, \ 1186 done_, \ 1187 get_interface_ ) \ 1188 { \ 1189 flags_, \ 1190 size_, \ 1191 \ 1192 name_, \ 1193 version_, \ 1194 requires_, \ 1195 \ 1196 interface_, \ 1197 \ 1198 init_, \ 1199 done_, \ 1200 get_interface_, \ 1201 }, 1202 1203 #define FT_DEFINE_MODULE( \ 1204 class_, \ 1205 flags_, \ 1206 size_, \ 1207 name_, \ 1208 version_, \ 1209 requires_, \ 1210 interface_, \ 1211 init_, \ 1212 done_, \ 1213 get_interface_ ) \ 1214 FT_CALLBACK_TABLE_DEF \ 1215 const FT_Module_Class class_ = \ 1216 { \ 1217 flags_, \ 1218 size_, \ 1219 \ 1220 name_, \ 1221 version_, \ 1222 requires_, \ 1223 \ 1224 interface_, \ 1225 \ 1226 init_, \ 1227 done_, \ 1228 get_interface_, \ 1229 }; 1230 1231 1232 FT_END_HEADER 1233 1234 #endif /* FTOBJS_H_ */ 1235 1236 1237 /* END */ 1238