• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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