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-2004, 2006, 2008, 2009, 2012 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_SERVICE_POSTSCRIPT_CMAPS_H
     28 
     29 
     30 FT_BEGIN_HEADER
     31 
     32 
     33   /*************************************************************************/
     34   /*************************************************************************/
     35   /*****                                                               *****/
     36   /*****                             T1_TABLE                          *****/
     37   /*****                                                               *****/
     38   /*************************************************************************/
     39   /*************************************************************************/
     40 
     41 
     42   typedef struct PS_TableRec_*              PS_Table;
     43   typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
     44 
     45 
     46   /*************************************************************************/
     47   /*                                                                       */
     48   /* <Struct>                                                              */
     49   /*    PS_Table_FuncsRec                                                  */
     50   /*                                                                       */
     51   /* <Description>                                                         */
     52   /*    A set of function pointers to manage PS_Table objects.             */
     53   /*                                                                       */
     54   /* <Fields>                                                              */
     55   /*    table_init    :: Used to initialize a table.                       */
     56   /*                                                                       */
     57   /*    table_done    :: Finalizes resp. destroy a given table.            */
     58   /*                                                                       */
     59   /*    table_add     :: Adds a new object to a table.                     */
     60   /*                                                                       */
     61   /*    table_release :: Releases table data, then finalizes it.           */
     62   /*                                                                       */
     63   typedef struct  PS_Table_FuncsRec_
     64   {
     65     FT_Error
     66     (*init)( PS_Table   table,
     67              FT_Int     count,
     68              FT_Memory  memory );
     69 
     70     void
     71     (*done)( PS_Table  table );
     72 
     73     FT_Error
     74     (*add)( PS_Table    table,
     75             FT_Int      idx,
     76             void*       object,
     77             FT_PtrDist  length );
     78 
     79     void
     80     (*release)( PS_Table  table );
     81 
     82   } PS_Table_FuncsRec;
     83 
     84 
     85   /*************************************************************************/
     86   /*                                                                       */
     87   /* <Struct>                                                              */
     88   /*    PS_TableRec                                                        */
     89   /*                                                                       */
     90   /* <Description>                                                         */
     91   /*    A PS_Table is a simple object used to store an array of objects in */
     92   /*    a single memory block.                                             */
     93   /*                                                                       */
     94   /* <Fields>                                                              */
     95   /*    block     :: The address in memory of the growheap's block.  This  */
     96   /*                 can change between two object adds, due to            */
     97   /*                 reallocation.                                         */
     98   /*                                                                       */
     99   /*    cursor    :: The current top of the grow heap within its block.    */
    100   /*                                                                       */
    101   /*    capacity  :: The current size of the heap block.  Increments by    */
    102   /*                 1kByte chunks.                                        */
    103   /*                                                                       */
    104   /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
    105   /*                 been allocated.                                       */
    106   /*                                                                       */
    107   /*    max_elems :: The maximum number of elements in table.              */
    108   /*                                                                       */
    109   /*    num_elems :: The current number of elements in table.              */
    110   /*                                                                       */
    111   /*    elements  :: A table of element addresses within the block.        */
    112   /*                                                                       */
    113   /*    lengths   :: A table of element sizes within the block.            */
    114   /*                                                                       */
    115   /*    memory    :: The object used for memory operations                 */
    116   /*                 (alloc/realloc).                                      */
    117   /*                                                                       */
    118   /*    funcs     :: A table of method pointers for this object.           */
    119   /*                                                                       */
    120   typedef struct  PS_TableRec_
    121   {
    122     FT_Byte*           block;          /* current memory block           */
    123     FT_Offset          cursor;         /* current cursor in memory block */
    124     FT_Offset          capacity;       /* current size of memory block   */
    125     FT_Long            init;
    126 
    127     FT_Int             max_elems;
    128     FT_Int             num_elems;
    129     FT_Byte**          elements;       /* addresses of table elements */
    130     FT_PtrDist*        lengths;        /* lengths of table elements   */
    131 
    132     FT_Memory          memory;
    133     PS_Table_FuncsRec  funcs;
    134 
    135   } PS_TableRec;
    136 
    137 
    138   /*************************************************************************/
    139   /*************************************************************************/
    140   /*****                                                               *****/
    141   /*****                       T1 FIELDS & TOKENS                      *****/
    142   /*****                                                               *****/
    143   /*************************************************************************/
    144   /*************************************************************************/
    145 
    146   typedef struct PS_ParserRec_*  PS_Parser;
    147 
    148   typedef struct T1_TokenRec_*   T1_Token;
    149 
    150   typedef struct T1_FieldRec_*   T1_Field;
    151 
    152 
    153   /* simple enumeration type used to identify token types */
    154   typedef enum  T1_TokenType_
    155   {
    156     T1_TOKEN_TYPE_NONE = 0,
    157     T1_TOKEN_TYPE_ANY,
    158     T1_TOKEN_TYPE_STRING,
    159     T1_TOKEN_TYPE_ARRAY,
    160     T1_TOKEN_TYPE_KEY, /* aka `name' */
    161 
    162     /* do not remove */
    163     T1_TOKEN_TYPE_MAX
    164 
    165   } T1_TokenType;
    166 
    167 
    168   /* a simple structure used to identify tokens */
    169   typedef struct  T1_TokenRec_
    170   {
    171     FT_Byte*      start;   /* first character of token in input stream */
    172     FT_Byte*      limit;   /* first character after the token          */
    173     T1_TokenType  type;    /* type of token                            */
    174 
    175   } T1_TokenRec;
    176 
    177 
    178   /* enumeration type used to identify object fields */
    179   typedef enum  T1_FieldType_
    180   {
    181     T1_FIELD_TYPE_NONE = 0,
    182     T1_FIELD_TYPE_BOOL,
    183     T1_FIELD_TYPE_INTEGER,
    184     T1_FIELD_TYPE_FIXED,
    185     T1_FIELD_TYPE_FIXED_1000,
    186     T1_FIELD_TYPE_STRING,
    187     T1_FIELD_TYPE_KEY,
    188     T1_FIELD_TYPE_BBOX,
    189     T1_FIELD_TYPE_MM_BBOX,
    190     T1_FIELD_TYPE_INTEGER_ARRAY,
    191     T1_FIELD_TYPE_FIXED_ARRAY,
    192     T1_FIELD_TYPE_CALLBACK,
    193 
    194     /* do not remove */
    195     T1_FIELD_TYPE_MAX
    196 
    197   } T1_FieldType;
    198 
    199 
    200   typedef enum  T1_FieldLocation_
    201   {
    202     T1_FIELD_LOCATION_CID_INFO,
    203     T1_FIELD_LOCATION_FONT_DICT,
    204     T1_FIELD_LOCATION_FONT_EXTRA,
    205     T1_FIELD_LOCATION_FONT_INFO,
    206     T1_FIELD_LOCATION_PRIVATE,
    207     T1_FIELD_LOCATION_BBOX,
    208     T1_FIELD_LOCATION_LOADER,
    209     T1_FIELD_LOCATION_FACE,
    210     T1_FIELD_LOCATION_BLEND,
    211 
    212     /* do not remove */
    213     T1_FIELD_LOCATION_MAX
    214 
    215   } T1_FieldLocation;
    216 
    217 
    218   typedef void
    219   (*T1_Field_ParseFunc)( FT_Face     face,
    220                          FT_Pointer  parser );
    221 
    222 
    223   /* structure type used to model object fields */
    224   typedef struct  T1_FieldRec_
    225   {
    226     const char*         ident;        /* field identifier               */
    227     T1_FieldLocation    location;
    228     T1_FieldType        type;         /* type of field                  */
    229     T1_Field_ParseFunc  reader;
    230     FT_UInt             offset;       /* offset of field in object      */
    231     FT_Byte             size;         /* size of field in bytes         */
    232     FT_UInt             array_max;    /* maximum number of elements for */
    233                                       /* array                          */
    234     FT_UInt             count_offset; /* offset of element count for    */
    235                                       /* arrays; must not be zero if in */
    236                                       /* use -- in other words, a       */
    237                                       /* `num_FOO' element must not     */
    238                                       /* start the used structure if we */
    239                                       /* parse a `FOO' array            */
    240     FT_UInt             dict;         /* where we expect it             */
    241   } T1_FieldRec;
    242 
    243 #define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
    244 #define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
    245 
    246 
    247 
    248 #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
    249           {                                                 \
    250             _ident, T1CODE, _type,                          \
    251             0,                                              \
    252             FT_FIELD_OFFSET( _fname ),                      \
    253             FT_FIELD_SIZE( _fname ),                        \
    254             0, 0,                                           \
    255             _dict                                           \
    256           },
    257 
    258 #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
    259           {                                             \
    260             _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
    261             (T1_Field_ParseFunc)_reader,                \
    262             0, 0,                                       \
    263             0, 0,                                       \
    264             _dict                                       \
    265           },
    266 
    267 #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
    268           {                                                      \
    269             _ident, T1CODE, _type,                               \
    270             0,                                                   \
    271             FT_FIELD_OFFSET( _fname ),                           \
    272             FT_FIELD_SIZE_DELTA( _fname ),                       \
    273             _max,                                                \
    274             FT_FIELD_OFFSET( num_ ## _fname ),                   \
    275             _dict                                                \
    276           },
    277 
    278 #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
    279           {                                                       \
    280             _ident, T1CODE, _type,                                \
    281             0,                                                    \
    282             FT_FIELD_OFFSET( _fname ),                            \
    283             FT_FIELD_SIZE_DELTA( _fname ),                        \
    284             _max, 0,                                              \
    285             _dict                                                 \
    286           },
    287 
    288 
    289 #define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
    290           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
    291 
    292 #define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
    293           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
    294 
    295 #define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
    296           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
    297 
    298 #define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
    299           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
    300                                _dict )
    301 
    302 #define T1_FIELD_STRING( _ident, _fname, _dict )                             \
    303           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
    304 
    305 #define T1_FIELD_KEY( _ident, _fname, _dict )                             \
    306           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
    307 
    308 #define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
    309           T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
    310 
    311 
    312 #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
    313           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
    314                               _fname, _fmax, _dict )
    315 
    316 #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
    317           T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
    318                               _fname, _fmax, _dict )
    319 
    320 #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
    321           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
    322                                _fname, _fmax, _dict )
    323 
    324 #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
    325           T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
    326                                _fname, _fmax, _dict )
    327 
    328 #define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
    329           T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
    330 
    331 
    332   /*************************************************************************/
    333   /*************************************************************************/
    334   /*****                                                               *****/
    335   /*****                            T1 PARSER                          *****/
    336   /*****                                                               *****/
    337   /*************************************************************************/
    338   /*************************************************************************/
    339 
    340   typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
    341 
    342   typedef struct  PS_Parser_FuncsRec_
    343   {
    344     void
    345     (*init)( PS_Parser  parser,
    346              FT_Byte*   base,
    347              FT_Byte*   limit,
    348              FT_Memory  memory );
    349 
    350     void
    351     (*done)( PS_Parser  parser );
    352 
    353     void
    354     (*skip_spaces)( PS_Parser  parser );
    355     void
    356     (*skip_PS_token)( PS_Parser  parser );
    357 
    358     FT_Long
    359     (*to_int)( PS_Parser  parser );
    360     FT_Fixed
    361     (*to_fixed)( PS_Parser  parser,
    362                  FT_Int     power_ten );
    363 
    364     FT_Error
    365     (*to_bytes)( PS_Parser  parser,
    366                  FT_Byte*   bytes,
    367                  FT_Offset  max_bytes,
    368                  FT_Long*   pnum_bytes,
    369                  FT_Bool    delimiters );
    370 
    371     FT_Int
    372     (*to_coord_array)( PS_Parser  parser,
    373                        FT_Int     max_coords,
    374                        FT_Short*  coords );
    375     FT_Int
    376     (*to_fixed_array)( PS_Parser  parser,
    377                        FT_Int     max_values,
    378                        FT_Fixed*  values,
    379                        FT_Int     power_ten );
    380 
    381     void
    382     (*to_token)( PS_Parser  parser,
    383                  T1_Token   token );
    384     void
    385     (*to_token_array)( PS_Parser  parser,
    386                        T1_Token   tokens,
    387                        FT_UInt    max_tokens,
    388                        FT_Int*    pnum_tokens );
    389 
    390     FT_Error
    391     (*load_field)( PS_Parser       parser,
    392                    const T1_Field  field,
    393                    void**          objects,
    394                    FT_UInt         max_objects,
    395                    FT_ULong*       pflags );
    396 
    397     FT_Error
    398     (*load_field_table)( PS_Parser       parser,
    399                          const T1_Field  field,
    400                          void**          objects,
    401                          FT_UInt         max_objects,
    402                          FT_ULong*       pflags );
    403 
    404   } PS_Parser_FuncsRec;
    405 
    406 
    407   /*************************************************************************/
    408   /*                                                                       */
    409   /* <Struct>                                                              */
    410   /*    PS_ParserRec                                                       */
    411   /*                                                                       */
    412   /* <Description>                                                         */
    413   /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
    414   /*                                                                       */
    415   /* <Fields>                                                              */
    416   /*    cursor :: The current position in the text.                        */
    417   /*                                                                       */
    418   /*    base   :: Start of the processed text.                             */
    419   /*                                                                       */
    420   /*    limit  :: End of the processed text.                               */
    421   /*                                                                       */
    422   /*    error  :: The last error returned.                                 */
    423   /*                                                                       */
    424   /*    memory :: The object used for memory operations (alloc/realloc).   */
    425   /*                                                                       */
    426   /*    funcs  :: A table of functions for the parser.                     */
    427   /*                                                                       */
    428   typedef struct  PS_ParserRec_
    429   {
    430     FT_Byte*   cursor;
    431     FT_Byte*   base;
    432     FT_Byte*   limit;
    433     FT_Error   error;
    434     FT_Memory  memory;
    435 
    436     PS_Parser_FuncsRec  funcs;
    437 
    438   } PS_ParserRec;
    439 
    440 
    441   /*************************************************************************/
    442   /*************************************************************************/
    443   /*****                                                               *****/
    444   /*****                         T1 BUILDER                            *****/
    445   /*****                                                               *****/
    446   /*************************************************************************/
    447   /*************************************************************************/
    448 
    449 
    450   typedef struct T1_BuilderRec_*  T1_Builder;
    451 
    452 
    453   typedef FT_Error
    454   (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
    455                                    FT_Int      count );
    456 
    457   typedef void
    458   (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
    459                                 FT_Pos      x,
    460                                 FT_Pos      y,
    461                                 FT_Byte     flag );
    462 
    463   typedef FT_Error
    464   (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
    465                                  FT_Pos      x,
    466                                  FT_Pos      y );
    467 
    468   typedef FT_Error
    469   (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
    470 
    471   typedef FT_Error
    472   (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
    473                                   FT_Pos      x,
    474                                   FT_Pos      y );
    475 
    476   typedef void
    477   (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
    478 
    479 
    480   typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
    481 
    482   typedef struct  T1_Builder_FuncsRec_
    483   {
    484     void
    485     (*init)( T1_Builder    builder,
    486              FT_Face       face,
    487              FT_Size       size,
    488              FT_GlyphSlot  slot,
    489              FT_Bool       hinting );
    490 
    491     void
    492     (*done)( T1_Builder   builder );
    493 
    494     T1_Builder_Check_Points_Func   check_points;
    495     T1_Builder_Add_Point_Func      add_point;
    496     T1_Builder_Add_Point1_Func     add_point1;
    497     T1_Builder_Add_Contour_Func    add_contour;
    498     T1_Builder_Start_Point_Func    start_point;
    499     T1_Builder_Close_Contour_Func  close_contour;
    500 
    501   } T1_Builder_FuncsRec;
    502 
    503 
    504   /* an enumeration type to handle charstring parsing states */
    505   typedef enum  T1_ParseState_
    506   {
    507     T1_Parse_Start,
    508     T1_Parse_Have_Width,
    509     T1_Parse_Have_Moveto,
    510     T1_Parse_Have_Path
    511 
    512   } T1_ParseState;
    513 
    514 
    515   /*************************************************************************/
    516   /*                                                                       */
    517   /* <Structure>                                                           */
    518   /*    T1_BuilderRec                                                      */
    519   /*                                                                       */
    520   /* <Description>                                                         */
    521   /*     A structure used during glyph loading to store its outline.       */
    522   /*                                                                       */
    523   /* <Fields>                                                              */
    524   /*    memory       :: The current memory object.                         */
    525   /*                                                                       */
    526   /*    face         :: The current face object.                           */
    527   /*                                                                       */
    528   /*    glyph        :: The current glyph slot.                            */
    529   /*                                                                       */
    530   /*    loader       :: XXX                                                */
    531   /*                                                                       */
    532   /*    base         :: The base glyph outline.                            */
    533   /*                                                                       */
    534   /*    current      :: The current glyph outline.                         */
    535   /*                                                                       */
    536   /*    max_points   :: maximum points in builder outline                  */
    537   /*                                                                       */
    538   /*    max_contours :: Maximum number of contours in builder outline.     */
    539   /*                                                                       */
    540   /*    pos_x        :: The horizontal translation (if composite glyph).   */
    541   /*                                                                       */
    542   /*    pos_y        :: The vertical translation (if composite glyph).     */
    543   /*                                                                       */
    544   /*    left_bearing :: The left side bearing point.                       */
    545   /*                                                                       */
    546   /*    advance      :: The horizontal advance vector.                     */
    547   /*                                                                       */
    548   /*    bbox         :: Unused.                                            */
    549   /*                                                                       */
    550   /*    parse_state  :: An enumeration which controls the charstring       */
    551   /*                    parsing state.                                     */
    552   /*                                                                       */
    553   /*    load_points  :: If this flag is not set, no points are loaded.     */
    554   /*                                                                       */
    555   /*    no_recurse   :: Set but not used.                                  */
    556   /*                                                                       */
    557   /*    metrics_only :: A boolean indicating that we only want to compute  */
    558   /*                    the metrics of a given glyph, not load all of its  */
    559   /*                    points.                                            */
    560   /*                                                                       */
    561   /*    funcs        :: An array of function pointers for the builder.     */
    562   /*                                                                       */
    563   typedef struct  T1_BuilderRec_
    564   {
    565     FT_Memory       memory;
    566     FT_Face         face;
    567     FT_GlyphSlot    glyph;
    568     FT_GlyphLoader  loader;
    569     FT_Outline*     base;
    570     FT_Outline*     current;
    571 
    572     FT_Pos          pos_x;
    573     FT_Pos          pos_y;
    574 
    575     FT_Vector       left_bearing;
    576     FT_Vector       advance;
    577 
    578     FT_BBox         bbox;          /* bounding box */
    579     T1_ParseState   parse_state;
    580     FT_Bool         load_points;
    581     FT_Bool         no_recurse;
    582 
    583     FT_Bool         metrics_only;
    584 
    585     void*           hints_funcs;    /* hinter-specific */
    586     void*           hints_globals;  /* hinter-specific */
    587 
    588     T1_Builder_FuncsRec  funcs;
    589 
    590   } T1_BuilderRec;
    591 
    592 
    593   /*************************************************************************/
    594   /*************************************************************************/
    595   /*****                                                               *****/
    596   /*****                         T1 DECODER                            *****/
    597   /*****                                                               *****/
    598   /*************************************************************************/
    599   /*************************************************************************/
    600 
    601 #if 0
    602 
    603   /*************************************************************************/
    604   /*                                                                       */
    605   /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
    606   /* calls during glyph loading.                                           */
    607   /*                                                                       */
    608 #define T1_MAX_SUBRS_CALLS  8
    609 
    610 
    611   /*************************************************************************/
    612   /*                                                                       */
    613   /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
    614   /* minimum of 16 is required.                                            */
    615   /*                                                                       */
    616 #define T1_MAX_CHARSTRINGS_OPERANDS  32
    617 
    618 #endif /* 0 */
    619 
    620 
    621   typedef struct  T1_Decoder_ZoneRec_
    622   {
    623     FT_Byte*  cursor;
    624     FT_Byte*  base;
    625     FT_Byte*  limit;
    626 
    627   } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
    628 
    629 
    630   typedef struct T1_DecoderRec_*              T1_Decoder;
    631   typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
    632 
    633 
    634   typedef FT_Error
    635   (*T1_Decoder_Callback)( T1_Decoder  decoder,
    636                           FT_UInt     glyph_index );
    637 
    638 
    639   typedef struct  T1_Decoder_FuncsRec_
    640   {
    641     FT_Error
    642     (*init)( T1_Decoder           decoder,
    643              FT_Face              face,
    644              FT_Size              size,
    645              FT_GlyphSlot         slot,
    646              FT_Byte**            glyph_names,
    647              PS_Blend             blend,
    648              FT_Bool              hinting,
    649              FT_Render_Mode       hint_mode,
    650              T1_Decoder_Callback  callback );
    651 
    652     void
    653     (*done)( T1_Decoder  decoder );
    654 
    655     FT_Error
    656     (*parse_charstrings)( T1_Decoder  decoder,
    657                           FT_Byte*    base,
    658                           FT_UInt     len );
    659 
    660   } T1_Decoder_FuncsRec;
    661 
    662 
    663   typedef struct  T1_DecoderRec_
    664   {
    665     T1_BuilderRec        builder;
    666 
    667     FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
    668     FT_Long*             top;
    669 
    670     T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
    671     T1_Decoder_Zone      zone;
    672 
    673     FT_Service_PsCMaps   psnames;      /* for seac */
    674     FT_UInt              num_glyphs;
    675     FT_Byte**            glyph_names;
    676 
    677     FT_Int               lenIV;        /* internal for sub routine calls */
    678     FT_UInt              num_subrs;
    679     FT_Byte**            subrs;
    680     FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */
    681 
    682     FT_Matrix            font_matrix;
    683     FT_Vector            font_offset;
    684 
    685     FT_Int               flex_state;
    686     FT_Int               num_flex_vectors;
    687     FT_Vector            flex_vectors[7];
    688 
    689     PS_Blend             blend;       /* for multiple master support */
    690 
    691     FT_Render_Mode       hint_mode;
    692 
    693     T1_Decoder_Callback  parse_callback;
    694     T1_Decoder_FuncsRec  funcs;
    695 
    696     FT_Long*             buildchar;
    697     FT_UInt              len_buildchar;
    698 
    699     FT_Bool              seac;
    700 
    701   } T1_DecoderRec;
    702 
    703 
    704   /*************************************************************************/
    705   /*************************************************************************/
    706   /*****                                                               *****/
    707   /*****                            AFM PARSER                         *****/
    708   /*****                                                               *****/
    709   /*************************************************************************/
    710   /*************************************************************************/
    711 
    712   typedef struct AFM_ParserRec_*  AFM_Parser;
    713 
    714   typedef struct  AFM_Parser_FuncsRec_
    715   {
    716     FT_Error
    717     (*init)( AFM_Parser  parser,
    718              FT_Memory   memory,
    719              FT_Byte*    base,
    720              FT_Byte*    limit );
    721 
    722     void
    723     (*done)( AFM_Parser  parser );
    724 
    725     FT_Error
    726     (*parse)( AFM_Parser  parser );
    727 
    728   } AFM_Parser_FuncsRec;
    729 
    730 
    731   typedef struct AFM_StreamRec_*  AFM_Stream;
    732 
    733 
    734   /*************************************************************************/
    735   /*                                                                       */
    736   /* <Struct>                                                              */
    737   /*    AFM_ParserRec                                                      */
    738   /*                                                                       */
    739   /* <Description>                                                         */
    740   /*    An AFM_Parser is a parser for the AFM files.                       */
    741   /*                                                                       */
    742   /* <Fields>                                                              */
    743   /*    memory    :: The object used for memory operations (alloc and      */
    744   /*                 realloc).                                             */
    745   /*                                                                       */
    746   /*    stream    :: This is an opaque object.                             */
    747   /*                                                                       */
    748   /*    FontInfo  :: The result will be stored here.                       */
    749   /*                                                                       */
    750   /*    get_index :: A user provided function to get a glyph index by its  */
    751   /*                 name.                                                 */
    752   /*                                                                       */
    753   typedef struct  AFM_ParserRec_
    754   {
    755     FT_Memory     memory;
    756     AFM_Stream    stream;
    757 
    758     AFM_FontInfo  FontInfo;
    759 
    760     FT_Int
    761     (*get_index)( const char*  name,
    762                   FT_Offset    len,
    763                   void*        user_data );
    764 
    765     void*         user_data;
    766 
    767   } AFM_ParserRec;
    768 
    769 
    770   /*************************************************************************/
    771   /*************************************************************************/
    772   /*****                                                               *****/
    773   /*****                     TYPE1 CHARMAPS                            *****/
    774   /*****                                                               *****/
    775   /*************************************************************************/
    776   /*************************************************************************/
    777 
    778   typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
    779 
    780   typedef struct T1_CMap_ClassesRec_
    781   {
    782     FT_CMap_Class  standard;
    783     FT_CMap_Class  expert;
    784     FT_CMap_Class  custom;
    785     FT_CMap_Class  unicode;
    786 
    787   } T1_CMap_ClassesRec;
    788 
    789 
    790   /*************************************************************************/
    791   /*************************************************************************/
    792   /*****                                                               *****/
    793   /*****                        PSAux Module Interface                 *****/
    794   /*****                                                               *****/
    795   /*************************************************************************/
    796   /*************************************************************************/
    797 
    798   typedef struct  PSAux_ServiceRec_
    799   {
    800     /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
    801     const PS_Table_FuncsRec*    ps_table_funcs;
    802     const PS_Parser_FuncsRec*   ps_parser_funcs;
    803     const T1_Builder_FuncsRec*  t1_builder_funcs;
    804     const T1_Decoder_FuncsRec*  t1_decoder_funcs;
    805 
    806     void
    807     (*t1_decrypt)( FT_Byte*   buffer,
    808                    FT_Offset  length,
    809                    FT_UShort  seed );
    810 
    811     T1_CMap_Classes  t1_cmap_classes;
    812 
    813     /* fields after this comment line were added after version 2.1.10 */
    814     const AFM_Parser_FuncsRec*  afm_parser_funcs;
    815 
    816   } PSAux_ServiceRec, *PSAux_Service;
    817 
    818   /* backwards-compatible type definition */
    819   typedef PSAux_ServiceRec   PSAux_Interface;
    820 
    821 
    822   /*************************************************************************/
    823   /*************************************************************************/
    824   /*****                                                               *****/
    825   /*****                 Some convenience functions                    *****/
    826   /*****                                                               *****/
    827   /*************************************************************************/
    828   /*************************************************************************/
    829 
    830 #define IS_PS_NEWLINE( ch ) \
    831   ( (ch) == '\r' ||         \
    832     (ch) == '\n' )
    833 
    834 #define IS_PS_SPACE( ch )  \
    835   ( (ch) == ' '         || \
    836     IS_PS_NEWLINE( ch ) || \
    837     (ch) == '\t'        || \
    838     (ch) == '\f'        || \
    839     (ch) == '\0' )
    840 
    841 #define IS_PS_SPECIAL( ch )       \
    842   ( (ch) == '/'                || \
    843     (ch) == '(' || (ch) == ')' || \
    844     (ch) == '<' || (ch) == '>' || \
    845     (ch) == '[' || (ch) == ']' || \
    846     (ch) == '{' || (ch) == '}' || \
    847     (ch) == '%'                )
    848 
    849 #define IS_PS_DELIM( ch )  \
    850   ( IS_PS_SPACE( ch )   || \
    851     IS_PS_SPECIAL( ch ) )
    852 
    853 #define IS_PS_DIGIT( ch )        \
    854   ( (ch) >= '0' && (ch) <= '9' )
    855 
    856 #define IS_PS_XDIGIT( ch )            \
    857   ( IS_PS_DIGIT( ch )              || \
    858     ( (ch) >= 'A' && (ch) <= 'F' ) || \
    859     ( (ch) >= 'a' && (ch) <= 'f' ) )
    860 
    861 #define IS_PS_BASE85( ch )       \
    862   ( (ch) >= '!' && (ch) <= 'u' )
    863 
    864 #define IS_PS_TOKEN( cur, limit, token )                                \
    865   ( (char)(cur)[0] == (token)[0]                                     && \
    866     ( (cur) + sizeof ( (token) ) == (limit) ||                          \
    867       ( (cur) + sizeof( (token) ) < (limit)          &&                 \
    868         IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
    869     ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
    870 
    871 
    872 FT_END_HEADER
    873 
    874 #endif /* __PSAUX_H__ */
    875 
    876 
    877 /* END */
    878