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
28FT_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
130FT_END_HEADER
131
132
133#endif /* CFFPARSE_H_ */
134
135
136/* END */
137