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