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