1 /**************************************************************************** 2 * 3 * cffparse.h 4 * 5 * CFF token stream parser (specification) 6 * 7 * Copyright (C) 1996-2019 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 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 64 FT_ListRec t2_strings; 65 #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ 66 67 FT_UInt object_code; 68 void* object; 69 70 FT_UShort num_designs; /* a copy of `CFF_FontRecDict->num_designs' */ 71 FT_UShort num_axes; /* a copy of `CFF_FontRecDict->num_axes' */ 72 73 } CFF_ParserRec, *CFF_Parser; 74 75 76 FT_LOCAL( FT_Long ) 77 cff_parse_num( CFF_Parser parser, 78 FT_Byte** d ); 79 80 FT_LOCAL( FT_Error ) 81 cff_parser_init( CFF_Parser parser, 82 FT_UInt code, 83 void* object, 84 FT_Library library, 85 FT_UInt stackSize, 86 FT_UShort num_designs, 87 FT_UShort num_axes ); 88 89 FT_LOCAL( void ) 90 cff_parser_done( CFF_Parser parser ); 91 92 FT_LOCAL( FT_Error ) 93 cff_parser_run( CFF_Parser parser, 94 FT_Byte* start, 95 FT_Byte* limit ); 96 97 98 enum 99 { 100 cff_kind_none = 0, 101 cff_kind_num, 102 cff_kind_fixed, 103 cff_kind_fixed_thousand, 104 cff_kind_string, 105 cff_kind_bool, 106 cff_kind_delta, 107 cff_kind_callback, 108 cff_kind_blend, 109 110 cff_kind_max /* do not remove */ 111 }; 112 113 114 /* now generate handlers for the most simple fields */ 115 typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); 116 117 typedef struct CFF_Field_Handler_ 118 { 119 int kind; 120 int code; 121 FT_UInt offset; 122 FT_Byte size; 123 CFF_Field_Reader reader; 124 FT_UInt array_max; 125 FT_UInt count_offset; 126 127 #ifdef FT_DEBUG_LEVEL_TRACE 128 const char* id; 129 #endif 130 131 } CFF_Field_Handler; 132 133 134 FT_END_HEADER 135 136 137 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 138 typedef struct CFF_T2_String_ 139 { 140 FT_Byte* start; 141 FT_Byte* limit; 142 143 } CFF_T2_StringRec, *CFF_T2_String; 144 #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ 145 146 #endif /* CFFPARSE_H_ */ 147 148 149 /* END */ 150