blob: b124c08e96aaa656837c37473367692598b363fc [file] [log] [blame]
/*******************************************************************
*
* 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 */