7fa51b5535
Adding some trivial error checking. Adding/Fixing tracing levels.
262 lines
12 KiB
C
262 lines
12 KiB
C
/***************************************************************************/
|
|
/* */
|
|
/* t1parse.h */
|
|
/* */
|
|
/* Type 1 parser (specification). */
|
|
/* */
|
|
/* Copyright 1996-2000 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 <freetype/internal/ftstream.h>
|
|
|
|
|
|
#ifdef FT_FLAT_COMPILE
|
|
|
|
#include "t1tokens.h"
|
|
|
|
#else
|
|
|
|
#include <type1/t1tokens.h>
|
|
|
|
#endif
|
|
|
|
|
|
#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 :: The address in memory of the growheap's block. This */
|
|
/* can change between two object adds, due to */
|
|
/* reallocation. */
|
|
/* */
|
|
/* cursor :: The current top of the grow heap within its block. */
|
|
/* */
|
|
/* capacity :: The current size of the heap block. Increments by */
|
|
/* 1kByte chunks. */
|
|
/* */
|
|
/* max_elems :: The maximum number of elements in table. */
|
|
/* */
|
|
/* num_elems :: The current number of elements in table. */
|
|
/* */
|
|
/* elements :: A table of element addresses within the block. */
|
|
/* */
|
|
/* lengths :: A table of element sizes within the block. */
|
|
/* */
|
|
/* memory :: The object used for memory operations */
|
|
/* (alloc/realloc). */
|
|
/* */
|
|
typedef struct T1_Table_
|
|
{
|
|
FT_Byte* block; /* current memory block */
|
|
FT_Int cursor; /* current cursor in memory block */
|
|
FT_Int capacity; /* current size of memory block */
|
|
|
|
FT_Int max_elems;
|
|
FT_Int num_elems;
|
|
FT_Byte** elements; /* addresses of table elements */
|
|
FT_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 :: The 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. */
|
|
/* */
|
|
/* dump_tokens :: XXX */
|
|
/* */
|
|
/* stack :: The current token stack. Note that we don't */
|
|
/* use intermediate Postscript objects here! */
|
|
/* */
|
|
/* top :: The current top of token stack. */
|
|
/* */
|
|
/* limit :: The current upper bound of the token stack. */
|
|
/* Used for overflow checks. */
|
|
/* */
|
|
/* args :: The arguments of a given operator. Used and */
|
|
/* increased by the various CopyXXX() functions. */
|
|
/* */
|
|
/* state_index :: The index of the top of the dictionary state */
|
|
/* stack. */
|
|
/* */
|
|
/* state_stack :: The dictionary states stack. */
|
|
/* */
|
|
/* table :: A T1_Table object used to record various kinds */
|
|
/* of dictionaries or arrays (like `/Encoding', */
|
|
/* `/Subrs', `/CharStrings'). */
|
|
/* */
|
|
/* cur_name :: XXX */
|
|
/* */
|
|
/* encoding_type :: XXX */
|
|
/* */
|
|
/* encoding_names :: XXX */
|
|
/* */
|
|
/* encoding_lengths :: XXX */
|
|
/* */
|
|
/* encoding_offsets :: XXX */
|
|
/* */
|
|
/* subrs :: XXX */
|
|
/* */
|
|
/* charstrings :: XXX */
|
|
/* */
|
|
typedef struct T1_Parser_
|
|
{
|
|
FT_Error error;
|
|
T1_Face face;
|
|
|
|
T1_Tokenizer tokenizer;
|
|
FT_Bool dump_tokens;
|
|
|
|
T1_Token stack[T1_MAX_STACK_DEPTH];
|
|
T1_Token* top;
|
|
T1_Token* limit;
|
|
T1_Token* args;
|
|
|
|
FT_Int state_index;
|
|
T1_DictState state_stack[T1_MAX_DICT_DEPTH];
|
|
|
|
T1_Table table;
|
|
|
|
FT_Int cur_name;
|
|
|
|
T1_EncodingType encoding_type;
|
|
FT_Byte* encoding_names;
|
|
FT_Int* encoding_lengths;
|
|
FT_Byte** encoding_offsets;
|
|
|
|
FT_Byte* subrs;
|
|
FT_Byte* charstrings;
|
|
|
|
} T1_Parser;
|
|
|
|
|
|
LOCAL_DEF
|
|
FT_Error T1_New_Table( T1_Table* table,
|
|
FT_Int count,
|
|
FT_Memory memory );
|
|
|
|
LOCAL_DEF
|
|
FT_Error T1_Add_Table( T1_Table* table,
|
|
FT_Int index,
|
|
void* object,
|
|
FT_Int length );
|
|
|
|
LOCAL_DEF
|
|
void T1_Done_Table( T1_Table* table );
|
|
|
|
|
|
LOCAL_DEF
|
|
FT_String* CopyString( T1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
FT_Long CopyInteger( T1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
FT_Bool CopyBoolean( T1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
FT_Long CopyFloat( T1_Parser* parser,
|
|
FT_Int scale );
|
|
|
|
LOCAL_DEF
|
|
void CopyBBox( T1_Parser* parser,
|
|
FT_BBox* bbox );
|
|
|
|
LOCAL_DEF
|
|
void CopyMatrix( T1_Parser* parser,
|
|
FT_Matrix* matrix );
|
|
|
|
LOCAL_DEF
|
|
void CopyArray( T1_Parser* parser,
|
|
FT_Byte* num_elements,
|
|
FT_Short* elements,
|
|
FT_Int max_elements );
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* T1PARSE_H */
|
|
|
|
|
|
/* END */
|