| 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 |  | 
|---|