• Home
  • 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