ref: 1e7f84326164826fd888cacfd6862d0525fb915f
dir: /src/type1/t1parse.h/
/******************************************************************* * * t1parse.h 1.0 * * Type1 parser. * * Copyright 1996-1998 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used * modified and distributed under the terms of the FreeType project * license, LICENSE.TXT. By continuing to use, modify, or distribute * this file you indicate that you have read the license and * understand and accept it fully. * * * The Type1 parser component is in charge of simply parsing * the font input stream and convert simple tokens and elements * into integers, floats, matrices, strings, etc.. * * It is used by the Type1 loader.. * ******************************************************************/ #ifndef T1PARSE_H #define T1PARSE_H #include <ftstream.h> #include <t1tokens.h> #ifdef __cplusplus extern "C" { #endif /************************************************************************* * * <Enum> T1_DictState * * <Description> * An enumeration used to describe the Type 1 parser's state, i.e. * which dictionary (or array) it is scanning and processing at the * current moment.. * */ typedef enum T1_DictState_ { dict_none = 0, dict_font, /* parsing the font dictionary */ dict_fontinfo, /* parsing the font info dictionary */ dict_none2, /* beginning to parse the encrypted section */ dict_private, /* parsing the private dictionary */ dict_encoding, /* parsing the encoding array */ dict_subrs, /* parsing the subrs array */ dict_othersubrs, /* parsing the othersubrs array (?) */ dict_charstrings, /* parsing the charstrings dictionary */ dict_unknown_array, /* parsing/ignoring an unknown array */ dict_unknown_dict, /* parsing/ignoring an unknown dictionary */ dict_max /* do not remove from list */ } T1_DictState; /************************************************************************* * * <Struct> T1_Table * * <Description> * A T1_Table is a simple object used to store an array of objects * in a single memory block. * * <Fields> * block :: address in memory of the growheap's block. This * can change between two object adds, due to the use * of 'realloc'. * * cursor :: current top of the grow heap within its block * * capacity :: current size of the heap block. Increments by 1 Kb * * max_elems :: maximum number of elements in table * num_elems :: current number of elements in table * * elements :: table of element addresses within the block * lengths :: table of element sizes within the block * * system :: system object used for memory operations (alloc/realloc) */ typedef struct T1_Table_ { T1_Byte* block; /* current memory block */ T1_Int cursor; /* current cursor in memory block */ T1_Int capacity; /* current size of memory block */ T1_Int max_elems; T1_Int num_elems; T1_Byte** elements; /* addresses of table elements */ T1_Int* lengths; /* lengths of table elements */ FT_Memory memory; } T1_Table; /*************************************************************************/ /* */ /* <Struct> T1_Parser */ /* */ /* <Description> */ /* A Type 1 parser. This object is in charge of parsing Type 1 */ /* ASCII streams and builds dictionaries for a T1_Face object. */ /* */ /* <Fields> */ /* error :: */ /* current error code. 0 means success */ /* */ /* face :: */ /* the target T1_Face object being built */ /* */ /* tokenizer :: */ /* the tokenizer (lexical analyser) used for processing the */ /* input stream. */ /* */ /* stack :: */ /* the current token stack. Note that we don't use intermediate */ /* Postscript objects here ! */ /* */ /* top :: */ /* current top of token stack */ /* */ /* limit :: */ /* current upper bound of the token stack. Used for overflow */ /* checks.. */ /* */ /* args :: */ /* arguments of a given operator. used and increased by the */ /* Copy.... functions.. */ /* */ /* state_index :: */ /* index of top of the dictionary state stack */ /* */ /* state_stack :: */ /* dictionary states stack */ /* */ /* table :: */ /* a T1_Table object used to record various kinds of */ /* dictionaries or arrays (like /Encoding, /Subrs, /CharStrings) */ /* */ /* */ typedef struct T1_Parser_ { T1_Error error; T1_Face face; T1_Tokenizer tokenizer; T1_Bool dump_tokens; T1_Token stack[ T1_MAX_STACK_DEPTH ]; T1_Token* top; T1_Token* limit; T1_Token* args; T1_Int state_index; T1_DictState state_stack[ T1_MAX_DICT_DEPTH ]; T1_Table table; T1_Int cur_name; T1_EncodingType encoding_type; T1_Byte* encoding_names; T1_Int* encoding_lengths; T1_Byte** encoding_offsets; T1_Byte* subrs; T1_Byte* charstrings; } T1_Parser; /*************************************************************************/ /* */ /* <Function> T1_New_Table */ /* */ /* <Description> */ /* Initialise a T1_Table. */ /* */ /* <Input> */ /* table :: address of target table */ /* count :: table size = maximum number of elements */ /* system :: system object to use for all subsequent reallocations */ /* */ /* <Return> */ /* Error code. 0 means success */ /* */ LOCAL_DEF T1_Error T1_New_Table( T1_Table* table, T1_Int count, FT_Memory memory ); /*************************************************************************/ /* */ /* <Function> T1_Add_Table */ /* */ /* <Description> */ /* Adds an object to a T1_Table, possibly growing its memory block */ /* */ /* <Input> */ /* table :: target table */ /* index :: index of object in table */ /* object :: address of object to copy in memory */ /* length :: length in bytes of source object */ /* */ /* <Return> */ /* Error code. 0 means success. An error is returned when a */ /* realloc failed.. */ /* */ LOCAL_DEF T1_Error T1_Add_Table( T1_Table* table, T1_Int index, void* object, T1_Int length ); /*************************************************************************/ /* */ /* <Function> T1_Done_Table */ /* */ /* <Description> */ /* Finalise a T1_Table. (realloc it to its current cursor). */ /* */ /* <Input> */ /* table :: target table */ /* */ /* <Note> */ /* This function does NOT release the heap's memory block. It is up */ /* to the caller to clean it, or reference it in its own structures. */ /* */ LOCAL_DEF void T1_Done_Table( T1_Table* table ); LOCAL_DEF T1_String* CopyString( T1_Parser* parser ); LOCAL_DEF T1_Long CopyInteger( T1_Parser* parser ); LOCAL_DEF T1_Bool CopyBoolean( T1_Parser* parser ); LOCAL_DEF T1_Long CopyFloat( T1_Parser* parser, T1_Int scale ); LOCAL_DEF void CopyBBox( T1_Parser* parser, T1_BBox* bbox ); LOCAL_DEF void CopyMatrix( T1_Parser* parser, T1_Matrix* matrix ); LOCAL_DEF void CopyArray( T1_Parser* parser, T1_Byte* num_elements, T1_Short* elements, T1_Int max_elements ); #ifdef __cplusplus } #endif #endif /* T1PARSE_H */ /* END */