9748807412
the "type1z" driver uses it to parse Type 1 charstrings (not to parse the Type 1 token stream yet though)..
363 lines
14 KiB
C
363 lines
14 KiB
C
/***************************************************************************/
|
|
/* */
|
|
/* z1parse.h */
|
|
/* */
|
|
/* Experimental 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. */
|
|
/* */
|
|
/***************************************************************************/
|
|
|
|
|
|
#ifndef Z1PARSE_H
|
|
#define Z1PARSE_H
|
|
|
|
#include <freetype/internal/t1types.h>
|
|
#include <freetype/internal/ftstream.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* simple enumeration type used to identify token types */
|
|
typedef enum Z1_Token_Type_
|
|
{
|
|
z1_token_none = 0,
|
|
z1_token_any,
|
|
z1_token_string,
|
|
z1_token_array,
|
|
|
|
/* do not remove */
|
|
z1_token_max
|
|
|
|
} Z1_Token_Type;
|
|
|
|
|
|
/* a simple structure used to identify tokens */
|
|
typedef struct Z1_Token_Rec_
|
|
{
|
|
FT_Byte* start; /* first character of token in input stream */
|
|
FT_Byte* limit; /* first character after the token */
|
|
Z1_Token_Type type; /* type of token.. */
|
|
|
|
} Z1_Token_Rec;
|
|
|
|
|
|
/* enumeration type used to identify object fields */
|
|
typedef enum Z1_Field_Type_
|
|
{
|
|
z1_field_none = 0,
|
|
z1_field_bool,
|
|
z1_field_integer,
|
|
z1_field_fixed,
|
|
z1_field_string,
|
|
z1_field_integer_array,
|
|
z1_field_fixed_array,
|
|
|
|
/* do not remove */
|
|
z1_field_max
|
|
|
|
} Z1_Field_Type;
|
|
|
|
|
|
/* structure type used to model object fields */
|
|
typedef struct Z1_Field_Rec_
|
|
{
|
|
Z1_Field_Type type; /* type of field */
|
|
FT_UInt offset; /* offset of field in object */
|
|
FT_Byte size; /* size of field in bytes */
|
|
FT_UInt array_max; /* maximum number of elements for array */
|
|
FT_UInt count_offset; /* offset of element count for arrays */
|
|
FT_Int flag_bit; /* bit number for field flag */
|
|
|
|
} Z1_Field_Rec;
|
|
|
|
|
|
#define Z1_FIELD_BOOL( _fname ) \
|
|
{ \
|
|
z1_field_bool, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE( _fname ), \
|
|
0, 0, 0 \
|
|
}
|
|
|
|
#define Z1_FIELD_NUM( _fname ) \
|
|
{ \
|
|
z1_field_integer, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE( _fname ), \
|
|
0, 0, 0 \
|
|
}
|
|
|
|
#define Z1_FIELD_FIXED( _fname, _power ) \
|
|
{ \
|
|
z1_field_fixed, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE( _fname ), \
|
|
0, 0, 0 \
|
|
}
|
|
|
|
#define Z1_FIELD_STRING( _fname ) \
|
|
{ \
|
|
z1_field_string, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE( _fname ), \
|
|
0, 0, 0 \
|
|
}
|
|
|
|
#define Z1_FIELD_NUM_ARRAY( _fname, _fcount, _fmax ) \
|
|
{ \
|
|
z1_field_integer, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE_DELTA( _fname ), \
|
|
_fmax, \
|
|
FT_FIELD_OFFSET( _fcount ), \
|
|
0 \
|
|
}
|
|
|
|
#define Z1_FIELD_FIXED_ARRAY( _fname, _fcount, _fmax ) \
|
|
{ \
|
|
z1_field_fixed, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE_DELTA( _fname ), \
|
|
_fmax, \
|
|
FT_FIELD_OFFSET( _fcount ), \
|
|
0 \
|
|
}
|
|
|
|
#define Z1_FIELD_NUM_ARRAY2( _fname, _fmax ) \
|
|
{ \
|
|
z1_field_integer, \
|
|
FT_FIELD_OFFSET( _fname ), \
|
|
FT_FIELD_SIZE_DELTA( _fname ), \
|
|
_fmax, \
|
|
0, 0 \
|
|
}
|
|
|
|
#define Z1_FIELD_FIXED_ARRAY2( _fname, _fmax ) \
|
|
{ \
|
|
z1_field_fixed, \
|
|
FT_FIELD_OFFSTE( _fname ), \
|
|
FT_FIELD_SIZE_DELTA( _fname ), \
|
|
_fmax, \
|
|
0, 0 \
|
|
}
|
|
|
|
|
|
/*************************************************************************/
|
|
/* */
|
|
/* <Struct> */
|
|
/* Z1_Table */
|
|
/* */
|
|
/* <Description> */
|
|
/* A Z1_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 the use of */
|
|
/* reallocation. */
|
|
/* */
|
|
/* cursor :: The current top of the grow heap within its block. */
|
|
/* */
|
|
/* capacity :: The current size of the heap block. Increments in */
|
|
/* 1kByte blocks. */
|
|
/* */
|
|
/* init :: A boolean. Set when the table has been initialized */
|
|
/* (the table user should set this field). */
|
|
/* */
|
|
/* max_elems :: The maximum number of elements in the table. */
|
|
/* */
|
|
/* num_elems :: The current number of elements in the table. */
|
|
/* */
|
|
/* elements :: A table of element addresses within the block. */
|
|
/* */
|
|
/* lengths :: A table of element sizes within the block. */
|
|
/* */
|
|
/* memory :: The memory object used for memory operations */
|
|
/* (allocation/reallocation). */
|
|
/* */
|
|
typedef struct Z1_Table_
|
|
{
|
|
FT_Byte* block; /* current memory block */
|
|
FT_Int cursor; /* current cursor in memory block */
|
|
FT_Int capacity; /* current size of memory block */
|
|
FT_Long init;
|
|
|
|
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;
|
|
|
|
} Z1_Table;
|
|
|
|
|
|
/*************************************************************************/
|
|
/* */
|
|
/* <Struct> */
|
|
/* Z1_Parser */
|
|
/* */
|
|
/* <Description> */
|
|
/* A Z1_Parser is an object used to parse a Type 1 fonts very */
|
|
/* quickly. */
|
|
/* */
|
|
/* <Fields> */
|
|
/* stream :: The current input stream. */
|
|
/* */
|
|
/* memory :: The current memory object. */
|
|
/* */
|
|
/* base_dict :: A pointer to the top-level dictionary. */
|
|
/* */
|
|
/* base_len :: The length in bytes of the top dictionary. */
|
|
/* */
|
|
/* private_dict :: A pointer to the private dictionary. */
|
|
/* */
|
|
/* private_len :: The length in bytes of the private dictionary. */
|
|
/* */
|
|
/* in_pfb :: A boolean. Indicates that we are handling a PFB */
|
|
/* file. */
|
|
/* */
|
|
/* in_memory :: A boolean. Indicates a memory-based stream. */
|
|
/* */
|
|
/* single_block :: A boolean. Indicates that the private dictionary */
|
|
/* is stored in lieu of the base dictionary. */
|
|
/* */
|
|
/* cursor :: The current parser cursor. */
|
|
/* */
|
|
/* limit :: The current parser limit (first byte after the */
|
|
/* current dictionary). */
|
|
/* */
|
|
/* error :: The current parsing error. */
|
|
/* */
|
|
typedef struct Z1_Parser_
|
|
{
|
|
FT_Stream stream;
|
|
FT_Memory memory;
|
|
|
|
FT_Byte* base_dict;
|
|
FT_Int base_len;
|
|
|
|
FT_Byte* private_dict;
|
|
FT_Int private_len;
|
|
|
|
FT_Byte in_pfb;
|
|
FT_Byte in_memory;
|
|
FT_Byte single_block;
|
|
|
|
FT_Byte* cursor;
|
|
FT_Byte* limit;
|
|
FT_Error error;
|
|
|
|
} Z1_Parser;
|
|
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_New_Table( Z1_Table* table,
|
|
FT_Int count,
|
|
FT_Memory memory );
|
|
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_Add_Table( Z1_Table* table,
|
|
FT_Int index,
|
|
void* object,
|
|
FT_Int length );
|
|
|
|
#if 0
|
|
LOCAL_DEF
|
|
void Z1_Done_Table( Z1_Table* table );
|
|
#endif
|
|
|
|
LOCAL_DEF
|
|
void Z1_Release_Table( Z1_Table* table );
|
|
|
|
LOCAL_DEF
|
|
FT_Long Z1_ToInt( Z1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
FT_Long Z1_ToFixed( Z1_Parser* parser,
|
|
FT_Int power_ten );
|
|
|
|
LOCAL_DEF
|
|
FT_Int Z1_ToCoordArray( Z1_Parser* parser,
|
|
FT_Int max_coords,
|
|
FT_Short* coords );
|
|
|
|
LOCAL_DEF
|
|
FT_Int Z1_ToFixedArray( Z1_Parser* parser,
|
|
FT_Int max_values,
|
|
FT_Fixed* values,
|
|
FT_Int power_ten );
|
|
|
|
#if 0
|
|
LOCAL_DEF
|
|
FT_String* Z1_ToString( Z1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
FT_Bool Z1_ToBool( Z1_Parser* parser );
|
|
#endif
|
|
|
|
|
|
LOCAL_DEF
|
|
void Z1_Skip_Spaces( Z1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
void Z1_ToToken( Z1_Parser* parser,
|
|
Z1_Token_Rec* token );
|
|
|
|
LOCAL_FUNC
|
|
void Z1_ToTokenArray( Z1_Parser* parser,
|
|
Z1_Token_Rec* tokens,
|
|
FT_UInt max_tokens,
|
|
FT_Int* pnum_tokens );
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_Load_Field( Z1_Parser* parser,
|
|
const Z1_Field_Rec* field,
|
|
void** objects,
|
|
FT_UInt max_objects,
|
|
FT_ULong* pflags );
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_Load_Field_Table( Z1_Parser* parser,
|
|
const Z1_Field_Rec* field,
|
|
void** objects,
|
|
FT_UInt max_objects,
|
|
FT_ULong* pflags );
|
|
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_New_Parser( Z1_Parser* parser,
|
|
FT_Stream stream,
|
|
FT_Memory memory );
|
|
|
|
LOCAL_DEF
|
|
FT_Error Z1_Get_Private_Dict( Z1_Parser* parser );
|
|
|
|
LOCAL_DEF
|
|
void Z1_Decrypt( FT_Byte* buffer,
|
|
FT_Int length,
|
|
FT_UShort seed );
|
|
|
|
LOCAL_DEF
|
|
void Z1_Done_Parser( Z1_Parser* parser );
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* Z1PARSE_H */
|
|
|
|
|
|
/* END */
|