1 /***************************************************************************/
2 /*                                                                         */
3 /*  sfnt.h                                                                 */
4 /*                                                                         */
5 /*    High-level `sfnt' driver interface (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 #ifndef SFNT_H_
20 #define SFNT_H_
21 
22 
23 #include <ft2build.h>
24 #include FT_INTERNAL_DRIVER_H
25 #include FT_INTERNAL_TRUETYPE_TYPES_H
26 
27 
28 FT_BEGIN_HEADER
29 
30 
31   /*************************************************************************/
32   /*                                                                       */
33   /* <FuncType>                                                            */
34   /*    TT_Init_Face_Func                                                  */
35   /*                                                                       */
36   /* <Description>                                                         */
37   /*    First part of the SFNT face object initialization.  This finds     */
38   /*    the face in a SFNT file or collection, and load its format tag in  */
39   /*    face->format_tag.                                                  */
40   /*                                                                       */
41   /* <Input>                                                               */
42   /*    stream     :: The input stream.                                    */
43   /*                                                                       */
44   /*    face       :: A handle to the target face object.                  */
45   /*                                                                       */
46   /*    face_index :: The index of the TrueType font, if we are opening a  */
47   /*                  collection, in bits 0-15.  The numbered instance     */
48   /*                  index~+~1 of a GX (sub)font, if applicable, in bits  */
49   /*                  16-30.                                               */
50   /*                                                                       */
51   /*    num_params :: The number of additional parameters.                 */
52   /*                                                                       */
53   /*    params     :: Optional additional parameters.                      */
54   /*                                                                       */
55   /* <Return>                                                              */
56   /*    FreeType error code.  0 means success.                             */
57   /*                                                                       */
58   /* <Note>                                                                */
59   /*    The stream cursor must be at the font file's origin.               */
60   /*                                                                       */
61   /*    This function recognizes fonts embedded in a `TrueType             */
62   /*    collection'.                                                       */
63   /*                                                                       */
64   /*    Once the format tag has been validated by the font driver, it      */
65   /*    should then call the TT_Load_Face_Func() callback to read the rest */
66   /*    of the SFNT tables in the object.                                  */
67   /*                                                                       */
68   typedef FT_Error
69   (*TT_Init_Face_Func)( FT_Stream      stream,
70                         TT_Face        face,
71                         FT_Int         face_index,
72                         FT_Int         num_params,
73                         FT_Parameter*  params );
74 
75 
76   /*************************************************************************/
77   /*                                                                       */
78   /* <FuncType>                                                            */
79   /*    TT_Load_Face_Func                                                  */
80   /*                                                                       */
81   /* <Description>                                                         */
82   /*    Second part of the SFNT face object initialization.  This loads    */
83   /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */
84   /*    face object.                                                       */
85   /*                                                                       */
86   /* <Input>                                                               */
87   /*    stream     :: The input stream.                                    */
88   /*                                                                       */
89   /*    face       :: A handle to the target face object.                  */
90   /*                                                                       */
91   /*    face_index :: The index of the TrueType font, if we are opening a  */
92   /*                  collection, in bits 0-15.  The numbered instance     */
93   /*                  index~+~1 of a GX (sub)font, if applicable, in bits  */
94   /*                  16-30.                                               */
95   /*                                                                       */
96   /*    num_params :: The number of additional parameters.                 */
97   /*                                                                       */
98   /*    params     :: Optional additional parameters.                      */
99   /*                                                                       */
100   /* <Return>                                                              */
101   /*    FreeType error code.  0 means success.                             */
102   /*                                                                       */
103   /* <Note>                                                                */
104   /*    This function must be called after TT_Init_Face_Func().            */
105   /*                                                                       */
106   typedef FT_Error
107   (*TT_Load_Face_Func)( FT_Stream      stream,
108                         TT_Face        face,
109                         FT_Int         face_index,
110                         FT_Int         num_params,
111                         FT_Parameter*  params );
112 
113 
114   /*************************************************************************/
115   /*                                                                       */
116   /* <FuncType>                                                            */
117   /*    TT_Done_Face_Func                                                  */
118   /*                                                                       */
119   /* <Description>                                                         */
120   /*    A callback used to delete the common SFNT data from a face.        */
121   /*                                                                       */
122   /* <Input>                                                               */
123   /*    face :: A handle to the target face object.                        */
124   /*                                                                       */
125   /* <Note>                                                                */
126   /*    This function does NOT destroy the face object.                    */
127   /*                                                                       */
128   typedef void
129   (*TT_Done_Face_Func)( TT_Face  face );
130 
131 
132   /*************************************************************************/
133   /*                                                                       */
134   /* <FuncType>                                                            */
135   /*    TT_Load_Any_Func                                                   */
136   /*                                                                       */
137   /* <Description>                                                         */
138   /*    Load any font table into client memory.                            */
139   /*                                                                       */
140   /* <Input>                                                               */
141   /*    face   :: The face object to look for.                             */
142   /*                                                                       */
143   /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
144   /*              to access the whole font file, else set this parameter   */
145   /*              to a valid TrueType table tag that you can forge with    */
146   /*              the MAKE_TT_TAG macro.                                   */
147   /*                                                                       */
148   /*    offset :: The starting offset in the table (or the file if         */
149   /*              tag == 0).                                               */
150   /*                                                                       */
151   /*    length :: The address of the decision variable:                    */
152   /*                                                                       */
153   /*                If length == NULL:                                     */
154   /*                  Loads the whole table.  Returns an error if          */
155   /*                  `offset' == 0!                                       */
156   /*                                                                       */
157   /*                If *length == 0:                                       */
158   /*                  Exits immediately; returning the length of the given */
159   /*                  table or of the font file, depending on the value of */
160   /*                  `tag'.                                               */
161   /*                                                                       */
162   /*                If *length != 0:                                       */
163   /*                  Loads the next `length' bytes of table or font,      */
164   /*                  starting at offset `offset' (in table or font too).  */
165   /*                                                                       */
166   /* <Output>                                                              */
167   /*    buffer :: The address of target buffer.                            */
168   /*                                                                       */
169   /* <Return>                                                              */
170   /*    TrueType error code.  0 means success.                             */
171   /*                                                                       */
172   typedef FT_Error
173   (*TT_Load_Any_Func)( TT_Face    face,
174                        FT_ULong   tag,
175                        FT_Long    offset,
176                        FT_Byte   *buffer,
177                        FT_ULong*  length );
178 
179 
180   /*************************************************************************/
181   /*                                                                       */
182   /* <FuncType>                                                            */
183   /*    TT_Find_SBit_Image_Func                                            */
184   /*                                                                       */
185   /* <Description>                                                         */
186   /*    Check whether an embedded bitmap (an `sbit') exists for a given    */
187   /*    glyph, at a given strike.                                          */
188   /*                                                                       */
189   /* <Input>                                                               */
190   /*    face          :: The target face object.                           */
191   /*                                                                       */
192   /*    glyph_index   :: The glyph index.                                  */
193   /*                                                                       */
194   /*    strike_index  :: The current strike index.                         */
195   /*                                                                       */
196   /* <Output>                                                              */
197   /*    arange        :: The SBit range containing the glyph index.        */
198   /*                                                                       */
199   /*    astrike       :: The SBit strike containing the glyph index.       */
200   /*                                                                       */
201   /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
202   /*                                                                       */
203   /* <Return>                                                              */
204   /*    FreeType error code.  0 means success.  Returns                    */
205   /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
206   /*    glyph.                                                             */
207   /*                                                                       */
208   typedef FT_Error
209   (*TT_Find_SBit_Image_Func)( TT_Face          face,
210                               FT_UInt          glyph_index,
211                               FT_ULong         strike_index,
212                               TT_SBit_Range   *arange,
213                               TT_SBit_Strike  *astrike,
214                               FT_ULong        *aglyph_offset );
215 
216 
217   /*************************************************************************/
218   /*                                                                       */
219   /* <FuncType>                                                            */
220   /*    TT_Load_SBit_Metrics_Func                                          */
221   /*                                                                       */
222   /* <Description>                                                         */
223   /*    Get the big metrics for a given embedded bitmap.                   */
224   /*                                                                       */
225   /* <Input>                                                               */
226   /*    stream      :: The input stream.                                   */
227   /*                                                                       */
228   /*    range       :: The SBit range containing the glyph.                */
229   /*                                                                       */
230   /* <Output>                                                              */
231   /*    big_metrics :: A big SBit metrics structure for the glyph.         */
232   /*                                                                       */
233   /* <Return>                                                              */
234   /*    FreeType error code.  0 means success.                             */
235   /*                                                                       */
236   /* <Note>                                                                */
237   /*    The stream cursor must be positioned at the glyph's offset within  */
238   /*    the `EBDT' table before the call.                                  */
239   /*                                                                       */
240   /*    If the image format uses variable metrics, the stream cursor is    */
241   /*    positioned just after the metrics header in the `EBDT' table on    */
242   /*    function exit.                                                     */
243   /*                                                                       */
244   typedef FT_Error
245   (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,
246                                 TT_SBit_Range    range,
247                                 TT_SBit_Metrics  metrics );
248 
249 
250   /*************************************************************************/
251   /*                                                                       */
252   /* <FuncType>                                                            */
253   /*    TT_Load_SBit_Image_Func                                            */
254   /*                                                                       */
255   /* <Description>                                                         */
256   /*    Load a given glyph sbit image from the font resource.  This also   */
257   /*    returns its metrics.                                               */
258   /*                                                                       */
259   /* <Input>                                                               */
260   /*    face ::                                                            */
261   /*      The target face object.                                          */
262   /*                                                                       */
263   /*    strike_index ::                                                    */
264   /*      The strike index.                                                */
265   /*                                                                       */
266   /*    glyph_index ::                                                     */
267   /*      The current glyph index.                                         */
268   /*                                                                       */
269   /*    load_flags ::                                                      */
270   /*      The current load flags.                                          */
271   /*                                                                       */
272   /*    stream ::                                                          */
273   /*      The input stream.                                                */
274   /*                                                                       */
275   /* <Output>                                                              */
276   /*    amap ::                                                            */
277   /*      The target pixmap.                                               */
278   /*                                                                       */
279   /*    ametrics ::                                                        */
280   /*      A big sbit metrics structure for the glyph image.                */
281   /*                                                                       */
282   /* <Return>                                                              */
283   /*    FreeType error code.  0 means success.  Returns an error if no     */
284   /*    glyph sbit exists for the index.                                   */
285   /*                                                                       */
286   /*  <Note>                                                               */
287   /*    The `map.buffer' field is always freed before the glyph is loaded. */
288   /*                                                                       */
289   typedef FT_Error
290   (*TT_Load_SBit_Image_Func)( TT_Face              face,
291                               FT_ULong             strike_index,
292                               FT_UInt              glyph_index,
293                               FT_UInt              load_flags,
294                               FT_Stream            stream,
295                               FT_Bitmap           *amap,
296                               TT_SBit_MetricsRec  *ametrics );
297 
298 
299   /*************************************************************************/
300   /*                                                                       */
301   /* <FuncType>                                                            */
302   /*    TT_Set_SBit_Strike_Func                                            */
303   /*                                                                       */
304   /* <Description>                                                         */
305   /*    Select an sbit strike for a given size request.                    */
306   /*                                                                       */
307   /* <Input>                                                               */
308   /*    face          :: The target face object.                           */
309   /*                                                                       */
310   /*    req           :: The size request.                                 */
311   /*                                                                       */
312   /* <Output>                                                              */
313   /*    astrike_index :: The index of the sbit strike.                     */
314   /*                                                                       */
315   /* <Return>                                                              */
316   /*    FreeType error code.  0 means success.  Returns an error if no     */
317   /*    sbit strike exists for the selected ppem values.                   */
318   /*                                                                       */
319   typedef FT_Error
320   (*TT_Set_SBit_Strike_Func)( TT_Face          face,
321                               FT_Size_Request  req,
322                               FT_ULong*        astrike_index );
323 
324 
325   /*************************************************************************/
326   /*                                                                       */
327   /* <FuncType>                                                            */
328   /*    TT_Load_Strike_Metrics_Func                                        */
329   /*                                                                       */
330   /* <Description>                                                         */
331   /*    Load the metrics of a given strike.                                */
332   /*                                                                       */
333   /* <Input>                                                               */
334   /*    face          :: The target face object.                           */
335   /*                                                                       */
336   /*    strike_index  :: The strike index.                                 */
337   /*                                                                       */
338   /* <Output>                                                              */
339   /*    metrics       :: the metrics of the strike.                        */
340   /*                                                                       */
341   /* <Return>                                                              */
342   /*    FreeType error code.  0 means success.  Returns an error if no     */
343   /*    such sbit strike exists.                                           */
344   /*                                                                       */
345   typedef FT_Error
346   (*TT_Load_Strike_Metrics_Func)( TT_Face           face,
347                                   FT_ULong          strike_index,
348                                   FT_Size_Metrics*  metrics );
349 
350 
351   /*************************************************************************/
352   /*                                                                       */
353   /* <FuncType>                                                            */
354   /*    TT_Get_PS_Name_Func                                                */
355   /*                                                                       */
356   /* <Description>                                                         */
357   /*    Get the PostScript glyph name of a glyph.                          */
358   /*                                                                       */
359   /* <Input>                                                               */
360   /*    idx  :: The glyph index.                                           */
361   /*                                                                       */
362   /*    PSname :: The address of a string pointer.  Will be NULL in case   */
363   /*              of error, otherwise it is a pointer to the glyph name.   */
364   /*                                                                       */
365   /*              You must not modify the returned string!                 */
366   /*                                                                       */
367   /* <Output>                                                              */
368   /*    FreeType error code.  0 means success.                             */
369   /*                                                                       */
370   typedef FT_Error
371   (*TT_Get_PS_Name_Func)( TT_Face      face,
372                           FT_UInt      idx,
373                           FT_String**  PSname );
374 
375 
376   /*************************************************************************/
377   /*                                                                       */
378   /* <FuncType>                                                            */
379   /*    TT_Load_Metrics_Func                                               */
380   /*                                                                       */
381   /* <Description>                                                         */
382   /*    Load a metrics table, which is a table with a horizontal and a     */
383   /*    vertical version.                                                  */
384   /*                                                                       */
385   /* <Input>                                                               */
386   /*    face     :: A handle to the target face object.                    */
387   /*                                                                       */
388   /*    stream   :: The input stream.                                      */
389   /*                                                                       */
390   /*    vertical :: A boolean flag.  If set, load the vertical one.        */
391   /*                                                                       */
392   /* <Return>                                                              */
393   /*    FreeType error code.  0 means success.                             */
394   /*                                                                       */
395   typedef FT_Error
396   (*TT_Load_Metrics_Func)( TT_Face    face,
397                            FT_Stream  stream,
398                            FT_Bool    vertical );
399 
400 
401   /*************************************************************************/
402   /*                                                                       */
403   /* <FuncType>                                                            */
404   /*    TT_Get_Metrics_Func                                                */
405   /*                                                                       */
406   /* <Description>                                                         */
407   /*    Load the horizontal or vertical header in a face object.           */
408   /*                                                                       */
409   /* <Input>                                                               */
410   /*    face     :: A handle to the target face object.                    */
411   /*                                                                       */
412   /*    vertical :: A boolean flag.  If set, load vertical metrics.        */
413   /*                                                                       */
414   /*    gindex   :: The glyph index.                                       */
415   /*                                                                       */
416   /* <Output>                                                              */
417   /*    abearing :: The horizontal (or vertical) bearing.  Set to zero in  */
418   /*                case of error.                                         */
419   /*                                                                       */
420   /*    aadvance :: The horizontal (or vertical) advance.  Set to zero in  */
421   /*                case of error.                                         */
422   /*                                                                       */
423   typedef void
424   (*TT_Get_Metrics_Func)( TT_Face     face,
425                           FT_Bool     vertical,
426                           FT_UInt     gindex,
427                           FT_Short*   abearing,
428                           FT_UShort*  aadvance );
429 
430 
431   /*************************************************************************/
432   /*                                                                       */
433   /* <FuncType>                                                            */
434   /*    TT_Get_Name_Func                                                   */
435   /*                                                                       */
436   /* <Description>                                                         */
437   /*    From the `name' table, return a given ENGLISH name record in       */
438   /*    ASCII.                                                             */
439   /*                                                                       */
440   /* <Input>                                                               */
441   /*    face     :: A handle to the source face object.                    */
442   /*                                                                       */
443   /*    nameid   :: The name id of the name record to return.              */
444   /*                                                                       */
445   /* <InOut>                                                               */
446   /*    name     :: The address of an allocated string pointer.  NULL if   */
447   /*                no name is present.                                    */
448   /*                                                                       */
449   /* <Return>                                                              */
450   /*    FreeType error code.  0 means success.                             */
451   /*                                                                       */
452   typedef FT_Error
453   (*TT_Get_Name_Func)( TT_Face      face,
454                        FT_UShort    nameid,
455                        FT_String**  name );
456 
457 
458   /*************************************************************************/
459   /*                                                                       */
460   /* <FuncType>                                                            */
461   /*    TT_Get_Name_ID_Func                                                */
462   /*                                                                       */
463   /* <Description>                                                         */
464   /*    Search whether an ENGLISH version for a given name ID is in the    */
465   /*    `name' table.                                                      */
466   /*                                                                       */
467   /* <Input>                                                               */
468   /*    face     :: A handle to the source face object.                    */
469   /*                                                                       */
470   /*    nameid   :: The name id of the name record to return.              */
471   /*                                                                       */
472   /* <Out>                                                                 */
473   /*    win      :: If non-negative, an index into the `name' table with   */
474   /*                the corresponding (3,1) or (3,0) Windows entry.        */
475   /*                                                                       */
476   /*    apple    :: If non-negative, an index into the `name' table with   */
477   /*                the corresponding (1,0) Apple entry.                   */
478   /*                                                                       */
479   /* <Return>                                                              */
480   /*    1 if there is either a win or apple entry (or both), 0 otheriwse.  */
481   /*                                                                       */
482   typedef FT_Bool
483   (*TT_Get_Name_ID_Func)( TT_Face    face,
484                           FT_UShort  nameid,
485                           FT_Int    *win,
486                           FT_Int    *apple );
487 
488 
489   /*************************************************************************/
490   /*                                                                       */
491   /* <FuncType>                                                            */
492   /*    TT_Load_Table_Func                                                 */
493   /*                                                                       */
494   /* <Description>                                                         */
495   /*    Load a given TrueType table.                                       */
496   /*                                                                       */
497   /* <Input>                                                               */
498   /*    face   :: A handle to the target face object.                      */
499   /*                                                                       */
500   /*    stream :: The input stream.                                        */
501   /*                                                                       */
502   /* <Return>                                                              */
503   /*    FreeType error code.  0 means success.                             */
504   /*                                                                       */
505   /* <Note>                                                                */
506   /*    The function uses `face->goto_table' to seek the stream to the     */
507   /*    start of the table, except while loading the font directory.       */
508   /*                                                                       */
509   typedef FT_Error
510   (*TT_Load_Table_Func)( TT_Face    face,
511                          FT_Stream  stream );
512 
513 
514   /*************************************************************************/
515   /*                                                                       */
516   /* <FuncType>                                                            */
517   /*    TT_Free_Table_Func                                                 */
518   /*                                                                       */
519   /* <Description>                                                         */
520   /*    Free a given TrueType table.                                       */
521   /*                                                                       */
522   /* <Input>                                                               */
523   /*    face :: A handle to the target face object.                        */
524   /*                                                                       */
525   typedef void
526   (*TT_Free_Table_Func)( TT_Face  face );
527 
528 
529   /*
530    * @functype:
531    *    TT_Face_GetKerningFunc
532    *
533    * @description:
534    *    Return the horizontal kerning value between two glyphs.
535    *
536    * @input:
537    *    face        :: A handle to the source face object.
538    *    left_glyph  :: The left glyph index.
539    *    right_glyph :: The right glyph index.
540    *
541    * @return:
542    *    The kerning value in font units.
543    */
544   typedef FT_Int
545   (*TT_Face_GetKerningFunc)( TT_Face  face,
546                              FT_UInt  left_glyph,
547                              FT_UInt  right_glyph );
548 
549 
550   /*************************************************************************/
551   /*                                                                       */
552   /* <Struct>                                                              */
553   /*    SFNT_Interface                                                     */
554   /*                                                                       */
555   /* <Description>                                                         */
556   /*    This structure holds pointers to the functions used to load and    */
557   /*    free the basic tables that are required in a `sfnt' font file.     */
558   /*                                                                       */
559   /* <Fields>                                                              */
560   /*    Check the various xxx_Func() descriptions for details.             */
561   /*                                                                       */
562   typedef struct  SFNT_Interface_
563   {
564     TT_Loader_GotoTableFunc      goto_table;
565 
566     TT_Init_Face_Func            init_face;
567     TT_Load_Face_Func            load_face;
568     TT_Done_Face_Func            done_face;
569     FT_Module_Requester          get_interface;
570 
571     TT_Load_Any_Func             load_any;
572 
573     /* these functions are called by `load_face' but they can also  */
574     /* be called from external modules, if there is a need to do so */
575     TT_Load_Table_Func           load_head;
576     TT_Load_Metrics_Func         load_hhea;
577     TT_Load_Table_Func           load_cmap;
578     TT_Load_Table_Func           load_maxp;
579     TT_Load_Table_Func           load_os2;
580     TT_Load_Table_Func           load_post;
581 
582     TT_Load_Table_Func           load_name;
583     TT_Free_Table_Func           free_name;
584 
585     /* this field was called `load_kerning' up to version 2.1.10 */
586     TT_Load_Table_Func           load_kern;
587 
588     TT_Load_Table_Func           load_gasp;
589     TT_Load_Table_Func           load_pclt;
590 
591     /* see `ttload.h'; this field was called `load_bitmap_header' up to */
592     /* version 2.1.10                                                   */
593     TT_Load_Table_Func           load_bhed;
594 
595     TT_Load_SBit_Image_Func      load_sbit_image;
596 
597     /* see `ttpost.h' */
598     TT_Get_PS_Name_Func          get_psname;
599     TT_Free_Table_Func           free_psnames;
600 
601     /* starting here, the structure differs from version 2.1.7 */
602 
603     /* this field was introduced in version 2.1.8, named `get_psname' */
604     TT_Face_GetKerningFunc       get_kerning;
605 
606     /* new elements introduced after version 2.1.10 */
607 
608     /* load the font directory, i.e., the offset table and */
609     /* the table directory                                 */
610     TT_Load_Table_Func           load_font_dir;
611     TT_Load_Metrics_Func         load_hmtx;
612 
613     TT_Load_Table_Func           load_eblc;
614     TT_Free_Table_Func           free_eblc;
615 
616     TT_Set_SBit_Strike_Func      set_sbit_strike;
617     TT_Load_Strike_Metrics_Func  load_strike_metrics;
618 
619     TT_Get_Metrics_Func          get_metrics;
620 
621     TT_Get_Name_Func             get_name;
622     TT_Get_Name_ID_Func          get_name_id;
623 
624   } SFNT_Interface;
625 
626 
627   /* transitional */
628   typedef SFNT_Interface*   SFNT_Service;
629 
630 #ifndef FT_CONFIG_OPTION_PIC
631 
632 #define FT_DEFINE_SFNT_INTERFACE(        \
633           class_,                        \
634           goto_table_,                   \
635           init_face_,                    \
636           load_face_,                    \
637           done_face_,                    \
638           get_interface_,                \
639           load_any_,                     \
640           load_head_,                    \
641           load_hhea_,                    \
642           load_cmap_,                    \
643           load_maxp_,                    \
644           load_os2_,                     \
645           load_post_,                    \
646           load_name_,                    \
647           free_name_,                    \
648           load_kern_,                    \
649           load_gasp_,                    \
650           load_pclt_,                    \
651           load_bhed_,                    \
652           load_sbit_image_,              \
653           get_psname_,                   \
654           free_psnames_,                 \
655           get_kerning_,                  \
656           load_font_dir_,                \
657           load_hmtx_,                    \
658           load_eblc_,                    \
659           free_eblc_,                    \
660           set_sbit_strike_,              \
661           load_strike_metrics_,          \
662           get_metrics_,                  \
663           get_name_,                     \
664           get_name_id_ )                 \
665   static const SFNT_Interface  class_ =  \
666   {                                      \
667     goto_table_,                         \
668     init_face_,                          \
669     load_face_,                          \
670     done_face_,                          \
671     get_interface_,                      \
672     load_any_,                           \
673     load_head_,                          \
674     load_hhea_,                          \
675     load_cmap_,                          \
676     load_maxp_,                          \
677     load_os2_,                           \
678     load_post_,                          \
679     load_name_,                          \
680     free_name_,                          \
681     load_kern_,                          \
682     load_gasp_,                          \
683     load_pclt_,                          \
684     load_bhed_,                          \
685     load_sbit_image_,                    \
686     get_psname_,                         \
687     free_psnames_,                       \
688     get_kerning_,                        \
689     load_font_dir_,                      \
690     load_hmtx_,                          \
691     load_eblc_,                          \
692     free_eblc_,                          \
693     set_sbit_strike_,                    \
694     load_strike_metrics_,                \
695     get_metrics_,                        \
696     get_name_,                           \
697     get_name_id_                         \
698   };
699 
700 #else /* FT_CONFIG_OPTION_PIC */
701 
702 #define FT_INTERNAL( a, a_ )  \
703           clazz->a = a_;
704 
705 #define FT_DEFINE_SFNT_INTERFACE(                       \
706           class_,                                       \
707           goto_table_,                                  \
708           init_face_,                                   \
709           load_face_,                                   \
710           done_face_,                                   \
711           get_interface_,                               \
712           load_any_,                                    \
713           load_head_,                                   \
714           load_hhea_,                                   \
715           load_cmap_,                                   \
716           load_maxp_,                                   \
717           load_os2_,                                    \
718           load_post_,                                   \
719           load_name_,                                   \
720           free_name_,                                   \
721           load_kern_,                                   \
722           load_gasp_,                                   \
723           load_pclt_,                                   \
724           load_bhed_,                                   \
725           load_sbit_image_,                             \
726           get_psname_,                                  \
727           free_psnames_,                                \
728           get_kerning_,                                 \
729           load_font_dir_,                               \
730           load_hmtx_,                                   \
731           load_eblc_,                                   \
732           free_eblc_,                                   \
733           set_sbit_strike_,                             \
734           load_strike_metrics_,                         \
735           get_metrics_,                                 \
736           get_name_,                                    \
737           get_name_id_ )                                \
738   void                                                  \
739   FT_Init_Class_ ## class_( FT_Library       library,   \
740                             SFNT_Interface*  clazz )    \
741   {                                                     \
742     FT_UNUSED( library );                               \
743                                                         \
744     clazz->goto_table          = goto_table_;           \
745     clazz->init_face           = init_face_;            \
746     clazz->load_face           = load_face_;            \
747     clazz->done_face           = done_face_;            \
748     clazz->get_interface       = get_interface_;        \
749     clazz->load_any            = load_any_;             \
750     clazz->load_head           = load_head_;            \
751     clazz->load_hhea           = load_hhea_;            \
752     clazz->load_cmap           = load_cmap_;            \
753     clazz->load_maxp           = load_maxp_;            \
754     clazz->load_os2            = load_os2_;             \
755     clazz->load_post           = load_post_;            \
756     clazz->load_name           = load_name_;            \
757     clazz->free_name           = free_name_;            \
758     clazz->load_kern           = load_kern_;            \
759     clazz->load_gasp           = load_gasp_;            \
760     clazz->load_pclt           = load_pclt_;            \
761     clazz->load_bhed           = load_bhed_;            \
762     clazz->load_sbit_image     = load_sbit_image_;      \
763     clazz->get_psname          = get_psname_;           \
764     clazz->free_psnames        = free_psnames_;         \
765     clazz->get_kerning         = get_kerning_;          \
766     clazz->load_font_dir       = load_font_dir_;        \
767     clazz->load_hmtx           = load_hmtx_;            \
768     clazz->load_eblc           = load_eblc_;            \
769     clazz->free_eblc           = free_eblc_;            \
770     clazz->set_sbit_strike     = set_sbit_strike_;      \
771     clazz->load_strike_metrics = load_strike_metrics_;  \
772     clazz->get_metrics         = get_metrics_;          \
773     clazz->get_name            = get_name_;             \
774     clazz->get_name_id         = get_name_id_;          \
775   }
776 
777 #endif /* FT_CONFIG_OPTION_PIC */
778 
779 FT_END_HEADER
780 
781 #endif /* SFNT_H_ */
782 
783 
784 /* END */
785