1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* psaux.h */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* Auxiliary functions and data structures related to PostScript fonts */ 6*37da2899SCharles.Forsyth /* (specification). */ 7*37da2899SCharles.Forsyth /* */ 8*37da2899SCharles.Forsyth /* Copyright 1996-2001, 2002 by */ 9*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 10*37da2899SCharles.Forsyth /* */ 11*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 12*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 13*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 14*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 15*37da2899SCharles.Forsyth /* understand and accept it fully. */ 16*37da2899SCharles.Forsyth /* */ 17*37da2899SCharles.Forsyth /***************************************************************************/ 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth 20*37da2899SCharles.Forsyth #ifndef __PSAUX_H__ 21*37da2899SCharles.Forsyth #define __PSAUX_H__ 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth #include <ft2build.h> 25*37da2899SCharles.Forsyth #include FT_INTERNAL_OBJECTS_H 26*37da2899SCharles.Forsyth #include FT_INTERNAL_TYPE1_TYPES_H 27*37da2899SCharles.Forsyth 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth FT_BEGIN_HEADER 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth /*************************************************************************/ 33*37da2899SCharles.Forsyth /*************************************************************************/ 34*37da2899SCharles.Forsyth /***** *****/ 35*37da2899SCharles.Forsyth /***** T1_TABLE *****/ 36*37da2899SCharles.Forsyth /***** *****/ 37*37da2899SCharles.Forsyth /*************************************************************************/ 38*37da2899SCharles.Forsyth /*************************************************************************/ 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth 41*37da2899SCharles.Forsyth typedef struct PS_TableRec_* PS_Table; 42*37da2899SCharles.Forsyth typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth /*************************************************************************/ 46*37da2899SCharles.Forsyth /* */ 47*37da2899SCharles.Forsyth /* <Struct> */ 48*37da2899SCharles.Forsyth /* PS_Table_FuncsRec */ 49*37da2899SCharles.Forsyth /* */ 50*37da2899SCharles.Forsyth /* <Description> */ 51*37da2899SCharles.Forsyth /* A set of function pointers to manage PS_Table objects. */ 52*37da2899SCharles.Forsyth /* */ 53*37da2899SCharles.Forsyth /* <Fields> */ 54*37da2899SCharles.Forsyth /* table_init :: Used to initialize a table. */ 55*37da2899SCharles.Forsyth /* */ 56*37da2899SCharles.Forsyth /* table_done :: Finalizes resp. destroy a given table. */ 57*37da2899SCharles.Forsyth /* */ 58*37da2899SCharles.Forsyth /* table_add :: Adds a new object to a table. */ 59*37da2899SCharles.Forsyth /* */ 60*37da2899SCharles.Forsyth /* table_release :: Releases table data, then finalizes it. */ 61*37da2899SCharles.Forsyth /* */ 62*37da2899SCharles.Forsyth typedef struct PS_Table_FuncsRec_ 63*37da2899SCharles.Forsyth { 64*37da2899SCharles.Forsyth FT_Error 65*37da2899SCharles.Forsyth (*init)( PS_Table table, 66*37da2899SCharles.Forsyth FT_Int count, 67*37da2899SCharles.Forsyth FT_Memory memory ); 68*37da2899SCharles.Forsyth 69*37da2899SCharles.Forsyth void 70*37da2899SCharles.Forsyth (*done)( PS_Table table ); 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth FT_Error 73*37da2899SCharles.Forsyth (*add)( PS_Table table, 74*37da2899SCharles.Forsyth FT_Int index, 75*37da2899SCharles.Forsyth void* object, 76*37da2899SCharles.Forsyth FT_Int length ); 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsyth void 79*37da2899SCharles.Forsyth (*release)( PS_Table table ); 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth } PS_Table_FuncsRec; 82*37da2899SCharles.Forsyth 83*37da2899SCharles.Forsyth 84*37da2899SCharles.Forsyth /*************************************************************************/ 85*37da2899SCharles.Forsyth /* */ 86*37da2899SCharles.Forsyth /* <Struct> */ 87*37da2899SCharles.Forsyth /* PS_TableRec */ 88*37da2899SCharles.Forsyth /* */ 89*37da2899SCharles.Forsyth /* <Description> */ 90*37da2899SCharles.Forsyth /* A PS_Table is a simple object used to store an array of objects in */ 91*37da2899SCharles.Forsyth /* a single memory block. */ 92*37da2899SCharles.Forsyth /* */ 93*37da2899SCharles.Forsyth /* <Fields> */ 94*37da2899SCharles.Forsyth /* block :: The address in memory of the growheap's block. This */ 95*37da2899SCharles.Forsyth /* can change between two object adds, due to */ 96*37da2899SCharles.Forsyth /* reallocation. */ 97*37da2899SCharles.Forsyth /* */ 98*37da2899SCharles.Forsyth /* cursor :: The current top of the grow heap within its block. */ 99*37da2899SCharles.Forsyth /* */ 100*37da2899SCharles.Forsyth /* capacity :: The current size of the heap block. Increments by */ 101*37da2899SCharles.Forsyth /* 1kByte chunks. */ 102*37da2899SCharles.Forsyth /* */ 103*37da2899SCharles.Forsyth /* max_elems :: The maximum number of elements in table. */ 104*37da2899SCharles.Forsyth /* */ 105*37da2899SCharles.Forsyth /* num_elems :: The current number of elements in table. */ 106*37da2899SCharles.Forsyth /* */ 107*37da2899SCharles.Forsyth /* elements :: A table of element addresses within the block. */ 108*37da2899SCharles.Forsyth /* */ 109*37da2899SCharles.Forsyth /* lengths :: A table of element sizes within the block. */ 110*37da2899SCharles.Forsyth /* */ 111*37da2899SCharles.Forsyth /* memory :: The object used for memory operations */ 112*37da2899SCharles.Forsyth /* (alloc/realloc). */ 113*37da2899SCharles.Forsyth /* */ 114*37da2899SCharles.Forsyth /* funcs :: A table of method pointers for this object. */ 115*37da2899SCharles.Forsyth /* */ 116*37da2899SCharles.Forsyth typedef struct PS_TableRec_ 117*37da2899SCharles.Forsyth { 118*37da2899SCharles.Forsyth FT_Byte* block; /* current memory block */ 119*37da2899SCharles.Forsyth FT_Offset cursor; /* current cursor in memory block */ 120*37da2899SCharles.Forsyth FT_Offset capacity; /* current size of memory block */ 121*37da2899SCharles.Forsyth FT_Long init; 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth FT_Int max_elems; 124*37da2899SCharles.Forsyth FT_Int num_elems; 125*37da2899SCharles.Forsyth FT_Byte** elements; /* addresses of table elements */ 126*37da2899SCharles.Forsyth FT_Int* lengths; /* lengths of table elements */ 127*37da2899SCharles.Forsyth 128*37da2899SCharles.Forsyth FT_Memory memory; 129*37da2899SCharles.Forsyth PS_Table_FuncsRec funcs; 130*37da2899SCharles.Forsyth 131*37da2899SCharles.Forsyth } PS_TableRec; 132*37da2899SCharles.Forsyth 133*37da2899SCharles.Forsyth 134*37da2899SCharles.Forsyth /*************************************************************************/ 135*37da2899SCharles.Forsyth /*************************************************************************/ 136*37da2899SCharles.Forsyth /***** *****/ 137*37da2899SCharles.Forsyth /***** T1 FIELDS & TOKENS *****/ 138*37da2899SCharles.Forsyth /***** *****/ 139*37da2899SCharles.Forsyth /*************************************************************************/ 140*37da2899SCharles.Forsyth /*************************************************************************/ 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth typedef struct PS_ParserRec_* PS_Parser; 143*37da2899SCharles.Forsyth 144*37da2899SCharles.Forsyth typedef struct T1_TokenRec_* T1_Token; 145*37da2899SCharles.Forsyth 146*37da2899SCharles.Forsyth typedef struct T1_FieldRec_* T1_Field; 147*37da2899SCharles.Forsyth 148*37da2899SCharles.Forsyth 149*37da2899SCharles.Forsyth /* simple enumeration type used to identify token types */ 150*37da2899SCharles.Forsyth typedef enum T1_TokenType_ 151*37da2899SCharles.Forsyth { 152*37da2899SCharles.Forsyth T1_TOKEN_TYPE_NONE = 0, 153*37da2899SCharles.Forsyth T1_TOKEN_TYPE_ANY, 154*37da2899SCharles.Forsyth T1_TOKEN_TYPE_STRING, 155*37da2899SCharles.Forsyth T1_TOKEN_TYPE_ARRAY, 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth /* do not remove */ 158*37da2899SCharles.Forsyth T1_TOKEN_TYPE_MAX 159*37da2899SCharles.Forsyth 160*37da2899SCharles.Forsyth } T1_TokenType; 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth 163*37da2899SCharles.Forsyth /* a simple structure used to identify tokens */ 164*37da2899SCharles.Forsyth typedef struct T1_TokenRec_ 165*37da2899SCharles.Forsyth { 166*37da2899SCharles.Forsyth FT_Byte* start; /* first character of token in input stream */ 167*37da2899SCharles.Forsyth FT_Byte* limit; /* first character after the token */ 168*37da2899SCharles.Forsyth T1_TokenType type; /* type of token */ 169*37da2899SCharles.Forsyth 170*37da2899SCharles.Forsyth } T1_TokenRec; 171*37da2899SCharles.Forsyth 172*37da2899SCharles.Forsyth 173*37da2899SCharles.Forsyth /* enumeration type used to identify object fields */ 174*37da2899SCharles.Forsyth typedef enum T1_FieldType_ 175*37da2899SCharles.Forsyth { 176*37da2899SCharles.Forsyth T1_FIELD_TYPE_NONE = 0, 177*37da2899SCharles.Forsyth T1_FIELD_TYPE_BOOL, 178*37da2899SCharles.Forsyth T1_FIELD_TYPE_INTEGER, 179*37da2899SCharles.Forsyth T1_FIELD_TYPE_FIXED, 180*37da2899SCharles.Forsyth T1_FIELD_TYPE_STRING, 181*37da2899SCharles.Forsyth T1_FIELD_TYPE_BBOX, 182*37da2899SCharles.Forsyth T1_FIELD_TYPE_INTEGER_ARRAY, 183*37da2899SCharles.Forsyth T1_FIELD_TYPE_FIXED_ARRAY, 184*37da2899SCharles.Forsyth T1_FIELD_TYPE_CALLBACK, 185*37da2899SCharles.Forsyth 186*37da2899SCharles.Forsyth /* do not remove */ 187*37da2899SCharles.Forsyth T1_FIELD_TYPE_MAX 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth } T1_FieldType; 190*37da2899SCharles.Forsyth 191*37da2899SCharles.Forsyth 192*37da2899SCharles.Forsyth typedef enum T1_FieldLocation_ 193*37da2899SCharles.Forsyth { 194*37da2899SCharles.Forsyth T1_FIELD_LOCATION_CID_INFO, 195*37da2899SCharles.Forsyth T1_FIELD_LOCATION_FONT_DICT, 196*37da2899SCharles.Forsyth T1_FIELD_LOCATION_FONT_INFO, 197*37da2899SCharles.Forsyth T1_FIELD_LOCATION_PRIVATE, 198*37da2899SCharles.Forsyth T1_FIELD_LOCATION_BBOX, 199*37da2899SCharles.Forsyth 200*37da2899SCharles.Forsyth /* do not remove */ 201*37da2899SCharles.Forsyth T1_FIELD_LOCATION_MAX 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth } T1_FieldLocation; 204*37da2899SCharles.Forsyth 205*37da2899SCharles.Forsyth 206*37da2899SCharles.Forsyth typedef void 207*37da2899SCharles.Forsyth (*T1_Field_ParseFunc)( FT_Face face, 208*37da2899SCharles.Forsyth FT_Pointer parser ); 209*37da2899SCharles.Forsyth 210*37da2899SCharles.Forsyth 211*37da2899SCharles.Forsyth /* structure type used to model object fields */ 212*37da2899SCharles.Forsyth typedef struct T1_FieldRec_ 213*37da2899SCharles.Forsyth { 214*37da2899SCharles.Forsyth const char* ident; /* field identifier */ 215*37da2899SCharles.Forsyth T1_FieldLocation location; 216*37da2899SCharles.Forsyth T1_FieldType type; /* type of field */ 217*37da2899SCharles.Forsyth T1_Field_ParseFunc reader; 218*37da2899SCharles.Forsyth FT_UInt offset; /* offset of field in object */ 219*37da2899SCharles.Forsyth FT_Byte size; /* size of field in bytes */ 220*37da2899SCharles.Forsyth FT_UInt array_max; /* maximal number of elements for */ 221*37da2899SCharles.Forsyth /* array */ 222*37da2899SCharles.Forsyth FT_UInt count_offset; /* offset of element count for */ 223*37da2899SCharles.Forsyth /* arrays */ 224*37da2899SCharles.Forsyth } T1_FieldRec; 225*37da2899SCharles.Forsyth 226*37da2899SCharles.Forsyth 227*37da2899SCharles.Forsyth #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname ) \ 228*37da2899SCharles.Forsyth { \ 229*37da2899SCharles.Forsyth _ident, T1CODE, _type, \ 230*37da2899SCharles.Forsyth 0, \ 231*37da2899SCharles.Forsyth FT_FIELD_OFFSET( _fname ), \ 232*37da2899SCharles.Forsyth FT_FIELD_SIZE( _fname ), \ 233*37da2899SCharles.Forsyth 0, 0 \ 234*37da2899SCharles.Forsyth }, 235*37da2899SCharles.Forsyth 236*37da2899SCharles.Forsyth #define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \ 237*37da2899SCharles.Forsyth { \ 238*37da2899SCharles.Forsyth _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ 239*37da2899SCharles.Forsyth (T1_Field_ParseFunc)_reader, \ 240*37da2899SCharles.Forsyth 0, 0, \ 241*37da2899SCharles.Forsyth 0, 0 \ 242*37da2899SCharles.Forsyth }, 243*37da2899SCharles.Forsyth 244*37da2899SCharles.Forsyth #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \ 245*37da2899SCharles.Forsyth { \ 246*37da2899SCharles.Forsyth _ident, T1CODE, _type, \ 247*37da2899SCharles.Forsyth 0, \ 248*37da2899SCharles.Forsyth FT_FIELD_OFFSET( _fname ), \ 249*37da2899SCharles.Forsyth FT_FIELD_SIZE_DELTA( _fname ), \ 250*37da2899SCharles.Forsyth _max, \ 251*37da2899SCharles.Forsyth FT_FIELD_OFFSET( num_ ## _fname ) \ 252*37da2899SCharles.Forsyth }, 253*37da2899SCharles.Forsyth 254*37da2899SCharles.Forsyth #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max ) \ 255*37da2899SCharles.Forsyth { \ 256*37da2899SCharles.Forsyth _ident, T1CODE, _type, \ 257*37da2899SCharles.Forsyth 0, \ 258*37da2899SCharles.Forsyth FT_FIELD_OFFSET( _fname ), \ 259*37da2899SCharles.Forsyth FT_FIELD_SIZE_DELTA( _fname ), \ 260*37da2899SCharles.Forsyth _max, 0 \ 261*37da2899SCharles.Forsyth }, 262*37da2899SCharles.Forsyth 263*37da2899SCharles.Forsyth 264*37da2899SCharles.Forsyth #define T1_FIELD_TYPE_BOOL( _ident, _fname ) \ 265*37da2899SCharles.Forsyth T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname ) 266*37da2899SCharles.Forsyth 267*37da2899SCharles.Forsyth #define T1_FIELD_NUM( _ident, _fname ) \ 268*37da2899SCharles.Forsyth T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname ) 269*37da2899SCharles.Forsyth 270*37da2899SCharles.Forsyth #define T1_FIELD_FIXED( _ident, _fname ) \ 271*37da2899SCharles.Forsyth T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname ) 272*37da2899SCharles.Forsyth 273*37da2899SCharles.Forsyth #define T1_FIELD_STRING( _ident, _fname ) \ 274*37da2899SCharles.Forsyth T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname ) 275*37da2899SCharles.Forsyth 276*37da2899SCharles.Forsyth #define T1_FIELD_BBOX( _ident, _fname ) \ 277*37da2899SCharles.Forsyth T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname ) 278*37da2899SCharles.Forsyth 279*37da2899SCharles.Forsyth 280*37da2899SCharles.Forsyth #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \ 281*37da2899SCharles.Forsyth T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 282*37da2899SCharles.Forsyth _fname, _fmax ) 283*37da2899SCharles.Forsyth 284*37da2899SCharles.Forsyth #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \ 285*37da2899SCharles.Forsyth T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 286*37da2899SCharles.Forsyth _fname, _fmax ) 287*37da2899SCharles.Forsyth 288*37da2899SCharles.Forsyth #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \ 289*37da2899SCharles.Forsyth T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 290*37da2899SCharles.Forsyth _fname, _fmax ) 291*37da2899SCharles.Forsyth 292*37da2899SCharles.Forsyth #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \ 293*37da2899SCharles.Forsyth T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 294*37da2899SCharles.Forsyth _fname, _fmax ) 295*37da2899SCharles.Forsyth 296*37da2899SCharles.Forsyth #define T1_FIELD_CALLBACK( _ident, _name ) \ 297*37da2899SCharles.Forsyth T1_NEW_CALLBACK_FIELD( _ident, _name ) 298*37da2899SCharles.Forsyth 299*37da2899SCharles.Forsyth 300*37da2899SCharles.Forsyth /*************************************************************************/ 301*37da2899SCharles.Forsyth /*************************************************************************/ 302*37da2899SCharles.Forsyth /***** *****/ 303*37da2899SCharles.Forsyth /***** T1 PARSER *****/ 304*37da2899SCharles.Forsyth /***** *****/ 305*37da2899SCharles.Forsyth /*************************************************************************/ 306*37da2899SCharles.Forsyth /*************************************************************************/ 307*37da2899SCharles.Forsyth 308*37da2899SCharles.Forsyth typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; 309*37da2899SCharles.Forsyth 310*37da2899SCharles.Forsyth typedef struct PS_Parser_FuncsRec_ 311*37da2899SCharles.Forsyth { 312*37da2899SCharles.Forsyth void 313*37da2899SCharles.Forsyth (*init)( PS_Parser parser, 314*37da2899SCharles.Forsyth FT_Byte* base, 315*37da2899SCharles.Forsyth FT_Byte* limit, 316*37da2899SCharles.Forsyth FT_Memory memory ); 317*37da2899SCharles.Forsyth 318*37da2899SCharles.Forsyth void 319*37da2899SCharles.Forsyth (*done)( PS_Parser parser ); 320*37da2899SCharles.Forsyth 321*37da2899SCharles.Forsyth void 322*37da2899SCharles.Forsyth (*skip_spaces)( PS_Parser parser ); 323*37da2899SCharles.Forsyth void 324*37da2899SCharles.Forsyth (*skip_alpha)( PS_Parser parser ); 325*37da2899SCharles.Forsyth 326*37da2899SCharles.Forsyth FT_Long 327*37da2899SCharles.Forsyth (*to_int)( PS_Parser parser ); 328*37da2899SCharles.Forsyth FT_Fixed 329*37da2899SCharles.Forsyth (*to_fixed)( PS_Parser parser, 330*37da2899SCharles.Forsyth FT_Int power_ten ); 331*37da2899SCharles.Forsyth FT_Int 332*37da2899SCharles.Forsyth (*to_coord_array)( PS_Parser parser, 333*37da2899SCharles.Forsyth FT_Int max_coords, 334*37da2899SCharles.Forsyth FT_Short* coords ); 335*37da2899SCharles.Forsyth FT_Int 336*37da2899SCharles.Forsyth (*to_fixed_array)( PS_Parser parser, 337*37da2899SCharles.Forsyth FT_Int max_values, 338*37da2899SCharles.Forsyth FT_Fixed* values, 339*37da2899SCharles.Forsyth FT_Int power_ten ); 340*37da2899SCharles.Forsyth 341*37da2899SCharles.Forsyth void 342*37da2899SCharles.Forsyth (*to_token)( PS_Parser parser, 343*37da2899SCharles.Forsyth T1_Token token ); 344*37da2899SCharles.Forsyth void 345*37da2899SCharles.Forsyth (*to_token_array)( PS_Parser parser, 346*37da2899SCharles.Forsyth T1_Token tokens, 347*37da2899SCharles.Forsyth FT_UInt max_tokens, 348*37da2899SCharles.Forsyth FT_Int* pnum_tokens ); 349*37da2899SCharles.Forsyth 350*37da2899SCharles.Forsyth FT_Error 351*37da2899SCharles.Forsyth (*load_field)( PS_Parser parser, 352*37da2899SCharles.Forsyth const T1_Field field, 353*37da2899SCharles.Forsyth void** objects, 354*37da2899SCharles.Forsyth FT_UInt max_objects, 355*37da2899SCharles.Forsyth FT_ULong* pflags ); 356*37da2899SCharles.Forsyth 357*37da2899SCharles.Forsyth FT_Error 358*37da2899SCharles.Forsyth (*load_field_table)( PS_Parser parser, 359*37da2899SCharles.Forsyth const T1_Field field, 360*37da2899SCharles.Forsyth void** objects, 361*37da2899SCharles.Forsyth FT_UInt max_objects, 362*37da2899SCharles.Forsyth FT_ULong* pflags ); 363*37da2899SCharles.Forsyth 364*37da2899SCharles.Forsyth } PS_Parser_FuncsRec; 365*37da2899SCharles.Forsyth 366*37da2899SCharles.Forsyth 367*37da2899SCharles.Forsyth /*************************************************************************/ 368*37da2899SCharles.Forsyth /* */ 369*37da2899SCharles.Forsyth /* <Struct> */ 370*37da2899SCharles.Forsyth /* PS_ParserRec */ 371*37da2899SCharles.Forsyth /* */ 372*37da2899SCharles.Forsyth /* <Description> */ 373*37da2899SCharles.Forsyth /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ 374*37da2899SCharles.Forsyth /* */ 375*37da2899SCharles.Forsyth /* <Fields> */ 376*37da2899SCharles.Forsyth /* cursor :: The current position in the text. */ 377*37da2899SCharles.Forsyth /* */ 378*37da2899SCharles.Forsyth /* base :: Start of the processed text. */ 379*37da2899SCharles.Forsyth /* */ 380*37da2899SCharles.Forsyth /* limit :: End of the processed text. */ 381*37da2899SCharles.Forsyth /* */ 382*37da2899SCharles.Forsyth /* error :: The last error returned. */ 383*37da2899SCharles.Forsyth /* */ 384*37da2899SCharles.Forsyth /* memory :: The object used for memory operations (alloc/realloc). */ 385*37da2899SCharles.Forsyth /* */ 386*37da2899SCharles.Forsyth /* funcs :: A table of functions for the parser. */ 387*37da2899SCharles.Forsyth /* */ 388*37da2899SCharles.Forsyth typedef struct PS_ParserRec_ 389*37da2899SCharles.Forsyth { 390*37da2899SCharles.Forsyth FT_Byte* cursor; 391*37da2899SCharles.Forsyth FT_Byte* base; 392*37da2899SCharles.Forsyth FT_Byte* limit; 393*37da2899SCharles.Forsyth FT_Error error; 394*37da2899SCharles.Forsyth FT_Memory memory; 395*37da2899SCharles.Forsyth 396*37da2899SCharles.Forsyth PS_Parser_FuncsRec funcs; 397*37da2899SCharles.Forsyth 398*37da2899SCharles.Forsyth } PS_ParserRec; 399*37da2899SCharles.Forsyth 400*37da2899SCharles.Forsyth 401*37da2899SCharles.Forsyth /*************************************************************************/ 402*37da2899SCharles.Forsyth /*************************************************************************/ 403*37da2899SCharles.Forsyth /***** *****/ 404*37da2899SCharles.Forsyth /***** T1 BUILDER *****/ 405*37da2899SCharles.Forsyth /***** *****/ 406*37da2899SCharles.Forsyth /*************************************************************************/ 407*37da2899SCharles.Forsyth /*************************************************************************/ 408*37da2899SCharles.Forsyth 409*37da2899SCharles.Forsyth 410*37da2899SCharles.Forsyth typedef struct T1_BuilderRec_* T1_Builder; 411*37da2899SCharles.Forsyth 412*37da2899SCharles.Forsyth 413*37da2899SCharles.Forsyth typedef FT_Error 414*37da2899SCharles.Forsyth (*T1_Builder_Check_Points_Func)( T1_Builder builder, 415*37da2899SCharles.Forsyth FT_Int count ); 416*37da2899SCharles.Forsyth 417*37da2899SCharles.Forsyth typedef void 418*37da2899SCharles.Forsyth (*T1_Builder_Add_Point_Func)( T1_Builder builder, 419*37da2899SCharles.Forsyth FT_Pos x, 420*37da2899SCharles.Forsyth FT_Pos y, 421*37da2899SCharles.Forsyth FT_Byte flag ); 422*37da2899SCharles.Forsyth 423*37da2899SCharles.Forsyth typedef FT_Error 424*37da2899SCharles.Forsyth (*T1_Builder_Add_Point1_Func)( T1_Builder builder, 425*37da2899SCharles.Forsyth FT_Pos x, 426*37da2899SCharles.Forsyth FT_Pos y ); 427*37da2899SCharles.Forsyth 428*37da2899SCharles.Forsyth typedef FT_Error 429*37da2899SCharles.Forsyth (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); 430*37da2899SCharles.Forsyth 431*37da2899SCharles.Forsyth typedef FT_Error 432*37da2899SCharles.Forsyth (*T1_Builder_Start_Point_Func)( T1_Builder builder, 433*37da2899SCharles.Forsyth FT_Pos x, 434*37da2899SCharles.Forsyth FT_Pos y ); 435*37da2899SCharles.Forsyth 436*37da2899SCharles.Forsyth typedef void 437*37da2899SCharles.Forsyth (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); 438*37da2899SCharles.Forsyth 439*37da2899SCharles.Forsyth 440*37da2899SCharles.Forsyth typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; 441*37da2899SCharles.Forsyth 442*37da2899SCharles.Forsyth typedef struct T1_Builder_FuncsRec_ 443*37da2899SCharles.Forsyth { 444*37da2899SCharles.Forsyth void 445*37da2899SCharles.Forsyth (*init)( T1_Builder builder, 446*37da2899SCharles.Forsyth FT_Face face, 447*37da2899SCharles.Forsyth FT_Size size, 448*37da2899SCharles.Forsyth FT_GlyphSlot slot, 449*37da2899SCharles.Forsyth FT_Bool hinting ); 450*37da2899SCharles.Forsyth 451*37da2899SCharles.Forsyth void 452*37da2899SCharles.Forsyth (*done)( T1_Builder builder ); 453*37da2899SCharles.Forsyth 454*37da2899SCharles.Forsyth T1_Builder_Check_Points_Func check_points; 455*37da2899SCharles.Forsyth T1_Builder_Add_Point_Func add_point; 456*37da2899SCharles.Forsyth T1_Builder_Add_Point1_Func add_point1; 457*37da2899SCharles.Forsyth T1_Builder_Add_Contour_Func add_contour; 458*37da2899SCharles.Forsyth T1_Builder_Start_Point_Func start_point; 459*37da2899SCharles.Forsyth T1_Builder_Close_Contour_Func close_contour; 460*37da2899SCharles.Forsyth 461*37da2899SCharles.Forsyth } T1_Builder_FuncsRec; 462*37da2899SCharles.Forsyth 463*37da2899SCharles.Forsyth 464*37da2899SCharles.Forsyth /*************************************************************************/ 465*37da2899SCharles.Forsyth /* */ 466*37da2899SCharles.Forsyth /* <Structure> */ 467*37da2899SCharles.Forsyth /* T1_BuilderRec */ 468*37da2899SCharles.Forsyth /* */ 469*37da2899SCharles.Forsyth /* <Description> */ 470*37da2899SCharles.Forsyth /* A structure used during glyph loading to store its outline. */ 471*37da2899SCharles.Forsyth /* */ 472*37da2899SCharles.Forsyth /* <Fields> */ 473*37da2899SCharles.Forsyth /* memory :: The current memory object. */ 474*37da2899SCharles.Forsyth /* */ 475*37da2899SCharles.Forsyth /* face :: The current face object. */ 476*37da2899SCharles.Forsyth /* */ 477*37da2899SCharles.Forsyth /* glyph :: The current glyph slot. */ 478*37da2899SCharles.Forsyth /* */ 479*37da2899SCharles.Forsyth /* loader :: XXX */ 480*37da2899SCharles.Forsyth /* */ 481*37da2899SCharles.Forsyth /* base :: The base glyph outline. */ 482*37da2899SCharles.Forsyth /* */ 483*37da2899SCharles.Forsyth /* current :: The current glyph outline. */ 484*37da2899SCharles.Forsyth /* */ 485*37da2899SCharles.Forsyth /* max_points :: maximum points in builder outline */ 486*37da2899SCharles.Forsyth /* */ 487*37da2899SCharles.Forsyth /* max_contours :: Maximal number of contours in builder outline. */ 488*37da2899SCharles.Forsyth /* */ 489*37da2899SCharles.Forsyth /* last :: The last point position. */ 490*37da2899SCharles.Forsyth /* */ 491*37da2899SCharles.Forsyth /* scale_x :: The horizontal scale (FUnits to sub-pixels). */ 492*37da2899SCharles.Forsyth /* */ 493*37da2899SCharles.Forsyth /* scale_y :: The vertical scale (FUnits to sub-pixels). */ 494*37da2899SCharles.Forsyth /* */ 495*37da2899SCharles.Forsyth /* pos_x :: The horizontal translation (if composite glyph). */ 496*37da2899SCharles.Forsyth /* */ 497*37da2899SCharles.Forsyth /* pos_y :: The vertical translation (if composite glyph). */ 498*37da2899SCharles.Forsyth /* */ 499*37da2899SCharles.Forsyth /* left_bearing :: The left side bearing point. */ 500*37da2899SCharles.Forsyth /* */ 501*37da2899SCharles.Forsyth /* advance :: The horizontal advance vector. */ 502*37da2899SCharles.Forsyth /* */ 503*37da2899SCharles.Forsyth /* bbox :: Unused. */ 504*37da2899SCharles.Forsyth /* */ 505*37da2899SCharles.Forsyth /* path_begun :: A flag which indicates that a new path has begun. */ 506*37da2899SCharles.Forsyth /* */ 507*37da2899SCharles.Forsyth /* load_points :: If this flag is not set, no points are loaded. */ 508*37da2899SCharles.Forsyth /* */ 509*37da2899SCharles.Forsyth /* no_recurse :: Set but not used. */ 510*37da2899SCharles.Forsyth /* */ 511*37da2899SCharles.Forsyth /* error :: An error code that is only used to report memory */ 512*37da2899SCharles.Forsyth /* allocation problems. */ 513*37da2899SCharles.Forsyth /* */ 514*37da2899SCharles.Forsyth /* metrics_only :: A boolean indicating that we only want to compute */ 515*37da2899SCharles.Forsyth /* the metrics of a given glyph, not load all of its */ 516*37da2899SCharles.Forsyth /* points. */ 517*37da2899SCharles.Forsyth /* */ 518*37da2899SCharles.Forsyth /* funcs :: An array of function pointers for the builder. */ 519*37da2899SCharles.Forsyth /* */ 520*37da2899SCharles.Forsyth typedef struct T1_BuilderRec_ 521*37da2899SCharles.Forsyth { 522*37da2899SCharles.Forsyth FT_Memory memory; 523*37da2899SCharles.Forsyth FT_Face face; 524*37da2899SCharles.Forsyth FT_GlyphSlot glyph; 525*37da2899SCharles.Forsyth FT_GlyphLoader loader; 526*37da2899SCharles.Forsyth FT_Outline* base; 527*37da2899SCharles.Forsyth FT_Outline* current; 528*37da2899SCharles.Forsyth 529*37da2899SCharles.Forsyth FT_Vector last; 530*37da2899SCharles.Forsyth 531*37da2899SCharles.Forsyth FT_Fixed scale_x; 532*37da2899SCharles.Forsyth FT_Fixed scale_y; 533*37da2899SCharles.Forsyth 534*37da2899SCharles.Forsyth FT_Pos pos_x; 535*37da2899SCharles.Forsyth FT_Pos pos_y; 536*37da2899SCharles.Forsyth 537*37da2899SCharles.Forsyth FT_Vector left_bearing; 538*37da2899SCharles.Forsyth FT_Vector advance; 539*37da2899SCharles.Forsyth 540*37da2899SCharles.Forsyth FT_BBox bbox; /* bounding box */ 541*37da2899SCharles.Forsyth FT_Bool path_begun; 542*37da2899SCharles.Forsyth FT_Bool load_points; 543*37da2899SCharles.Forsyth FT_Bool no_recurse; 544*37da2899SCharles.Forsyth FT_Bool shift; 545*37da2899SCharles.Forsyth 546*37da2899SCharles.Forsyth FT_Error error; /* only used for memory errors */ 547*37da2899SCharles.Forsyth FT_Bool metrics_only; 548*37da2899SCharles.Forsyth 549*37da2899SCharles.Forsyth void* hints_funcs; /* hinter-specific */ 550*37da2899SCharles.Forsyth void* hints_globals; /* hinter-specific */ 551*37da2899SCharles.Forsyth 552*37da2899SCharles.Forsyth T1_Builder_FuncsRec funcs; 553*37da2899SCharles.Forsyth 554*37da2899SCharles.Forsyth } T1_BuilderRec; 555*37da2899SCharles.Forsyth 556*37da2899SCharles.Forsyth 557*37da2899SCharles.Forsyth /*************************************************************************/ 558*37da2899SCharles.Forsyth /*************************************************************************/ 559*37da2899SCharles.Forsyth /***** *****/ 560*37da2899SCharles.Forsyth /***** T1 DECODER *****/ 561*37da2899SCharles.Forsyth /***** *****/ 562*37da2899SCharles.Forsyth /*************************************************************************/ 563*37da2899SCharles.Forsyth /*************************************************************************/ 564*37da2899SCharles.Forsyth 565*37da2899SCharles.Forsyth #if 0 566*37da2899SCharles.Forsyth 567*37da2899SCharles.Forsyth /*************************************************************************/ 568*37da2899SCharles.Forsyth /* */ 569*37da2899SCharles.Forsyth /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ 570*37da2899SCharles.Forsyth /* calls during glyph loading. */ 571*37da2899SCharles.Forsyth /* */ 572*37da2899SCharles.Forsyth #define T1_MAX_SUBRS_CALLS 8 573*37da2899SCharles.Forsyth 574*37da2899SCharles.Forsyth 575*37da2899SCharles.Forsyth /*************************************************************************/ 576*37da2899SCharles.Forsyth /* */ 577*37da2899SCharles.Forsyth /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ 578*37da2899SCharles.Forsyth /* minimum of 16 is required. */ 579*37da2899SCharles.Forsyth /* */ 580*37da2899SCharles.Forsyth #define T1_MAX_CHARSTRINGS_OPERANDS 32 581*37da2899SCharles.Forsyth 582*37da2899SCharles.Forsyth #endif /* 0 */ 583*37da2899SCharles.Forsyth 584*37da2899SCharles.Forsyth 585*37da2899SCharles.Forsyth typedef struct T1_Decoder_ZoneRec_ 586*37da2899SCharles.Forsyth { 587*37da2899SCharles.Forsyth FT_Byte* cursor; 588*37da2899SCharles.Forsyth FT_Byte* base; 589*37da2899SCharles.Forsyth FT_Byte* limit; 590*37da2899SCharles.Forsyth 591*37da2899SCharles.Forsyth } T1_Decoder_ZoneRec, *T1_Decoder_Zone; 592*37da2899SCharles.Forsyth 593*37da2899SCharles.Forsyth 594*37da2899SCharles.Forsyth typedef struct T1_DecoderRec_* T1_Decoder; 595*37da2899SCharles.Forsyth typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; 596*37da2899SCharles.Forsyth 597*37da2899SCharles.Forsyth 598*37da2899SCharles.Forsyth typedef FT_Error 599*37da2899SCharles.Forsyth (*T1_Decoder_Callback)( T1_Decoder decoder, 600*37da2899SCharles.Forsyth FT_UInt glyph_index ); 601*37da2899SCharles.Forsyth 602*37da2899SCharles.Forsyth 603*37da2899SCharles.Forsyth typedef struct T1_Decoder_FuncsRec_ 604*37da2899SCharles.Forsyth { 605*37da2899SCharles.Forsyth FT_Error 606*37da2899SCharles.Forsyth (*init)( T1_Decoder decoder, 607*37da2899SCharles.Forsyth FT_Face face, 608*37da2899SCharles.Forsyth FT_Size size, 609*37da2899SCharles.Forsyth FT_GlyphSlot slot, 610*37da2899SCharles.Forsyth FT_Byte** glyph_names, 611*37da2899SCharles.Forsyth PS_Blend blend, 612*37da2899SCharles.Forsyth FT_Bool hinting, 613*37da2899SCharles.Forsyth FT_Render_Mode hint_mode, 614*37da2899SCharles.Forsyth T1_Decoder_Callback callback ); 615*37da2899SCharles.Forsyth 616*37da2899SCharles.Forsyth void 617*37da2899SCharles.Forsyth (*done)( T1_Decoder decoder ); 618*37da2899SCharles.Forsyth 619*37da2899SCharles.Forsyth FT_Error 620*37da2899SCharles.Forsyth (*parse_charstrings)( T1_Decoder decoder, 621*37da2899SCharles.Forsyth FT_Byte* base, 622*37da2899SCharles.Forsyth FT_UInt len ); 623*37da2899SCharles.Forsyth 624*37da2899SCharles.Forsyth } T1_Decoder_FuncsRec; 625*37da2899SCharles.Forsyth 626*37da2899SCharles.Forsyth 627*37da2899SCharles.Forsyth typedef struct T1_DecoderRec_ 628*37da2899SCharles.Forsyth { 629*37da2899SCharles.Forsyth T1_BuilderRec builder; 630*37da2899SCharles.Forsyth 631*37da2899SCharles.Forsyth FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; 632*37da2899SCharles.Forsyth FT_Long* top; 633*37da2899SCharles.Forsyth 634*37da2899SCharles.Forsyth T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; 635*37da2899SCharles.Forsyth T1_Decoder_Zone zone; 636*37da2899SCharles.Forsyth 637*37da2899SCharles.Forsyth PSNames_Service psnames; /* for seac */ 638*37da2899SCharles.Forsyth FT_UInt num_glyphs; 639*37da2899SCharles.Forsyth FT_Byte** glyph_names; 640*37da2899SCharles.Forsyth 641*37da2899SCharles.Forsyth FT_Int lenIV; /* internal for sub routine calls */ 642*37da2899SCharles.Forsyth FT_UInt num_subrs; 643*37da2899SCharles.Forsyth FT_Byte** subrs; 644*37da2899SCharles.Forsyth FT_Int* subrs_len; /* array of subrs length (optional) */ 645*37da2899SCharles.Forsyth 646*37da2899SCharles.Forsyth FT_Matrix font_matrix; 647*37da2899SCharles.Forsyth FT_Vector font_offset; 648*37da2899SCharles.Forsyth 649*37da2899SCharles.Forsyth FT_Int flex_state; 650*37da2899SCharles.Forsyth FT_Int num_flex_vectors; 651*37da2899SCharles.Forsyth FT_Vector flex_vectors[7]; 652*37da2899SCharles.Forsyth 653*37da2899SCharles.Forsyth PS_Blend blend; /* for multiple master support */ 654*37da2899SCharles.Forsyth 655*37da2899SCharles.Forsyth FT_UInt32 hint_flags; 656*37da2899SCharles.Forsyth FT_Render_Mode hint_mode; 657*37da2899SCharles.Forsyth 658*37da2899SCharles.Forsyth T1_Decoder_Callback parse_callback; 659*37da2899SCharles.Forsyth T1_Decoder_FuncsRec funcs; 660*37da2899SCharles.Forsyth 661*37da2899SCharles.Forsyth } T1_DecoderRec; 662*37da2899SCharles.Forsyth 663*37da2899SCharles.Forsyth 664*37da2899SCharles.Forsyth /*************************************************************************/ 665*37da2899SCharles.Forsyth /*************************************************************************/ 666*37da2899SCharles.Forsyth /***** *****/ 667*37da2899SCharles.Forsyth /***** TYPE1 CHARMAPS *****/ 668*37da2899SCharles.Forsyth /***** *****/ 669*37da2899SCharles.Forsyth /*************************************************************************/ 670*37da2899SCharles.Forsyth /*************************************************************************/ 671*37da2899SCharles.Forsyth 672*37da2899SCharles.Forsyth typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; 673*37da2899SCharles.Forsyth 674*37da2899SCharles.Forsyth typedef struct T1_CMap_ClassesRec_ 675*37da2899SCharles.Forsyth { 676*37da2899SCharles.Forsyth FT_CMap_Class standard; 677*37da2899SCharles.Forsyth FT_CMap_Class expert; 678*37da2899SCharles.Forsyth FT_CMap_Class custom; 679*37da2899SCharles.Forsyth FT_CMap_Class unicode; 680*37da2899SCharles.Forsyth 681*37da2899SCharles.Forsyth } T1_CMap_ClassesRec; 682*37da2899SCharles.Forsyth 683*37da2899SCharles.Forsyth 684*37da2899SCharles.Forsyth /*************************************************************************/ 685*37da2899SCharles.Forsyth /*************************************************************************/ 686*37da2899SCharles.Forsyth /***** *****/ 687*37da2899SCharles.Forsyth /***** PSAux Module Interface *****/ 688*37da2899SCharles.Forsyth /***** *****/ 689*37da2899SCharles.Forsyth /*************************************************************************/ 690*37da2899SCharles.Forsyth /*************************************************************************/ 691*37da2899SCharles.Forsyth 692*37da2899SCharles.Forsyth typedef struct PSAux_ServiceRec_ 693*37da2899SCharles.Forsyth { 694*37da2899SCharles.Forsyth /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ 695*37da2899SCharles.Forsyth const PS_Table_FuncsRec* ps_table_funcs; 696*37da2899SCharles.Forsyth const PS_Parser_FuncsRec* ps_parser_funcs; 697*37da2899SCharles.Forsyth const T1_Builder_FuncsRec* t1_builder_funcs; 698*37da2899SCharles.Forsyth const T1_Decoder_FuncsRec* t1_decoder_funcs; 699*37da2899SCharles.Forsyth 700*37da2899SCharles.Forsyth void 701*37da2899SCharles.Forsyth (*t1_decrypt)( FT_Byte* buffer, 702*37da2899SCharles.Forsyth FT_Offset length, 703*37da2899SCharles.Forsyth FT_UShort seed ); 704*37da2899SCharles.Forsyth 705*37da2899SCharles.Forsyth T1_CMap_Classes t1_cmap_classes; 706*37da2899SCharles.Forsyth 707*37da2899SCharles.Forsyth } PSAux_ServiceRec, *PSAux_Service; 708*37da2899SCharles.Forsyth 709*37da2899SCharles.Forsyth /* backwards-compatible type definition */ 710*37da2899SCharles.Forsyth typedef PSAux_ServiceRec PSAux_Interface; 711*37da2899SCharles.Forsyth 712*37da2899SCharles.Forsyth FT_END_HEADER 713*37da2899SCharles.Forsyth 714*37da2899SCharles.Forsyth #endif /* __PSAUX_H__ */ 715*37da2899SCharles.Forsyth 716*37da2899SCharles.Forsyth 717*37da2899SCharles.Forsyth /* END */ 718