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