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