• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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