• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***************************************************************************/
2 /*                                                                         */
3 /*  cffparse.h                                                             */
4 /*                                                                         */
5 /*    CFF token stream parser (specification)                              */
6 /*                                                                         */
7 /*  Copyright 1996-2017 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 "cfftypes.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 #define CFF2_MAX_STACK      513
35 #define CFF2_DEFAULT_STACK  193
36 
37 #define CFF_CODE_TOPDICT    0x1000
38 #define CFF_CODE_PRIVATE    0x2000
39 #define CFF2_CODE_TOPDICT   0x3000
40 #define CFF2_CODE_FONTDICT  0x4000
41 #define CFF2_CODE_PRIVATE   0x5000
42 
43 
44   typedef struct  CFF_ParserRec_
45   {
46     FT_Library  library;
47     FT_Byte*    start;
48     FT_Byte*    limit;
49     FT_Byte*    cursor;
50 
51     FT_Byte**   stack;
52     FT_Byte**   top;
53     FT_UInt     stackSize;  /* allocated size */
54 
55     FT_UInt     object_code;
56     void*       object;
57 
58     FT_UShort   num_designs; /* a copy of `CFF_FontRecDict->num_designs' */
59     FT_UShort   num_axes;    /* a copy of `CFF_FontRecDict->num_axes'    */
60 
61   } CFF_ParserRec, *CFF_Parser;
62 
63 
64   FT_LOCAL( FT_Long )
65   cff_parse_num( CFF_Parser  parser,
66                  FT_Byte**   d );
67 
68   FT_LOCAL( FT_Error )
69   cff_parser_init( CFF_Parser  parser,
70                    FT_UInt     code,
71                    void*       object,
72                    FT_Library  library,
73                    FT_UInt     stackSize,
74                    FT_UShort   num_designs,
75                    FT_UShort   num_axes );
76 
77   FT_LOCAL( void )
78   cff_parser_done( CFF_Parser  parser );
79 
80   FT_LOCAL( FT_Error )
81   cff_parser_run( CFF_Parser  parser,
82                   FT_Byte*    start,
83                   FT_Byte*    limit );
84 
85 
86   enum
87   {
88     cff_kind_none = 0,
89     cff_kind_num,
90     cff_kind_fixed,
91     cff_kind_fixed_thousand,
92     cff_kind_string,
93     cff_kind_bool,
94     cff_kind_delta,
95     cff_kind_callback,
96     cff_kind_blend,
97 
98     cff_kind_max  /* do not remove */
99   };
100 
101 
102   /* now generate handlers for the most simple fields */
103   typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );
104 
105   typedef struct  CFF_Field_Handler_
106   {
107     int               kind;
108     int               code;
109     FT_UInt           offset;
110     FT_Byte           size;
111     CFF_Field_Reader  reader;
112     FT_UInt           array_max;
113     FT_UInt           count_offset;
114 
115 #ifdef FT_DEBUG_LEVEL_TRACE
116     const char*       id;
117 #endif
118 
119   } CFF_Field_Handler;
120 
121 
122 FT_END_HEADER
123 
124 
125 #endif /* CFFPARSE_H_ */
126 
127 
128 /* END */
129