Home | History | Annotate | Download | only in internal
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  psaux.h                                                                */
      4 /*                                                                         */
      5 /*    Auxiliary functions and data structures related to PostScript fonts  */
      6 /*    (specification).                                                     */
      7 /*                                                                         */
      8 /*  Copyright 1996-2018 by                                                 */
      9 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
     10 /*                                                                         */
     11 /*  This file is part of the FreeType project, and may only be used,       */
     12 /*  modified, and distributed under the terms of the FreeType project      */
     13 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     14 /*  this file you indicate that you have read the license and              */
     15 /*  understand and accept it fully.                                        */
     16 /*                                                                         */
     17 /***************************************************************************/
     18 
     19 
     20 #ifndef PSAUX_H_
     21 #define PSAUX_H_
     22 
     23 
     24 #include <ft2build.h>
     25 #include FT_INTERNAL_OBJECTS_H
     26 #include FT_INTERNAL_TYPE1_TYPES_H
     27 #include FT_INTERNAL_HASH_H
     28 #include FT_INTERNAL_TRUETYPE_TYPES_H
     29 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
     30 #include FT_INTERNAL_CFF_TYPES_H
     31 #include FT_INTERNAL_CFF_OBJECTS_TYPES_H
     32 
     33 
     34 
     35 FT_BEGIN_HEADER
     36 
     37 
     38   /***********************************************************************/
     39   /*                                                                     */
     40   /* PostScript modules driver class.                                    */
     41   /*                                                                     */
     42   typedef struct  PS_DriverRec_
     43   {
     44     FT_DriverRec  root;
     45 
     46     FT_UInt   hinting_engine;
     47     FT_Bool   no_stem_darkening;
     48     FT_Int    darken_params[8];
     49     FT_Int32  random_seed;
     50 
     51   } PS_DriverRec, *PS_Driver;
     52 
     53 
     54   /*************************************************************************/
     55   /*************************************************************************/
     56   /*****                                                               *****/
     57   /*****                             T1_TABLE                          *****/
     58   /*****                                                               *****/
     59   /*************************************************************************/
     60   /*************************************************************************/
     61 
     62 
     63   typedef struct PS_TableRec_*              PS_Table;
     64   typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
     65 
     66 
     67   /*************************************************************************/
     68   /*                                                                       */
     69   /* <Struct>                                                              */
     70   /*    PS_Table_FuncsRec                                                  */
     71   /*                                                                       */
     72   /* <Description>                                                         */
     73   /*    A set of function pointers to manage PS_Table objects.             */
     74   /*                                                                       */
     75   /* <Fields>                                                              */
     76   /*    table_init    :: Used to initialize a table.                       */
     77   /*                                                                       */
     78   /*    table_done    :: Finalizes resp. destroy a given table.            */
     79   /*                                                                       */
     80   /*    table_add     :: Adds a new object to a table.                     */
     81   /*                                                                       */
     82   /*    table_release :: Releases table data, then finalizes it.           */
     83   /*                                                                       */
     84   typedef struct  PS_Table_FuncsRec_
     85   {
     86     FT_Error
     87     (*init)( PS_Table   table,
     88              FT_Int     count,
     89              FT_Memory  memory );
     90 
     91     void
     92     (*done)( PS_Table  table );
     93 
     94     FT_Error
     95     (*add)( PS_Table  table,
     96             FT_Int    idx,
     97             void*     object,
     98             FT_UInt   length );
     99 
    100     void
    101     (*release)( PS_Table  table );
    102 
    103   } PS_Table_FuncsRec;
    104 
    105 
    106   /*************************************************************************/
    107   /*                                                                       */
    108   /* <Struct>                                                              */
    109   /*    PS_TableRec                                                        */
    110   /*                                                                       */
    111   /* <Description>                                                         */
    112   /*    A PS_Table is a simple object used to store an array of objects in */
    113   /*    a single memory block.                                             */
    114   /*                                                                       */
    115   /* <Fields>                                                              */
    116   /*    block     :: The address in memory of the growheap's block.  This  */
    117   /*                 can change between two object adds, due to            */
    118   /*                 reallocation.                                         */
    119   /*                                                                       */
    120   /*    cursor    :: The current top of the grow heap within its block.    */
    121   /*                                                                       */
    122   /*    capacity  :: The current size of the heap block.  Increments by    */
    123   /*                 1kByte chunks.                                        */
    124   /*                                                                       */
    125   /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
    126   /*                 been allocated.                                       */
    127   /*                                                                       */
    128   /*    max_elems :: The maximum number of elements in table.              */
    129   /*                                                                       */
    130   /*    num_elems :: The current number of elements in table.              */
    131   /*                                                                       */
    132   /*    elements  :: A table of element addresses within the block.        */
    133   /*                                                                       */
    134   /*    lengths   :: A table of element sizes within the block.            */
    135   /*                                                                       */
    136   /*    memory    :: The object used for memory operations                 */
    137   /*                 (alloc/realloc).                                      */
    138   /*                                                                       */
    139   /*    funcs     :: A table of method pointers for this object.           */
    140   /*                                                                       */
    141   typedef struct  PS_TableRec_
    142   {
    143     FT_Byte*           block;          /* current memory block           */
    144     FT_Offset          cursor;         /* current cursor in memory block */
    145     FT_Offset          capacity;       /* current size of memory block   */
    146     FT_ULong           init;
    147 
    148     FT_Int             max_elems;
    149     FT_Int             num_elems;
    150     FT_Byte**          elements;       /* addresses of table elements */
    151     FT_UInt*           lengths;        /* lengths of table elements   */
    152 
    153     FT_Memory          memory;
    154     PS_Table_FuncsRec  funcs;
    155 
    156   } PS_TableRec;
    157 
    158 
    159   /*************************************************************************/
    160   /*************************************************************************/
    161   /*****                                                               *****/
    162   /*****                       T1 FIELDS & TOKENS                      *****/
    163   /*****                                                               *****/
    164   /*************************************************************************/
    165   /*************************************************************************/
    166 
    167   typedef struct PS_ParserRec_*  PS_Parser;
    168 
    169   typedef struct T1_TokenRec_*   T1_Token;
    170 
    171   typedef struct T1_FieldRec_*   T1_Field;
    172 
    173 
    174   /* simple enumeration type used to identify token types */
    175   typedef enum  T1_TokenType_
    176   {
    177     T1_TOKEN_TYPE_NONE = 0,
    178     T1_TOKEN_TYPE_ANY,
    179     T1_TOKEN_TYPE_STRING,
    180     T1_TOKEN_TYPE_ARRAY,
    181     T1_TOKEN_TYPE_KEY, /* aka `name' */
    182 
    183     /* do not remove */
    184     T1_TOKEN_TYPE_MAX
    185 
    186   } T1_TokenType;
    187 
    188 
    189   /* a simple structure used to identify tokens */
    190   typedef struct  T1_TokenRec_
    191   {
    192     FT_Byte*      start;   /* first character of token in input stream */
    193     FT_Byte*      limit;   /* first character after the token          */
    194     T1_TokenType  type;    /* type of token                            */
    195 
    196   } T1_TokenRec;
    197 
    198 
    199   /* enumeration type used to identify object fields */
    200   typedef enum  T1_FieldType_
    201   {
    202     T1_FIELD_TYPE_NONE = 0,
    203     T1_FIELD_TYPE_BOOL,
    204     T1_FIELD_TYPE_INTEGER,
    205     T1_FIELD_TYPE_FIXED,
    206     T1_FIELD_TYPE_FIXED_1000,
    207     T1_FIELD_TYPE_STRING,
    208     T1_FIELD_TYPE_KEY,
    209     T1_FIELD_TYPE_BBOX,
    210     T1_FIELD_TYPE_MM_BBOX,
    211     T1_FIELD_TYPE_INTEGER_ARRAY,
    212     T1_FIELD_TYPE_FIXED_ARRAY,
    213     T1_FIELD_TYPE_CALLBACK,
    214 
    215     /* do not remove */
    216     T1_FIELD_TYPE_MAX
    217 
    218   } T1_FieldType;
    219 
    220 
    221   typedef enum  T1_FieldLocation_
    222   {
    223     T1_FIELD_LOCATION_CID_INFO,
    224     T1_FIELD_LOCATION_FONT_DICT,
    225     T1_FIELD_LOCATION_FONT_EXTRA,
    226     T1_FIELD_LOCATION_FONT_INFO,
    227     T1_FIELD_LOCATION_PRIVATE,
    228     T1_FIELD_LOCATION_BBOX,
    229     T1_FIELD_LOCATION_LOADER,
    230     T1_FIELD_LOCATION_FACE,
    231     T1_FIELD_LOCATION_BLEND,
    232 
    233     /* do not remove */
    234     T1_FIELD_LOCATION_MAX
    235 
    236   } T1_FieldLocation;
    237 
    238 
    239   typedef void
    240   (*T1_Field_ParseFunc)( FT_Face     face,
    241                          FT_Pointer  parser );
    242 
    243 
    244   /* structure type used to model object fields */
    245   typedef struct  T1_FieldRec_
    246   {
    247     const char*         ident;        /* field identifier               */
    248     T1_FieldLocation    location;
    249     T1_FieldType        type;         /* type of field                  */
    250     T1_Field_ParseFunc  reader;
    251     FT_UInt             offset;       /* offset of field in object      */
    252     FT_Byte             size;         /* size of field in bytes         */
    253     FT_UInt             array_max;    /* maximum number of elements for */
    254                                       /* array                          */
    255     FT_UInt             count_offset; /* offset of element count for    */
    256                                       /* arrays; must not be zero if in */
    257                                       /* use -- in other words, a       */
    258                                       /* `num_FOO' element must not     */
    259                                       /* start the used structure if we */
    260                                       /* parse a `FOO' array            */
    261     FT_UInt             dict;         /* where we expect it             */
    262   } T1_FieldRec;
    263 
    264 #define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
    265 #define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
    266 
    267 
    268 
    269 #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
    270           {                                                 \
    271             _ident, T1CODE, _type,                          \
    272             0,                                              \
    273             FT_FIELD_OFFSET( _fname ),                      \
    274             FT_FIELD_SIZE( _fname ),                        \
    275             0, 0,                                           \
    276             _dict                                           \
    277           },
    278 
    279 #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
    280           {                                             \
    281             _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
    282             (T1_Field_ParseFunc)_reader,                \
    283             0, 0,                                       \
    284             0, 0,                                       \
    285             _dict                                       \
    286           },
    287 
    288 #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
    289           {                                                      \
    290             _ident, T1CODE, _type,                               \
    291             0,                                                   \
    292             FT_FIELD_OFFSET( _fname ),                           \
    293             FT_FIELD_SIZE_DELTA( _fname ),                       \
    294             _max,                                                \
    295             FT_FIELD_OFFSET( num_ ## _fname ),                   \
    296             _dict                                                \
    297           },
    298 
    299 #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
    300           {                                                       \
    301             _ident, T1CODE, _type,                                \
    302             0,                                                    \
    303             FT_FIELD_OFFSET( _fname ),                            \
    304             FT_FIELD_SIZE_DELTA( _fname ),                        \
    305             _max, 0,                                              \
    306             _dict                                                 \
    307           },
    308 
    309 
    310 #define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
    311           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
    312 
    313 #define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
    314           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
    315 
    316 #define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
    317           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
    318 
    319 #define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
    320           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
    321                                _dict )
    322 
    323 #define T1_FIELD_STRING( _ident, _fname, _dict )                             \
    324           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
    325 
    326 #define T1_FIELD_KEY( _ident, _fname, _dict )                             \
    327           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
    328 
    329 #define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
    330           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
    331 
    332 
    333 #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
    334           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
    335                               _fname, _fmax, _dict )
    336 
    337 #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
    338           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
    339                               _fname, _fmax, _dict )
    340 
    341 #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
    342           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
    343                                _fname, _fmax, _dict )
    344 
    345 #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
    346           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
    347                                _fname, _fmax, _dict )
    348 
    349 #define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
    350           T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
    351 
    352 
    353   /*************************************************************************/
    354   /*************************************************************************/
    355   /*****                                                               *****/
    356   /*****                            T1 PARSER                          *****/
    357   /*****                                                               *****/
    358   /*************************************************************************/
    359   /*************************************************************************/
    360 
    361   typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
    362 
    363   typedef struct  PS_Parser_FuncsRec_
    364   {
    365     void
    366     (*init)( PS_Parser  parser,
    367              FT_Byte*   base,
    368              FT_Byte*   limit,
    369              FT_Memory  memory );
    370 
    371     void
    372     (*done)( PS_Parser  parser );
    373 
    374     void
    375     (*skip_spaces)( PS_Parser  parser );
    376     void
    377     (*skip_PS_token)( PS_Parser  parser );
    378 
    379     FT_Long
    380     (*to_int)( PS_Parser  parser );
    381     FT_Fixed
    382     (*to_fixed)( PS_Parser  parser,
    383                  FT_Int     power_ten );
    384 
    385     FT_Error
    386     (*to_bytes)( PS_Parser  parser,
    387                  FT_Byte*   bytes,
    388                  FT_Offset  max_bytes,
    389                  FT_ULong*  pnum_bytes,
    390                  FT_Bool    delimiters );
    391 
    392     FT_Int
    393     (*to_coord_array)( PS_Parser  parser,
    394                        FT_Int     max_coords,
    395                        FT_Short*  coords );
    396     FT_Int
    397     (*to_fixed_array)( PS_Parser  parser,
    398                        FT_Int     max_values,
    399                        FT_Fixed*  values,
    400                        FT_Int     power_ten );
    401 
    402     void
    403     (*to_token)( PS_Parser  parser,
    404                  T1_Token   token );
    405     void
    406     (*to_token_array)( PS_Parser  parser,
    407                        T1_Token   tokens,
    408                        FT_UInt    max_tokens,
    409                        FT_Int*    pnum_tokens );
    410 
    411     FT_Error
    412     (*load_field)( PS_Parser       parser,
    413                    const T1_Field  field,
    414                    void**          objects,
    415                    FT_UInt         max_objects,
    416                    FT_ULong*       pflags );
    417 
    418     FT_Error
    419     (*load_field_table)( PS_Parser       parser,
    420                          const T1_Field  field,
    421                          void**          objects,
    422                          FT_UInt         max_objects,
    423                          FT_ULong*       pflags );
    424 
    425   } PS_Parser_FuncsRec;
    426 
    427 
    428   /*************************************************************************/
    429   /*                                                                       */
    430   /* <Struct>                                                              */
    431   /*    PS_ParserRec                                                       */
    432   /*                                                                       */
    433   /* <Description>                                                         */
    434   /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
    435   /*                                                                       */
    436   /* <Fields>                                                              */
    437   /*    cursor :: The current position in the text.                        */
    438   /*                                                                       */
    439   /*    base   :: Start of the processed text.                             */
    440   /*                                                                       */
    441   /*    limit  :: End of the processed text.                               */
    442   /*                                                                       */
    443   /*    error  :: The last error returned.                                 */
    444   /*                                                                       */
    445   /*    memory :: The object used for memory operations (alloc/realloc).   */
    446   /*                                                                       */
    447   /*    funcs  :: A table of functions for the parser.                     */
    448   /*                                                                       */
    449   typedef struct  PS_ParserRec_
    450   {
    451     FT_Byte*   cursor;
    452     FT_Byte*   base;
    453     FT_Byte*   limit;
    454     FT_Error   error;
    455     FT_Memory  memory;
    456 
    457     PS_Parser_FuncsRec  funcs;
    458 
    459   } PS_ParserRec;
    460 
    461 
    462   /*************************************************************************/
    463   /*************************************************************************/
    464   /*****                                                               *****/
    465   /*****                         PS BUILDER                            *****/
    466   /*****                                                               *****/
    467   /*************************************************************************/
    468   /*************************************************************************/
    469 
    470 
    471   typedef struct PS_Builder_  PS_Builder;
    472   typedef const struct PS_Builder_FuncsRec_*  PS_Builder_Funcs;
    473 
    474   typedef struct  PS_Builder_FuncsRec_
    475   {
    476     void
    477     (*init)( PS_Builder*  ps_builder,
    478              void*        builder,
    479              FT_Bool      is_t1 );
    480 
    481     void
    482     (*done)( PS_Builder*  builder );
    483 
    484   } PS_Builder_FuncsRec;
    485 
    486 
    487   /*************************************************************************/
    488   /*                                                                       */
    489   /* <Structure>                                                           */
    490   /*    PS_Builder                                                         */
    491   /*                                                                       */
    492   /* <Description>                                                         */
    493   /*     A structure used during glyph loading to store its outline.       */
    494   /*                                                                       */
    495   /* <Fields>                                                              */
    496   /*    memory       :: The current memory object.                         */
    497   /*                                                                       */
    498   /*    face         :: The current face object.                           */
    499   /*                                                                       */
    500   /*    glyph        :: The current glyph slot.                            */
    501   /*                                                                       */
    502   /*    loader       :: XXX                                                */
    503   /*                                                                       */
    504   /*    base         :: The base glyph outline.                            */
    505   /*                                                                       */
    506   /*    current      :: The current glyph outline.                         */
    507   /*                                                                       */
    508   /*    pos_x        :: The horizontal translation (if composite glyph).   */
    509   /*                                                                       */
    510   /*    pos_y        :: The vertical translation (if composite glyph).     */
    511   /*                                                                       */
    512   /*    left_bearing :: The left side bearing point.                       */
    513   /*                                                                       */
    514   /*    advance      :: The horizontal advance vector.                     */
    515   /*                                                                       */
    516   /*    bbox         :: Unused.                                            */
    517   /*                                                                       */
    518   /*    path_begun   :: A flag which indicates that a new path has begun.  */
    519   /*                                                                       */
    520   /*    load_points  :: If this flag is not set, no points are loaded.     */
    521   /*                                                                       */
    522   /*    no_recurse   :: Set but not used.                                  */
    523   /*                                                                       */
    524   /*    metrics_only :: A boolean indicating that we only want to compute  */
    525   /*                    the metrics of a given glyph, not load all of its  */
    526   /*                    points.                                            */
    527   /*                                                                       */
    528   /*    is_t1        :: Set if current font type is Type 1.                */
    529   /*                                                                       */
    530   /*    funcs        :: An array of function pointers for the builder.     */
    531   /*                                                                       */
    532   struct  PS_Builder_
    533   {
    534     FT_Memory       memory;
    535     FT_Face         face;
    536     CFF_GlyphSlot   glyph;
    537     FT_GlyphLoader  loader;
    538     FT_Outline*     base;
    539     FT_Outline*     current;
    540 
    541     FT_Pos*  pos_x;
    542     FT_Pos*  pos_y;
    543 
    544     FT_Vector*  left_bearing;
    545     FT_Vector*  advance;
    546 
    547     FT_BBox*  bbox;          /* bounding box */
    548     FT_Bool   path_begun;
    549     FT_Bool   load_points;
    550     FT_Bool   no_recurse;
    551 
    552     FT_Bool  metrics_only;
    553     FT_Bool  is_t1;
    554 
    555     PS_Builder_FuncsRec  funcs;
    556 
    557   };
    558 
    559 
    560   /*************************************************************************/
    561   /*************************************************************************/
    562   /*****                                                               *****/
    563   /*****                            PS DECODER                         *****/
    564   /*****                                                               *****/
    565   /*************************************************************************/
    566   /*************************************************************************/
    567 
    568 #define PS_MAX_OPERANDS        48
    569 #define PS_MAX_SUBRS_CALLS     16   /* maximum subroutine nesting;         */
    570                                     /* only 10 are allowed but there exist */
    571                                     /* fonts like `HiraKakuProN-W3.ttf'    */
    572                                     /* (Hiragino Kaku Gothic ProN W3;      */
    573                                     /* 8.2d6e1; 2014-12-19) that exceed    */
    574                                     /* this limit                          */
    575 
    576   /* execution context charstring zone */
    577 
    578   typedef struct  PS_Decoder_Zone_
    579   {
    580     FT_Byte*  base;
    581     FT_Byte*  limit;
    582     FT_Byte*  cursor;
    583 
    584   } PS_Decoder_Zone;
    585 
    586 
    587   typedef FT_Error
    588   (*CFF_Decoder_Get_Glyph_Callback)( TT_Face    face,
    589                                      FT_UInt    glyph_index,
    590                                      FT_Byte**  pointer,
    591                                      FT_ULong*  length );
    592 
    593   typedef void
    594   (*CFF_Decoder_Free_Glyph_Callback)( TT_Face    face,
    595                                       FT_Byte**  pointer,
    596                                       FT_ULong   length );
    597 
    598 
    599   typedef struct  PS_Decoder_
    600   {
    601     PS_Builder  builder;
    602 
    603     FT_Fixed   stack[PS_MAX_OPERANDS + 1];
    604     FT_Fixed*  top;
    605 
    606     PS_Decoder_Zone   zones[PS_MAX_SUBRS_CALLS + 1];
    607     PS_Decoder_Zone*  zone;
    608 
    609     FT_Int     flex_state;
    610     FT_Int     num_flex_vectors;
    611     FT_Vector  flex_vectors[7];
    612 
    613     CFF_Font     cff;
    614     CFF_SubFont  current_subfont; /* for current glyph_index */
    615     FT_Generic*  cf2_instance;
    616 
    617     FT_Pos*  glyph_width;
    618     FT_Bool  width_only;
    619     FT_Int   num_hints;
    620 
    621     FT_UInt  num_locals;
    622     FT_UInt  num_globals;
    623 
    624     FT_Int  locals_bias;
    625     FT_Int  globals_bias;
    626 
    627     FT_Byte**  locals;
    628     FT_Byte**  globals;
    629 
    630     FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
    631     FT_UInt    num_glyphs;    /* number of glyphs in font */
    632 
    633     FT_Render_Mode  hint_mode;
    634 
    635     FT_Bool  seac;
    636 
    637     CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
    638     CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
    639 
    640     /* Type 1 stuff */
    641     FT_Service_PsCMaps  psnames;      /* for seac */
    642 
    643     FT_Int    lenIV;         /* internal for sub routine calls   */
    644     FT_UInt*  locals_len;    /* array of subrs length (optional) */
    645     FT_Hash   locals_hash;   /* used if `num_subrs' was massaged */
    646 
    647     FT_Matrix  font_matrix;
    648     FT_Vector  font_offset;
    649 
    650     PS_Blend  blend;         /* for multiple master support */
    651 
    652     FT_Long*  buildchar;
    653     FT_UInt   len_buildchar;
    654 
    655   } PS_Decoder;
    656 
    657 
    658   /*************************************************************************/
    659   /*************************************************************************/
    660   /*****                                                               *****/
    661   /*****                         T1 BUILDER                            *****/
    662   /*****                                                               *****/
    663   /*************************************************************************/
    664   /*************************************************************************/
    665 
    666 
    667   typedef struct T1_BuilderRec_*  T1_Builder;
    668 
    669 
    670   typedef FT_Error
    671   (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
    672                                    FT_Int      count );
    673 
    674   typedef void
    675   (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
    676                                 FT_Pos      x,
    677                                 FT_Pos      y,
    678                                 FT_Byte     flag );
    679 
    680   typedef FT_Error
    681   (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
    682                                  FT_Pos      x,
    683                                  FT_Pos      y );
    684 
    685   typedef FT_Error
    686   (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
    687 
    688   typedef FT_Error
    689   (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
    690                                   FT_Pos      x,
    691                                   FT_Pos      y );
    692 
    693   typedef void
    694   (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
    695 
    696 
    697   typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
    698 
    699   typedef struct  T1_Builder_FuncsRec_
    700   {
    701     void
    702     (*init)( T1_Builder    builder,
    703              FT_Face       face,
    704              FT_Size       size,
    705              FT_GlyphSlot  slot,
    706              FT_Bool       hinting );
    707 
    708     void
    709     (*done)( T1_Builder   builder );
    710 
    711     T1_Builder_Check_Points_Func   check_points;
    712     T1_Builder_Add_Point_Func      add_point;
    713     T1_Builder_Add_Point1_Func     add_point1;
    714     T1_Builder_Add_Contour_Func    add_contour;
    715     T1_Builder_Start_Point_Func    start_point;
    716     T1_Builder_Close_Contour_Func  close_contour;
    717 
    718   } T1_Builder_FuncsRec;
    719 
    720 
    721   /* an enumeration type to handle charstring parsing states */
    722   typedef enum  T1_ParseState_
    723   {
    724     T1_Parse_Start,
    725     T1_Parse_Have_Width,
    726     T1_Parse_Have_Moveto,
    727     T1_Parse_Have_Path
    728 
    729   } T1_ParseState;
    730 
    731 
    732   /*************************************************************************/
    733   /*                                                                       */
    734   /* <Structure>                                                           */
    735   /*    T1_BuilderRec                                                      */
    736   /*                                                                       */
    737   /* <Description>                                                         */
    738   /*     A structure used during glyph loading to store its outline.       */
    739   /*                                                                       */
    740   /* <Fields>                                                              */
    741   /*    memory       :: The current memory object.                         */
    742   /*                                                                       */
    743   /*    face         :: The current face object.                           */
    744   /*                                                                       */
    745   /*    glyph        :: The current glyph slot.                            */
    746   /*                                                                       */
    747   /*    loader       :: XXX                                                */
    748   /*                                                                       */
    749   /*    base         :: The base glyph outline.                            */
    750   /*                                                                       */
    751   /*    current      :: The current glyph outline.                         */
    752   /*                                                                       */
    753   /*    max_points   :: maximum points in builder outline                  */
    754   /*                                                                       */
    755   /*    max_contours :: Maximum number of contours in builder outline.     */
    756   /*                                                                       */
    757   /*    pos_x        :: The horizontal translation (if composite glyph).   */
    758   /*                                                                       */
    759   /*    pos_y        :: The vertical translation (if composite glyph).     */
    760   /*                                                                       */
    761   /*    left_bearing :: The left side bearing point.                       */
    762   /*                                                                       */
    763   /*    advance      :: The horizontal advance vector.                     */
    764   /*                                                                       */
    765   /*    bbox         :: Unused.                                            */
    766   /*                                                                       */
    767   /*    parse_state  :: An enumeration which controls the charstring       */
    768   /*                    parsing state.                                     */
    769   /*                                                                       */
    770   /*    load_points  :: If this flag is not set, no points are loaded.     */
    771   /*                                                                       */
    772   /*    no_recurse   :: Set but not used.                                  */
    773   /*                                                                       */
    774   /*    metrics_only :: A boolean indicating that we only want to compute  */
    775   /*                    the metrics of a given glyph, not load all of its  */
    776   /*                    points.                                            */
    777   /*                                                                       */
    778   /*    funcs        :: An array of function pointers for the builder.     */
    779   /*                                                                       */
    780   typedef struct  T1_BuilderRec_
    781   {
    782     FT_Memory       memory;
    783     FT_Face         face;
    784     FT_GlyphSlot    glyph;
    785     FT_GlyphLoader  loader;
    786     FT_Outline*     base;
    787     FT_Outline*     current;
    788 
    789     FT_Pos          pos_x;
    790     FT_Pos          pos_y;
    791 
    792     FT_Vector       left_bearing;
    793     FT_Vector       advance;
    794 
    795     FT_BBox         bbox;          /* bounding box */
    796     T1_ParseState   parse_state;
    797     FT_Bool         load_points;
    798     FT_Bool         no_recurse;
    799 
    800     FT_Bool         metrics_only;
    801 
    802     void*           hints_funcs;    /* hinter-specific */
    803     void*           hints_globals;  /* hinter-specific */
    804 
    805     T1_Builder_FuncsRec  funcs;
    806 
    807   } T1_BuilderRec;
    808 
    809 
    810   /*************************************************************************/
    811   /*************************************************************************/
    812   /*****                                                               *****/
    813   /*****                         T1 DECODER                            *****/
    814   /*****                                                               *****/
    815   /*************************************************************************/
    816   /*************************************************************************/
    817 
    818 #if 0
    819 
    820   /*************************************************************************/
    821   /*                                                                       */
    822   /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
    823   /* calls during glyph loading.                                           */
    824   /*                                                                       */
    825 #define T1_MAX_SUBRS_CALLS  8
    826 
    827 
    828   /*************************************************************************/
    829   /*                                                                       */
    830   /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
    831   /* minimum of 16 is required.                                            */
    832   /*                                                                       */
    833 #define T1_MAX_CHARSTRINGS_OPERANDS  32
    834 
    835 #endif /* 0 */
    836 
    837 
    838   typedef struct  T1_Decoder_ZoneRec_
    839   {
    840     FT_Byte*  cursor;
    841     FT_Byte*  base;
    842     FT_Byte*  limit;
    843 
    844   } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
    845 
    846 
    847   typedef struct T1_DecoderRec_*              T1_Decoder;
    848   typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
    849 
    850 
    851   typedef FT_Error
    852   (*T1_Decoder_Callback)( T1_Decoder  decoder,
    853                           FT_UInt     glyph_index );
    854 
    855 
    856   typedef struct  T1_Decoder_FuncsRec_
    857   {
    858     FT_Error
    859     (*init)( T1_Decoder           decoder,
    860              FT_Face              face,
    861              FT_Size              size,
    862              FT_GlyphSlot         slot,
    863              FT_Byte**            glyph_names,
    864              PS_Blend             blend,
    865              FT_Bool              hinting,
    866              FT_Render_Mode       hint_mode,
    867              T1_Decoder_Callback  callback );
    868 
    869     void
    870     (*done)( T1_Decoder  decoder );
    871 
    872 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
    873     FT_Error
    874     (*parse_charstrings_old)( T1_Decoder  decoder,
    875                               FT_Byte*    base,
    876                               FT_UInt     len );
    877 #else
    878     FT_Error
    879     (*parse_metrics)( T1_Decoder  decoder,
    880                       FT_Byte*    base,
    881                       FT_UInt     len );
    882 #endif
    883 
    884     FT_Error
    885     (*parse_charstrings)( PS_Decoder*  decoder,
    886                           FT_Byte*     charstring_base,
    887                           FT_ULong     charstring_len );
    888 
    889 
    890   } T1_Decoder_FuncsRec;
    891 
    892 
    893   typedef struct  T1_DecoderRec_
    894   {
    895     T1_BuilderRec        builder;
    896 
    897     FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
    898     FT_Long*             top;
    899 
    900     T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
    901     T1_Decoder_Zone      zone;
    902 
    903     FT_Service_PsCMaps   psnames;      /* for seac */
    904     FT_UInt              num_glyphs;
    905     FT_Byte**            glyph_names;
    906 
    907     FT_Int               lenIV;        /* internal for sub routine calls */
    908     FT_Int               num_subrs;
    909     FT_Byte**            subrs;
    910     FT_UInt*             subrs_len;    /* array of subrs length (optional) */
    911     FT_Hash              subrs_hash;   /* used if `num_subrs' was massaged */
    912 
    913     FT_Matrix            font_matrix;
    914     FT_Vector            font_offset;
    915 
    916     FT_Int               flex_state;
    917     FT_Int               num_flex_vectors;
    918     FT_Vector            flex_vectors[7];
    919 
    920     PS_Blend             blend;       /* for multiple master support */
    921 
    922     FT_Render_Mode       hint_mode;
    923 
    924     T1_Decoder_Callback  parse_callback;
    925     T1_Decoder_FuncsRec  funcs;
    926 
    927     FT_Long*             buildchar;
    928     FT_UInt              len_buildchar;
    929 
    930     FT_Bool              seac;
    931 
    932     FT_Generic           cf2_instance;
    933 
    934   } T1_DecoderRec;
    935 
    936 
    937   /*************************************************************************/
    938   /*************************************************************************/
    939   /*****                                                               *****/
    940   /*****                        CFF BUILDER                            *****/
    941   /*****                                                               *****/
    942   /*************************************************************************/
    943   /*************************************************************************/
    944 
    945 
    946   typedef struct CFF_Builder_  CFF_Builder;
    947 
    948 
    949   typedef FT_Error
    950   (*CFF_Builder_Check_Points_Func)( CFF_Builder*  builder,
    951                                     FT_Int        count );
    952 
    953   typedef void
    954   (*CFF_Builder_Add_Point_Func)( CFF_Builder*  builder,
    955                                  FT_Pos        x,
    956                                  FT_Pos        y,
    957                                  FT_Byte       flag );
    958   typedef FT_Error
    959   (*CFF_Builder_Add_Point1_Func)( CFF_Builder*  builder,
    960                                   FT_Pos        x,
    961                                   FT_Pos        y );
    962   typedef FT_Error
    963   (*CFF_Builder_Start_Point_Func)( CFF_Builder*  builder,
    964                                    FT_Pos        x,
    965                                    FT_Pos        y );
    966   typedef void
    967   (*CFF_Builder_Close_Contour_Func)( CFF_Builder*  builder );
    968 
    969   typedef FT_Error
    970   (*CFF_Builder_Add_Contour_Func)( CFF_Builder*  builder );
    971 
    972   typedef const struct CFF_Builder_FuncsRec_*  CFF_Builder_Funcs;
    973 
    974   typedef struct  CFF_Builder_FuncsRec_
    975   {
    976     void
    977     (*init)( CFF_Builder*   builder,
    978              TT_Face        face,
    979              CFF_Size       size,
    980              CFF_GlyphSlot  glyph,
    981              FT_Bool        hinting );
    982 
    983     void
    984     (*done)( CFF_Builder*  builder );
    985 
    986     CFF_Builder_Check_Points_Func   check_points;
    987     CFF_Builder_Add_Point_Func      add_point;
    988     CFF_Builder_Add_Point1_Func     add_point1;
    989     CFF_Builder_Add_Contour_Func    add_contour;
    990     CFF_Builder_Start_Point_Func    start_point;
    991     CFF_Builder_Close_Contour_Func  close_contour;
    992 
    993   } CFF_Builder_FuncsRec;
    994 
    995 
    996   /*************************************************************************/
    997   /*                                                                       */
    998   /* <Structure>                                                           */
    999   /*    CFF_Builder                                                        */
   1000   /*                                                                       */
   1001   /* <Description>                                                         */
   1002   /*     A structure used during glyph loading to store its outline.       */
   1003   /*                                                                       */
   1004   /* <Fields>                                                              */
   1005   /*    memory        :: The current memory object.                        */
   1006   /*                                                                       */
   1007   /*    face          :: The current face object.                          */
   1008   /*                                                                       */
   1009   /*    glyph         :: The current glyph slot.                           */
   1010   /*                                                                       */
   1011   /*    loader        :: The current glyph loader.                         */
   1012   /*                                                                       */
   1013   /*    base          :: The base glyph outline.                           */
   1014   /*                                                                       */
   1015   /*    current       :: The current glyph outline.                        */
   1016   /*                                                                       */
   1017   /*    pos_x         :: The horizontal translation (if composite glyph).  */
   1018   /*                                                                       */
   1019   /*    pos_y         :: The vertical translation (if composite glyph).    */
   1020   /*                                                                       */
   1021   /*    left_bearing  :: The left side bearing point.                      */
   1022   /*                                                                       */
   1023   /*    advance       :: The horizontal advance vector.                    */
   1024   /*                                                                       */
   1025   /*    bbox          :: Unused.                                           */
   1026   /*                                                                       */
   1027   /*    path_begun    :: A flag which indicates that a new path has begun. */
   1028   /*                                                                       */
   1029   /*    load_points   :: If this flag is not set, no points are loaded.    */
   1030   /*                                                                       */
   1031   /*    no_recurse    :: Set but not used.                                 */
   1032   /*                                                                       */
   1033   /*    metrics_only  :: A boolean indicating that we only want to compute */
   1034   /*                     the metrics of a given glyph, not load all of its */
   1035   /*                     points.                                           */
   1036   /*                                                                       */
   1037   /*    hints_funcs   :: Auxiliary pointer for hinting.                    */
   1038   /*                                                                       */
   1039   /*    hints_globals :: Auxiliary pointer for hinting.                    */
   1040   /*                                                                       */
   1041   /*    funcs         :: A table of method pointers for this object.       */
   1042   /*                                                                       */
   1043   struct  CFF_Builder_
   1044   {
   1045     FT_Memory       memory;
   1046     TT_Face         face;
   1047     CFF_GlyphSlot   glyph;
   1048     FT_GlyphLoader  loader;
   1049     FT_Outline*     base;
   1050     FT_Outline*     current;
   1051 
   1052     FT_Pos  pos_x;
   1053     FT_Pos  pos_y;
   1054 
   1055     FT_Vector  left_bearing;
   1056     FT_Vector  advance;
   1057 
   1058     FT_BBox  bbox;          /* bounding box */
   1059 
   1060     FT_Bool  path_begun;
   1061     FT_Bool  load_points;
   1062     FT_Bool  no_recurse;
   1063 
   1064     FT_Bool  metrics_only;
   1065 
   1066     void*  hints_funcs;     /* hinter-specific */
   1067     void*  hints_globals;   /* hinter-specific */
   1068 
   1069     CFF_Builder_FuncsRec  funcs;
   1070   };
   1071 
   1072 
   1073   /*************************************************************************/
   1074   /*************************************************************************/
   1075   /*****                                                               *****/
   1076   /*****                        CFF DECODER                            *****/
   1077   /*****                                                               *****/
   1078   /*************************************************************************/
   1079   /*************************************************************************/
   1080 
   1081 
   1082 #define CFF_MAX_OPERANDS        48
   1083 #define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
   1084                                     /* only 10 are allowed but there exist */
   1085                                     /* fonts like `HiraKakuProN-W3.ttf'    */
   1086                                     /* (Hiragino Kaku Gothic ProN W3;      */
   1087                                     /* 8.2d6e1; 2014-12-19) that exceed    */
   1088                                     /* this limit                          */
   1089 #define CFF_MAX_TRANS_ELEMENTS  32
   1090 
   1091   /* execution context charstring zone */
   1092 
   1093   typedef struct  CFF_Decoder_Zone_
   1094   {
   1095     FT_Byte*  base;
   1096     FT_Byte*  limit;
   1097     FT_Byte*  cursor;
   1098 
   1099   } CFF_Decoder_Zone;
   1100 
   1101 
   1102   typedef struct  CFF_Decoder_
   1103   {
   1104     CFF_Builder  builder;
   1105     CFF_Font     cff;
   1106 
   1107     FT_Fixed   stack[CFF_MAX_OPERANDS + 1];
   1108     FT_Fixed*  top;
   1109 
   1110     CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
   1111     CFF_Decoder_Zone*  zone;
   1112 
   1113     FT_Int     flex_state;
   1114     FT_Int     num_flex_vectors;
   1115     FT_Vector  flex_vectors[7];
   1116 
   1117     FT_Pos  glyph_width;
   1118     FT_Pos  nominal_width;
   1119 
   1120     FT_Bool   read_width;
   1121     FT_Bool   width_only;
   1122     FT_Int    num_hints;
   1123     FT_Fixed  buildchar[CFF_MAX_TRANS_ELEMENTS];
   1124 
   1125     FT_UInt  num_locals;
   1126     FT_UInt  num_globals;
   1127 
   1128     FT_Int  locals_bias;
   1129     FT_Int  globals_bias;
   1130 
   1131     FT_Byte**  locals;
   1132     FT_Byte**  globals;
   1133 
   1134     FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
   1135     FT_UInt    num_glyphs;    /* number of glyphs in font */
   1136 
   1137     FT_Render_Mode  hint_mode;
   1138 
   1139     FT_Bool  seac;
   1140 
   1141     CFF_SubFont  current_subfont; /* for current glyph_index */
   1142 
   1143     CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
   1144     CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
   1145 
   1146   } CFF_Decoder;
   1147 
   1148 
   1149   typedef const struct CFF_Decoder_FuncsRec_*  CFF_Decoder_Funcs;
   1150 
   1151   typedef struct  CFF_Decoder_FuncsRec_
   1152   {
   1153     void
   1154     (*init)( CFF_Decoder*                     decoder,
   1155              TT_Face                          face,
   1156              CFF_Size                         size,
   1157              CFF_GlyphSlot                    slot,
   1158              FT_Bool                          hinting,
   1159              FT_Render_Mode                   hint_mode,
   1160              CFF_Decoder_Get_Glyph_Callback   get_callback,
   1161              CFF_Decoder_Free_Glyph_Callback  free_callback );
   1162 
   1163     FT_Error
   1164     (*prepare)( CFF_Decoder*  decoder,
   1165                 CFF_Size      size,
   1166                 FT_UInt       glyph_index );
   1167 
   1168 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
   1169     FT_Error
   1170     (*parse_charstrings_old)( CFF_Decoder*  decoder,
   1171                               FT_Byte*      charstring_base,
   1172                               FT_ULong      charstring_len,
   1173                               FT_Bool       in_dict );
   1174 #endif
   1175 
   1176     FT_Error
   1177     (*parse_charstrings)( PS_Decoder*  decoder,
   1178                           FT_Byte*     charstring_base,
   1179                           FT_ULong     charstring_len );
   1180 
   1181   } CFF_Decoder_FuncsRec;
   1182 
   1183 
   1184   /*************************************************************************/
   1185   /*************************************************************************/
   1186   /*****                                                               *****/
   1187   /*****                            AFM PARSER                         *****/
   1188   /*****                                                               *****/
   1189   /*************************************************************************/
   1190   /*************************************************************************/
   1191 
   1192   typedef struct AFM_ParserRec_*  AFM_Parser;
   1193 
   1194   typedef struct  AFM_Parser_FuncsRec_
   1195   {
   1196     FT_Error
   1197     (*init)( AFM_Parser  parser,
   1198              FT_Memory   memory,
   1199              FT_Byte*    base,
   1200              FT_Byte*    limit );
   1201 
   1202     void
   1203     (*done)( AFM_Parser  parser );
   1204 
   1205     FT_Error
   1206     (*parse)( AFM_Parser  parser );
   1207 
   1208   } AFM_Parser_FuncsRec;
   1209 
   1210 
   1211   typedef struct AFM_StreamRec_*  AFM_Stream;
   1212 
   1213 
   1214   /*************************************************************************/
   1215   /*                                                                       */
   1216   /* <Struct>                                                              */
   1217   /*    AFM_ParserRec                                                      */
   1218   /*                                                                       */
   1219   /* <Description>                                                         */
   1220   /*    An AFM_Parser is a parser for the AFM files.                       */
   1221   /*                                                                       */
   1222   /* <Fields>                                                              */
   1223   /*    memory    :: The object used for memory operations (alloc and      */
   1224   /*                 realloc).                                             */
   1225   /*                                                                       */
   1226   /*    stream    :: This is an opaque object.                             */
   1227   /*                                                                       */
   1228   /*    FontInfo  :: The result will be stored here.                       */
   1229   /*                                                                       */
   1230   /*    get_index :: A user provided function to get a glyph index by its  */
   1231   /*                 name.                                                 */
   1232   /*                                                                       */
   1233   typedef struct  AFM_ParserRec_
   1234   {
   1235     FT_Memory     memory;
   1236     AFM_Stream    stream;
   1237 
   1238     AFM_FontInfo  FontInfo;
   1239 
   1240     FT_Int
   1241     (*get_index)( const char*  name,
   1242                   FT_Offset    len,
   1243                   void*        user_data );
   1244 
   1245     void*         user_data;
   1246 
   1247   } AFM_ParserRec;
   1248 
   1249 
   1250   /*************************************************************************/
   1251   /*************************************************************************/
   1252   /*****                                                               *****/
   1253   /*****                     TYPE1 CHARMAPS                            *****/
   1254   /*****                                                               *****/
   1255   /*************************************************************************/
   1256   /*************************************************************************/
   1257 
   1258   typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
   1259 
   1260   typedef struct T1_CMap_ClassesRec_
   1261   {
   1262     FT_CMap_Class  standard;
   1263     FT_CMap_Class  expert;
   1264     FT_CMap_Class  custom;
   1265     FT_CMap_Class  unicode;
   1266 
   1267   } T1_CMap_ClassesRec;
   1268 
   1269 
   1270   /*************************************************************************/
   1271   /*************************************************************************/
   1272   /*****                                                               *****/
   1273   /*****                        PSAux Module Interface                 *****/
   1274   /*****                                                               *****/
   1275   /*************************************************************************/
   1276   /*************************************************************************/
   1277 
   1278   typedef struct  PSAux_ServiceRec_
   1279   {
   1280     /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
   1281     const PS_Table_FuncsRec*    ps_table_funcs;
   1282     const PS_Parser_FuncsRec*   ps_parser_funcs;
   1283     const T1_Builder_FuncsRec*  t1_builder_funcs;
   1284     const T1_Decoder_FuncsRec*  t1_decoder_funcs;
   1285 
   1286     void
   1287     (*t1_decrypt)( FT_Byte*   buffer,
   1288                    FT_Offset  length,
   1289                    FT_UShort  seed );
   1290 
   1291     FT_UInt32
   1292     (*cff_random)( FT_UInt32  r );
   1293 
   1294     void
   1295     (*ps_decoder_init)( PS_Decoder*  ps_decoder,
   1296                         void*        decoder,
   1297                         FT_Bool      is_t1 );
   1298 
   1299     void
   1300     (*t1_make_subfont)( FT_Face      face,
   1301                         PS_Private   priv,
   1302                         CFF_SubFont  subfont );
   1303 
   1304     T1_CMap_Classes  t1_cmap_classes;
   1305 
   1306     /* fields after this comment line were added after version 2.1.10 */
   1307     const AFM_Parser_FuncsRec*  afm_parser_funcs;
   1308 
   1309     const CFF_Decoder_FuncsRec*  cff_decoder_funcs;
   1310 
   1311   } PSAux_ServiceRec, *PSAux_Service;
   1312 
   1313   /* backward compatible type definition */
   1314   typedef PSAux_ServiceRec   PSAux_Interface;
   1315 
   1316 
   1317   /*************************************************************************/
   1318   /*************************************************************************/
   1319   /*****                                                               *****/
   1320   /*****                 Some convenience functions                    *****/
   1321   /*****                                                               *****/
   1322   /*************************************************************************/
   1323   /*************************************************************************/
   1324 
   1325 #define IS_PS_NEWLINE( ch ) \
   1326   ( (ch) == '\r' ||         \
   1327     (ch) == '\n' )
   1328 
   1329 #define IS_PS_SPACE( ch )  \
   1330   ( (ch) == ' '         || \
   1331     IS_PS_NEWLINE( ch ) || \
   1332     (ch) == '\t'        || \
   1333     (ch) == '\f'        || \
   1334     (ch) == '\0' )
   1335 
   1336 #define IS_PS_SPECIAL( ch )       \
   1337   ( (ch) == '/'                || \
   1338     (ch) == '(' || (ch) == ')' || \
   1339     (ch) == '<' || (ch) == '>' || \
   1340     (ch) == '[' || (ch) == ']' || \
   1341     (ch) == '{' || (ch) == '}' || \
   1342     (ch) == '%'                )
   1343 
   1344 #define IS_PS_DELIM( ch )  \
   1345   ( IS_PS_SPACE( ch )   || \
   1346     IS_PS_SPECIAL( ch ) )
   1347 
   1348 #define IS_PS_DIGIT( ch )        \
   1349   ( (ch) >= '0' && (ch) <= '9' )
   1350 
   1351 #define IS_PS_XDIGIT( ch )            \
   1352   ( IS_PS_DIGIT( ch )              || \
   1353     ( (ch) >= 'A' && (ch) <= 'F' ) || \
   1354     ( (ch) >= 'a' && (ch) <= 'f' ) )
   1355 
   1356 #define IS_PS_BASE85( ch )       \
   1357   ( (ch) >= '!' && (ch) <= 'u' )
   1358 
   1359 #define IS_PS_TOKEN( cur, limit, token )                                \
   1360   ( (char)(cur)[0] == (token)[0]                                     && \
   1361     ( (cur) + sizeof ( (token) ) == (limit) ||                          \
   1362       ( (cur) + sizeof( (token) ) < (limit)          &&                 \
   1363         IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
   1364     ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
   1365 
   1366 
   1367 FT_END_HEADER
   1368 
   1369 #endif /* PSAUX_H_ */
   1370 
   1371 
   1372 /* END */
   1373