1 /**************************************************************************** 2 * 3 * cffparse.h 4 * 5 * CFF token stream parser (specification) 6 * 7 * Copyright (C) 1996-2020 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 <freetype/internal/cfftypes.h> 24 #include <freetype/internal/ftobjs.h> 25 26 27 FT_BEGIN_HEADER 28 29 30 /* CFF uses constant parser stack size; */ 31 /* CFF2 can increase from default 193 */ 32 #define CFF_MAX_STACK_DEPTH 96 33 34 /* 35 * There are plans to remove the `maxstack' operator in a forthcoming 36 * revision of the CFF2 specification, increasing the (then static) stack 37 * size to 513. By making the default stack size equal to the maximum 38 * stack size, the operator is essentially disabled, which has the 39 * desired effect in FreeType. 40 */ 41 #define CFF2_MAX_STACK 513 42 #define CFF2_DEFAULT_STACK 513 43 44 #define CFF_CODE_TOPDICT 0x1000 45 #define CFF_CODE_PRIVATE 0x2000 46 #define CFF2_CODE_TOPDICT 0x3000 47 #define CFF2_CODE_FONTDICT 0x4000 48 #define CFF2_CODE_PRIVATE 0x5000 49 50 51 typedef struct CFF_ParserRec_ 52 { 53 FT_Library library; 54 FT_Byte* start; 55 FT_Byte* limit; 56 FT_Byte* cursor; 57 58 FT_Byte** stack; 59 FT_Byte** top; 60 FT_UInt stackSize; /* allocated size */ 61 62 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 63 FT_ListRec t2_strings; 64 #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ 65 66 FT_UInt object_code; 67 void* object; 68 69 FT_UShort num_designs; /* a copy of `CFF_FontRecDict->num_designs' */ 70 FT_UShort num_axes; /* a copy of `CFF_FontRecDict->num_axes' */ 71 72 } CFF_ParserRec, *CFF_Parser; 73 74 75 FT_LOCAL( FT_Long ) 76 cff_parse_num( CFF_Parser parser, 77 FT_Byte** d ); 78 79 FT_LOCAL( FT_Error ) 80 cff_parser_init( CFF_Parser parser, 81 FT_UInt code, 82 void* object, 83 FT_Library library, 84 FT_UInt stackSize, 85 FT_UShort num_designs, 86 FT_UShort num_axes ); 87 88 FT_LOCAL( void ) 89 cff_parser_done( CFF_Parser parser ); 90 91 FT_LOCAL( FT_Error ) 92 cff_parser_run( CFF_Parser parser, 93 FT_Byte* start, 94 FT_Byte* limit ); 95 96 97 enum 98 { 99 cff_kind_none = 0, 100 cff_kind_num, 101 cff_kind_fixed, 102 cff_kind_fixed_thousand, 103 cff_kind_string, 104 cff_kind_bool, 105 cff_kind_delta, 106 cff_kind_callback, 107 cff_kind_blend, 108 109 cff_kind_max /* do not remove */ 110 }; 111 112 113 /* now generate handlers for the most simple fields */ 114 typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); 115 116 typedef struct CFF_Field_Handler_ 117 { 118 int kind; 119 int code; 120 FT_UInt offset; 121 FT_Byte size; 122 CFF_Field_Reader reader; 123 FT_UInt array_max; 124 FT_UInt count_offset; 125 126 #ifdef FT_DEBUG_LEVEL_TRACE 127 const char* id; 128 #endif 129 130 } CFF_Field_Handler; 131 132 133 FT_END_HEADER 134 135 136 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 137 typedef struct CFF_T2_String_ 138 { 139 FT_Byte* start; 140 FT_Byte* limit; 141 142 } CFF_T2_StringRec, *CFF_T2_String; 143 #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ 144 145 #endif /* CFFPARSE_H_ */ 146 147 148 /* END */ 149