Hash :
205d1ae4
Author :
Date :
2021-07-12T22:03:25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
/****************************************************************************
*
* ftmodapi.h
*
* FreeType modules public interface (specification).
*
* Copyright (C) 1996-2021 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
* modified, and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
*/
#ifndef FTMODAPI_H_
#define FTMODAPI_H_
#include <freetype/freetype.h>
#ifdef FREETYPE_H
#error "freetype.h of FreeType 1 has been loaded!"
#error "Please fix the directory search order for header files"
#error "so that freetype.h of FreeType 2 is found first."
#endif
FT_BEGIN_HEADER
/**************************************************************************
*
* @section:
* module_management
*
* @title:
* Module Management
*
* @abstract:
* How to add, upgrade, remove, and control modules from FreeType.
*
* @description:
* The definitions below are used to manage modules within FreeType.
* Internal and external modules can be added, upgraded, and removed at
* runtime. For example, an alternative renderer or proprietary font
* driver can be registered and prioritized. Additionally, some module
* properties can also be controlled.
*
* Here is a list of existing values of the `module_name` field in the
* @FT_Module_Class structure.
*
* ```
* autofitter
* bdf
* cff
* gxvalid
* otvalid
* pcf
* pfr
* psaux
* pshinter
* psnames
* raster1
* sfnt
* smooth
* truetype
* type1
* type42
* t1cid
* winfonts
* ```
*
* Note that the FreeType Cache sub-system is not a FreeType module.
*
* @order:
* FT_Module
* FT_Module_Constructor
* FT_Module_Destructor
* FT_Module_Requester
* FT_Module_Class
*
* FT_Add_Module
* FT_Get_Module
* FT_Remove_Module
* FT_Add_Default_Modules
*
* FT_FACE_DRIVER_NAME
* FT_Property_Set
* FT_Property_Get
* FT_Set_Default_Properties
*
* FT_New_Library
* FT_Done_Library
* FT_Reference_Library
*
* FT_Renderer
* FT_Renderer_Class
*
* FT_Get_Renderer
* FT_Set_Renderer
*
* FT_Set_Debug_Hook
*
*/
/* module bit flags */
#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */
#define FT_MODULE_RENDERER 2 /* this module is a renderer */
#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */
#define FT_MODULE_STYLER 8 /* this module is a styler */
#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */
/* scalable fonts */
#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */
/* support vector outlines */
#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */
/* own hinter */
#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */
/* produces LIGHT hints */
/* deprecated values */
#define ft_module_font_driver FT_MODULE_FONT_DRIVER
#define ft_module_renderer FT_MODULE_RENDERER
#define ft_module_hinter FT_MODULE_HINTER
#define ft_module_styler FT_MODULE_STYLER
#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE
#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES
#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER
#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY
typedef FT_Pointer FT_Module_Interface;
/**************************************************************************
*
* @functype:
* FT_Module_Constructor
*
* @description:
* A function used to initialize (not create) a new module object.
*
* @input:
* module ::
* The module to initialize.
*/
typedef FT_Error
(*FT_Module_Constructor)( FT_Module module );
/**************************************************************************
*
* @functype:
* FT_Module_Destructor
*
* @description:
* A function used to finalize (not destroy) a given module object.
*
* @input:
* module ::
* The module to finalize.
*/
typedef void
(*FT_Module_Destructor)( FT_Module module );
/**************************************************************************
*
* @functype:
* FT_Module_Requester
*
* @description:
* A function used to query a given module for a specific interface.
*
* @input:
* module ::
* The module to be searched.
*
* name ::
* The name of the interface in the module.
*/
typedef FT_Module_Interface
(*FT_Module_Requester)( FT_Module module,
const char* name );
/**************************************************************************
*
* @struct:
* FT_Module_Class
*
* @description:
* The module class descriptor. While being a public structure necessary
* for FreeType's module bookkeeping, most of the fields are essentially
* internal, not to be used directly by an application.
*
* @fields:
* module_flags ::
* Bit flags describing the module.
*
* module_size ::
* The size of one module object/instance in bytes.
*
* module_name ::
* The name of the module.
*
* module_version ::
* The version, as a 16.16 fixed number (major.minor).
*
* module_requires ::
* The version of FreeType this module requires, as a 16.16 fixed
* number (major.minor). Starts at version 2.0, i.e., 0x20000.
*
* module_interface ::
* A typeless pointer to a structure (which varies between different
* modules) that holds the module's interface functions. This is
* essentially what `get_interface` returns.
*
* module_init ::
* The initializing function.
*
* module_done ::
* The finalizing function.
*
* get_interface ::
* The interface requesting function.
*/
typedef struct FT_Module_Class_
{
FT_ULong module_flags;
FT_Long module_size;
const FT_String* module_name;
FT_Fixed module_version;
FT_Fixed module_requires;
const void* module_interface;
FT_Module_Constructor module_init;
FT_Module_Destructor module_done;
FT_Module_Requester get_interface;
} FT_Module_Class;
/**************************************************************************
*
* @function:
* FT_Add_Module
*
* @description:
* Add a new module to a given library instance.
*
* @inout:
* library ::
* A handle to the library object.
*
* @input:
* clazz ::
* A pointer to class descriptor for the module.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* An error will be returned if a module already exists by that name, or
* if the module requires a version of FreeType that is too great.
*/
FT_EXPORT( FT_Error )
FT_Add_Module( FT_Library library,
const FT_Module_Class* clazz );
/**************************************************************************
*
* @function:
* FT_Get_Module
*
* @description:
* Find a module by its name.
*
* @input:
* library ::
* A handle to the library object.
*
* module_name ::
* The module's name (as an ASCII string).
*
* @return:
* A module handle. 0~if none was found.
*
* @note:
* FreeType's internal modules aren't documented very well, and you
* should look up the source code for details.
*/
FT_EXPORT( FT_Module )
FT_Get_Module( FT_Library library,
const char* module_name );
/**************************************************************************
*
* @function:
* FT_Remove_Module
*
* @description:
* Remove a given module from a library instance.
*
* @inout:
* library ::
* A handle to a library object.
*
* @input:
* module ::
* A handle to a module object.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* The module object is destroyed by the function in case of success.
*/
FT_EXPORT( FT_Error )
FT_Remove_Module( FT_Library library,
FT_Module module );
/**************************************************************************
*
* @macro:
* FT_FACE_DRIVER_NAME
*
* @description:
* A macro that retrieves the name of a font driver from a face object.
*
* @note:
* The font driver name is a valid `module_name` for @FT_Property_Set
* and @FT_Property_Get. This is not the same as @FT_Get_Font_Format.
*
* @since:
* 2.11
*
*/
#define FT_FACE_DRIVER_NAME( face ) \
( ( *(FT_Module_Class**)( ( face )->driver ) )->module_name )
/**************************************************************************
*
* @function:
* FT_Property_Set
*
* @description:
* Set a property for a given module.
*
* @input:
* library ::
* A handle to the library the module is part of.
*
* module_name ::
* The module name.
*
* property_name ::
* The property name. Properties are described in section
* @properties.
*
* Note that only a few modules have properties.
*
* value ::
* A generic pointer to a variable or structure that gives the new
* value of the property. The exact definition of `value` is
* dependent on the property; see section @properties.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* If `module_name` isn't a valid module name, or `property_name`
* doesn't specify a valid property, or if `value` doesn't represent a
* valid value for the given property, an error is returned.
*
* The following example sets property 'bar' (a simple integer) in
* module 'foo' to value~1.
*
* ```
* FT_UInt bar;
*
*
* bar = 1;
* FT_Property_Set( library, "foo", "bar", &bar );
* ```
*
* Note that the FreeType Cache sub-system doesn't recognize module
* property changes. To avoid glyph lookup confusion within the cache
* you should call @FTC_Manager_Reset to completely flush the cache if a
* module property gets changed after @FTC_Manager_New has been called.
*
* It is not possible to set properties of the FreeType Cache sub-system
* itself with FT_Property_Set; use @FTC_Property_Set instead.
*
* @since:
* 2.4.11
*
*/
FT_EXPORT( FT_Error )
FT_Property_Set( FT_Library library,
const FT_String* module_name,
const FT_String* property_name,
const void* value );
/**************************************************************************
*
* @function:
* FT_Property_Get
*
* @description:
* Get a module's property value.
*
* @input:
* library ::
* A handle to the library the module is part of.
*
* module_name ::
* The module name.
*
* property_name ::
* The property name. Properties are described in section
* @properties.
*
* @inout:
* value ::
* A generic pointer to a variable or structure that gives the value
* of the property. The exact definition of `value` is dependent on
* the property; see section @properties.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* If `module_name` isn't a valid module name, or `property_name`
* doesn't specify a valid property, or if `value` doesn't represent a
* valid value for the given property, an error is returned.
*
* The following example gets property 'baz' (a range) in module 'foo'.
*
* ```
* typedef range_
* {
* FT_Int32 min;
* FT_Int32 max;
*
* } range;
*
* range baz;
*
*
* FT_Property_Get( library, "foo", "baz", &baz );
* ```
*
* It is not possible to retrieve properties of the FreeType Cache
* sub-system with FT_Property_Get; use @FTC_Property_Get instead.
*
* @since:
* 2.4.11
*
*/
FT_EXPORT( FT_Error )
FT_Property_Get( FT_Library library,
const FT_String* module_name,
const FT_String* property_name,
void* value );
/**************************************************************************
*
* @function:
* FT_Set_Default_Properties
*
* @description:
* If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is
* set, this function reads the `FREETYPE_PROPERTIES` environment
* variable to control driver properties. See section @properties for
* more.
*
* If the compilation option is not set, this function does nothing.
*
* `FREETYPE_PROPERTIES` has the following syntax form (broken here into
* multiple lines for better readability).
*
* ```
* <optional whitespace>
* <module-name1> ':'
* <property-name1> '=' <property-value1>
* <whitespace>
* <module-name2> ':'
* <property-name2> '=' <property-value2>
* ...
* ```
*
* Example:
*
* ```
* FREETYPE_PROPERTIES=truetype:interpreter-version=35 \
* cff:no-stem-darkening=0
* ```
*
* @inout:
* library ::
* A handle to a new library object.
*
* @since:
* 2.8
*/
FT_EXPORT( void )
FT_Set_Default_Properties( FT_Library library );
/**************************************************************************
*
* @function:
* FT_Reference_Library
*
* @description:
* A counter gets initialized to~1 at the time an @FT_Library structure
* is created. This function increments the counter. @FT_Done_Library
* then only destroys a library if the counter is~1, otherwise it simply
* decrements the counter.
*
* This function helps in managing life-cycles of structures that
* reference @FT_Library objects.
*
* @input:
* library ::
* A handle to a target library object.
*
* @return:
* FreeType error code. 0~means success.
*
* @since:
* 2.4.2
*/
FT_EXPORT( FT_Error )
FT_Reference_Library( FT_Library library );
/**************************************************************************
*
* @function:
* FT_New_Library
*
* @description:
* This function is used to create a new FreeType library instance from a
* given memory object. It is thus possible to use libraries with
* distinct memory allocators within the same program. Note, however,
* that the used @FT_Memory structure is expected to remain valid for the
* life of the @FT_Library object.
*
* Normally, you would call this function (followed by a call to
* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a
* call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to
* initialize the FreeType library.
*
* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library
* instance.
*
* @input:
* memory ::
* A handle to the original memory object.
*
* @output:
* alibrary ::
* A pointer to handle of a new library object.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* See the discussion of reference counters in the description of
* @FT_Reference_Library.
*/
FT_EXPORT( FT_Error )
FT_New_Library( FT_Memory memory,
FT_Library *alibrary );
/**************************************************************************
*
* @function:
* FT_Done_Library
*
* @description:
* Discard a given library object. This closes all drivers and discards
* all resource objects.
*
* @input:
* library ::
* A handle to the target library.
*
* @return:
* FreeType error code. 0~means success.
*
* @note:
* See the discussion of reference counters in the description of
* @FT_Reference_Library.
*/
FT_EXPORT( FT_Error )
FT_Done_Library( FT_Library library );
/**************************************************************************
*
* @functype:
* FT_DebugHook_Func
*
* @description:
* A drop-in replacement (or rather a wrapper) for the bytecode or
* charstring interpreter's main loop function.
*
* Its job is essentially
*
* - to activate debug mode to enforce single-stepping,
*
* - to call the main loop function to interpret the next opcode, and
*
* - to show the changed context to the user.
*
* An example for such a main loop function is `TT_RunIns` (declared in
* FreeType's internal header file `src/truetype/ttinterp.h`).
*
* Have a look at the source code of the `ttdebug` FreeType demo program
* for an example of a drop-in replacement.
*
* @inout:
* arg ::
* A typeless pointer, to be cast to the main loop function's data
* structure (which depends on the font module). For TrueType fonts
* it is bytecode interpreter's execution context, `TT_ExecContext`,
* which is declared in FreeType's internal header file `tttypes.h`.
*/
typedef FT_Error
(*FT_DebugHook_Func)( void* arg );
/**************************************************************************
*
* @enum:
* FT_DEBUG_HOOK_XXX
*
* @description:
* A list of named debug hook indices.
*
* @values:
* FT_DEBUG_HOOK_TRUETYPE::
* This hook index identifies the TrueType bytecode debugger.
*/
#define FT_DEBUG_HOOK_TRUETYPE 0
/**************************************************************************
*
* @function:
* FT_Set_Debug_Hook
*
* @description:
* Set a debug hook function for debugging the interpreter of a font
* format.
*
* While this is a public API function, an application needs access to
* FreeType's internal header files to do something useful.
*
* Have a look at the source code of the `ttdebug` FreeType demo program
* for an example of its usage.
*
* @inout:
* library ::
* A handle to the library object.
*
* @input:
* hook_index ::
* The index of the debug hook. You should use defined enumeration
* macros like @FT_DEBUG_HOOK_TRUETYPE.
*
* debug_hook ::
* The function used to debug the interpreter.
*
* @note:
* Currently, four debug hook slots are available, but only one (for the
* TrueType interpreter) is defined.
*/
FT_EXPORT( void )
FT_Set_Debug_Hook( FT_Library library,
FT_UInt hook_index,
FT_DebugHook_Func debug_hook );
/**************************************************************************
*
* @function:
* FT_Add_Default_Modules
*
* @description:
* Add the set of default drivers to a given library object. This is
* only useful when you create a library object with @FT_New_Library
* (usually to plug a custom memory manager).
*
* @inout:
* library ::
* A handle to a new library object.
*/
FT_EXPORT( void )
FT_Add_Default_Modules( FT_Library library );
/**************************************************************************
*
* @section:
* truetype_engine
*
* @title:
* The TrueType Engine
*
* @abstract:
* TrueType bytecode support.
*
* @description:
* This section contains a function used to query the level of TrueType
* bytecode support compiled in this version of the library.
*
*/
/**************************************************************************
*
* @enum:
* FT_TrueTypeEngineType
*
* @description:
* A list of values describing which kind of TrueType bytecode engine is
* implemented in a given FT_Library instance. It is used by the
* @FT_Get_TrueType_Engine_Type function.
*
* @values:
* FT_TRUETYPE_ENGINE_TYPE_NONE ::
* The library doesn't implement any kind of bytecode interpreter.
*
* FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
* Deprecated and removed.
*
* FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
* The library implements a bytecode interpreter that covers the full
* instruction set of the TrueType virtual machine (this was governed
* by patents until May 2010, hence the name).
*
* @since:
* 2.2
*
*/
typedef enum FT_TrueTypeEngineType_
{
FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
FT_TRUETYPE_ENGINE_TYPE_PATENTED
} FT_TrueTypeEngineType;
/**************************************************************************
*
* @function:
* FT_Get_TrueType_Engine_Type
*
* @description:
* Return an @FT_TrueTypeEngineType value to indicate which level of the
* TrueType virtual machine a given library instance supports.
*
* @input:
* library ::
* A library instance.
*
* @return:
* A value indicating which level is supported.
*
* @since:
* 2.2
*
*/
FT_EXPORT( FT_TrueTypeEngineType )
FT_Get_TrueType_Engine_Type( FT_Library library );
/* */
FT_END_HEADER
#endif /* FTMODAPI_H_ */
/* END */