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