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