Home | History | Annotate | Download | only in internal
      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