1 /***************************************************************************/
5 /* CID-keyed Type1 parser (specification). */
7 /* Copyright 1996-2000 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
22 #include <freetype/internal/t1types.h>
32 /*************************************************************************/
38 /* A CID_Table is a simple object used to store an array of objects */
39 /* in a single memory block. */
42 /* block :: The address in memory of the growheap's block. This */
43 /* can change between two object adds, due to the use */
46 /* cursor :: The current top of the growheap within its block. */
48 /* capacity :: The current size of the heap block. Increments by */
49 /* blocks of 1 kByte. */
51 /* init :: A boolean. Set when the table has been initialized */
52 /* (the table user should set this field). */
54 /* max_elems :: The maximal number of elements in the table. */
56 /* num_elems :: The current number of elements (in use) in the table. */
58 /* elements :: A table of element addresses within the block. */
60 /* lengths :: A table of element sizes within the block. */
62 /* memory :: The memory object used for memory operations */
63 /* (allocation resp. reallocation). */
65 typedef struct CID_Table_
67 FT_Byte* block; /* current memory block */
68 FT_Int cursor; /* current cursor in memory block */
69 FT_Int capacity; /* current size of memory block */
74 FT_Byte** elements; /* addresses of table elements */
75 FT_Int* lengths; /* lengths of table elements */
83 FT_Error CID_New_Table( CID_Table* table,
88 FT_Error CID_Add_Table( CID_Table* table,
94 void CID_Release_Table( CID_Table* table );
99 /*************************************************************************/
105 /* A CID_Parser is an object used to parse a Type 1 fonts very */
109 /* stream :: The current input stream. */
111 /* memory :: The current memory object. */
113 /* postscript :: A pointer to the data to be parsed. */
115 /* postscript_len :: The length of the data to be parsed. */
117 /* data_offset :: The start position of the binary data (i.e., the */
118 /* end of the data to be parsed. */
120 /* cursor :: The current parser cursor. */
122 /* limit :: The current parser limit (i.e., the first byte */
123 /* after the current dictionary). */
125 /* error :: The current parsing error. */
127 /* cid :: A structure which holds the information about */
128 /* the current font. */
130 /* num_dict :: The number of font dictionaries. */
132 typedef struct CID_Parser_
138 FT_Int postscript_len;
140 FT_ULong data_offset;
153 FT_Error CID_New_Parser( CID_Parser* parser,
158 void CID_Done_Parser( CID_Parser* parser );
161 /*************************************************************************/
163 /* PARSING ROUTINES */
165 /*************************************************************************/
168 FT_Long CID_ToInt( CID_Parser* parser );
171 FT_Int CID_ToCoordArray( CID_Parser* parser,
176 FT_Int CID_ToFixedArray( CID_Parser* parser,
182 void CID_Skip_Spaces( CID_Parser* parser );
185 /* simple enumeration type used to identify token types */
186 typedef enum CID_Token_Type_
199 /* a simple structure used to identify tokens */
200 typedef struct CID_Token_Rec_
202 FT_Byte* start; /* first character of token in input stream */
203 FT_Byte* limit; /* first character after the token */
204 CID_Token_Type type; /* type of token */
210 void CID_ToToken( CID_Parser* parser,
211 CID_Token_Rec* token );
214 /* enumeration type used to identify object fields */
215 typedef enum CID_Field_Type_
222 t1_field_integer_array,
223 t1_field_fixed_array,
231 typedef enum CID_Field_Location_
239 t1_field_location_max
241 } CID_Field_Location;
244 typedef FT_Error (*CID_Field_Parser)( CID_Face face,
245 CID_Parser* parser );
247 /* structure type used to model object fields */
248 typedef struct CID_Field_Rec_
250 const char* ident; /* field identifier */
251 CID_Field_Location location;
252 CID_Field_Type type; /* type of field */
253 CID_Field_Parser reader;
254 FT_UInt offset; /* offset of field in object */
255 FT_UInt size; /* size of field in bytes */
256 FT_UInt array_max; /* maximal number of elements for */
258 FT_UInt count_offset; /* offset of element count for */
263 #define CID_FIELD_REF( s, f ) ( ((s*)0)->f )
265 #define CID_NEW_SIMPLE_FIELD( _ident, _type, _fname ) \
267 _ident, T1CODE, _type, \
269 (FT_UInt)(char*)&CID_FIELD_REF( T1TYPE, _fname ), \
270 sizeof ( CID_FIELD_REF( T1TYPE, _fname ) ), \
274 #define CID_NEW_CALLBACK_FIELD( _ident, _reader ) \
276 _ident, T1CODE, t1_field_callback, \
282 #define CID_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \
284 _ident, T1CODE, _type, \
286 (FT_UInt)(char*)&CID_FIELD_REF( T1TYPE, _fname ), \
287 sizeof ( CID_FIELD_REF( T1TYPE, _fname )[0] ), \
289 (FT_UInt)(char*)&CID_FIELD_REF( T1TYPE, num_ ## _fname ) \
292 #define CID_NEW_TABLE_FIELD2( _ident, _type, _fname, _max ) \
294 _ident, T1CODE, _type, \
296 (FT_UInt)(char*)&CID_FIELD_REF( T1TYPE, _fname ), \
297 sizeof ( CID_FIELD_REF( T1TYPE, _fname )[0] ), \
302 #define CID_FIELD_BOOL( _ident, _fname ) \
303 CID_NEW_SIMPLE_FIELD( _ident, t1_field_bool, _fname )
305 #define CID_FIELD_NUM( _ident, _fname ) \
306 CID_NEW_SIMPLE_FIELD( _ident, t1_field_integer, _fname )
308 #define CID_FIELD_FIXED( _ident, _fname ) \
309 CID_NEW_SIMPLE_FIELD( _ident, t1_field_fixed, _fname )
311 #define CID_FIELD_STRING( _ident, _fname ) \
312 CID_NEW_SIMPLE_FIELD( _ident, t1_field_string, _fname )
314 #define CID_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \
315 CID_NEW_TABLE_FIELD( _ident, t1_field_integer_array, \
318 #define CID_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \
319 CID_NEW_TABLE_FIELD( _ident, t1_field_fixed_array, \
322 #define CID_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \
323 CID_NEW_TABLE_FIELD2( _ident, t1_field_integer_array, \
326 #define CID_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \
327 CID_NEW_TABLE_FIELD2( _ident, t1_field_fixed_array, \
330 #define CID_FIELD_CALLBACK( _ident, _name ) \
331 CID_NEW_CALLBACK_FIELD( _ident, parse_ ## _name )
335 FT_Error CID_Load_Field( CID_Parser* parser,
336 const CID_Field_Rec* field,
340 FT_Error CID_Load_Field_Table( CID_Parser* parser,
341 const CID_Field_Rec* field,
350 #endif /* CIDPARSE_H */