Home | History | Annotate | Download | only in cff
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  cffparse.h                                                             */
      4 /*                                                                         */
      5 /*    CFF token stream parser (specification)                              */
      6 /*                                                                         */
      7 /*  Copyright 1996-2018 by                                                 */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #ifndef CFFPARSE_H_
     20 #define CFFPARSE_H_
     21 
     22 
     23 #include <ft2build.h>
     24 #include FT_INTERNAL_CFF_TYPES_H
     25 #include FT_INTERNAL_OBJECTS_H
     26 
     27 
     28 FT_BEGIN_HEADER
     29 
     30 
     31   /* CFF uses constant parser stack size; */
     32   /* CFF2 can increase from default 193   */
     33 #define CFF_MAX_STACK_DEPTH  96
     34 
     35   /*
     36    *  There are plans to remove the `maxstack' operator in a forthcoming
     37    *  revision of the CFF2 specification, increasing the (then static) stack
     38    *  size to 513.  By making the default stack size equal to the maximum
     39    *  stack size, the operator is essentially disabled, which has the
     40    *  desired effect in FreeType.
     41    */
     42 #define CFF2_MAX_STACK      513
     43 #define CFF2_DEFAULT_STACK  513
     44 
     45 #define CFF_CODE_TOPDICT    0x1000
     46 #define CFF_CODE_PRIVATE    0x2000
     47 #define CFF2_CODE_TOPDICT   0x3000
     48 #define CFF2_CODE_FONTDICT  0x4000
     49 #define CFF2_CODE_PRIVATE   0x5000
     50 
     51 
     52   typedef struct  CFF_ParserRec_
     53   {
     54     FT_Library  library;
     55     FT_Byte*    start;
     56     FT_Byte*    limit;
     57     FT_Byte*    cursor;
     58 
     59     FT_Byte**   stack;
     60     FT_Byte**   top;
     61     FT_UInt     stackSize;  /* allocated size */
     62 
     63     FT_UInt     object_code;
     64     void*       object;
     65 
     66     FT_UShort   num_designs; /* a copy of `CFF_FontRecDict->num_designs' */
     67     FT_UShort   num_axes;    /* a copy of `CFF_FontRecDict->num_axes'    */
     68 
     69   } CFF_ParserRec, *CFF_Parser;
     70 
     71 
     72   FT_LOCAL( FT_Long )
     73   cff_parse_num( CFF_Parser  parser,
     74                  FT_Byte**   d );
     75 
     76   FT_LOCAL( FT_Error )
     77   cff_parser_init( CFF_Parser  parser,
     78                    FT_UInt     code,
     79                    void*       object,
     80                    FT_Library  library,
     81                    FT_UInt     stackSize,
     82                    FT_UShort   num_designs,
     83                    FT_UShort   num_axes );
     84 
     85   FT_LOCAL( void )
     86   cff_parser_done( CFF_Parser  parser );
     87 
     88   FT_LOCAL( FT_Error )
     89   cff_parser_run( CFF_Parser  parser,
     90                   FT_Byte*    start,
     91                   FT_Byte*    limit );
     92 
     93 
     94   enum
     95   {
     96     cff_kind_none = 0,
     97     cff_kind_num,
     98     cff_kind_fixed,
     99     cff_kind_fixed_thousand,
    100     cff_kind_string,
    101     cff_kind_bool,
    102     cff_kind_delta,
    103     cff_kind_callback,
    104     cff_kind_blend,
    105 
    106     cff_kind_max  /* do not remove */
    107   };
    108 
    109 
    110   /* now generate handlers for the most simple fields */
    111   typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );
    112 
    113   typedef struct  CFF_Field_Handler_
    114   {
    115     int               kind;
    116     int               code;
    117     FT_UInt           offset;
    118     FT_Byte           size;
    119     CFF_Field_Reader  reader;
    120     FT_UInt           array_max;
    121     FT_UInt           count_offset;
    122 
    123 #ifdef FT_DEBUG_LEVEL_TRACE
    124     const char*       id;
    125 #endif
    126 
    127   } CFF_Field_Handler;
    128 
    129 
    130 FT_END_HEADER
    131 
    132 
    133 #endif /* CFFPARSE_H_ */
    134 
    135 
    136 /* END */
    137