1 /**************************************************************************** 2 * 3 * psaux.h 4 * 5 * Auxiliary functions and data structures related to PostScript fonts 6 * (specification). 7 * 8 * Copyright (C) 1996-2019 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_INTERNAL_HASH_H 28 #include FT_INTERNAL_TRUETYPE_TYPES_H 29 #include FT_SERVICE_POSTSCRIPT_CMAPS_H 30 #include FT_INTERNAL_CFF_TYPES_H 31 #include FT_INTERNAL_CFF_OBJECTS_TYPES_H 32 33 34 35 FT_BEGIN_HEADER 36 37 38 /************************************************************************** 39 * 40 * PostScript modules driver class. 41 */ 42 typedef struct PS_DriverRec_ 43 { 44 FT_DriverRec root; 45 46 FT_UInt hinting_engine; 47 FT_Bool no_stem_darkening; 48 FT_Int darken_params[8]; 49 FT_Int32 random_seed; 50 51 } PS_DriverRec, *PS_Driver; 52 53 54 /*************************************************************************/ 55 /*************************************************************************/ 56 /***** *****/ 57 /***** T1_TABLE *****/ 58 /***** *****/ 59 /*************************************************************************/ 60 /*************************************************************************/ 61 62 63 typedef struct PS_TableRec_* PS_Table; 64 typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; 65 66 67 /************************************************************************** 68 * 69 * @struct: 70 * PS_Table_FuncsRec 71 * 72 * @description: 73 * A set of function pointers to manage PS_Table objects. 74 * 75 * @fields: 76 * table_init :: 77 * Used to initialize a table. 78 * 79 * table_done :: 80 * Finalizes resp. destroy a given table. 81 * 82 * table_add :: 83 * Adds a new object to a table. 84 * 85 * table_release :: 86 * Releases table data, then finalizes it. 87 */ 88 typedef struct PS_Table_FuncsRec_ 89 { 90 FT_Error 91 (*init)( PS_Table table, 92 FT_Int count, 93 FT_Memory memory ); 94 95 void 96 (*done)( PS_Table table ); 97 98 FT_Error 99 (*add)( PS_Table table, 100 FT_Int idx, 101 const void* object, 102 FT_UInt length ); 103 104 void 105 (*release)( PS_Table table ); 106 107 } PS_Table_FuncsRec; 108 109 110 /************************************************************************** 111 * 112 * @struct: 113 * PS_TableRec 114 * 115 * @description: 116 * A PS_Table is a simple object used to store an array of objects in a 117 * single memory block. 118 * 119 * @fields: 120 * block :: 121 * The address in memory of the growheap's block. This can change 122 * between two object adds, due to reallocation. 123 * 124 * cursor :: 125 * The current top of the grow heap within its block. 126 * 127 * capacity :: 128 * The current size of the heap block. Increments by 1kByte chunks. 129 * 130 * init :: 131 * Set to 0xDEADBEEF if 'elements' and 'lengths' have been allocated. 132 * 133 * max_elems :: 134 * The maximum number of elements in table. 135 * 136 * num_elems :: 137 * The current number of elements in table. 138 * 139 * elements :: 140 * A table of element addresses within the block. 141 * 142 * lengths :: 143 * A table of element sizes within the block. 144 * 145 * memory :: 146 * The object used for memory operations (alloc/realloc). 147 * 148 * funcs :: 149 * A table of method pointers for this object. 150 */ 151 typedef struct PS_TableRec_ 152 { 153 FT_Byte* block; /* current memory block */ 154 FT_Offset cursor; /* current cursor in memory block */ 155 FT_Offset capacity; /* current size of memory block */ 156 FT_ULong init; 157 158 FT_Int max_elems; 159 FT_Int num_elems; 160 FT_Byte** elements; /* addresses of table elements */ 161 FT_UInt* lengths; /* lengths of table elements */ 162 163 FT_Memory memory; 164 PS_Table_FuncsRec funcs; 165 166 } PS_TableRec; 167 168 169 /*************************************************************************/ 170 /*************************************************************************/ 171 /***** *****/ 172 /***** T1 FIELDS & TOKENS *****/ 173 /***** *****/ 174 /*************************************************************************/ 175 /*************************************************************************/ 176 177 typedef struct PS_ParserRec_* PS_Parser; 178 179 typedef struct T1_TokenRec_* T1_Token; 180 181 typedef struct T1_FieldRec_* T1_Field; 182 183 184 /* simple enumeration type used to identify token types */ 185 typedef enum T1_TokenType_ 186 { 187 T1_TOKEN_TYPE_NONE = 0, 188 T1_TOKEN_TYPE_ANY, 189 T1_TOKEN_TYPE_STRING, 190 T1_TOKEN_TYPE_ARRAY, 191 T1_TOKEN_TYPE_KEY, /* aka `name' */ 192 193 /* do not remove */ 194 T1_TOKEN_TYPE_MAX 195 196 } T1_TokenType; 197 198 199 /* a simple structure used to identify tokens */ 200 typedef struct T1_TokenRec_ 201 { 202 FT_Byte* start; /* first character of token in input stream */ 203 FT_Byte* limit; /* first character after the token */ 204 T1_TokenType type; /* type of token */ 205 206 } T1_TokenRec; 207 208 209 /* enumeration type used to identify object fields */ 210 typedef enum T1_FieldType_ 211 { 212 T1_FIELD_TYPE_NONE = 0, 213 T1_FIELD_TYPE_BOOL, 214 T1_FIELD_TYPE_INTEGER, 215 T1_FIELD_TYPE_FIXED, 216 T1_FIELD_TYPE_FIXED_1000, 217 T1_FIELD_TYPE_STRING, 218 T1_FIELD_TYPE_KEY, 219 T1_FIELD_TYPE_BBOX, 220 T1_FIELD_TYPE_MM_BBOX, 221 T1_FIELD_TYPE_INTEGER_ARRAY, 222 T1_FIELD_TYPE_FIXED_ARRAY, 223 T1_FIELD_TYPE_CALLBACK, 224 225 /* do not remove */ 226 T1_FIELD_TYPE_MAX 227 228 } T1_FieldType; 229 230 231 typedef enum T1_FieldLocation_ 232 { 233 T1_FIELD_LOCATION_CID_INFO, 234 T1_FIELD_LOCATION_FONT_DICT, 235 T1_FIELD_LOCATION_FONT_EXTRA, 236 T1_FIELD_LOCATION_FONT_INFO, 237 T1_FIELD_LOCATION_PRIVATE, 238 T1_FIELD_LOCATION_BBOX, 239 T1_FIELD_LOCATION_LOADER, 240 T1_FIELD_LOCATION_FACE, 241 T1_FIELD_LOCATION_BLEND, 242 243 /* do not remove */ 244 T1_FIELD_LOCATION_MAX 245 246 } T1_FieldLocation; 247 248 249 typedef void 250 (*T1_Field_ParseFunc)( FT_Face face, 251 FT_Pointer parser ); 252 253 254 /* structure type used to model object fields */ 255 typedef struct T1_FieldRec_ 256 { 257 const char* ident; /* field identifier */ 258 T1_FieldLocation location; 259 T1_FieldType type; /* type of field */ 260 T1_Field_ParseFunc reader; 261 FT_UInt offset; /* offset of field in object */ 262 FT_Byte size; /* size of field in bytes */ 263 FT_UInt array_max; /* maximum number of elements for */ 264 /* array */ 265 FT_UInt count_offset; /* offset of element count for */ 266 /* arrays; must not be zero if in */ 267 /* use -- in other words, a */ 268 /* `num_FOO' element must not */ 269 /* start the used structure if we */ 270 /* parse a `FOO' array */ 271 FT_UInt dict; /* where we expect it */ 272 } T1_FieldRec; 273 274 #define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ 275 #define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) 276 277 278 279 #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ 280 { \ 281 _ident, T1CODE, _type, \ 282 0, \ 283 FT_FIELD_OFFSET( _fname ), \ 284 FT_FIELD_SIZE( _fname ), \ 285 0, 0, \ 286 _dict \ 287 }, 288 289 #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ 290 { \ 291 _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ 292 (T1_Field_ParseFunc)_reader, \ 293 0, 0, \ 294 0, 0, \ 295 _dict \ 296 }, 297 298 #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ 299 { \ 300 _ident, T1CODE, _type, \ 301 0, \ 302 FT_FIELD_OFFSET( _fname ), \ 303 FT_FIELD_SIZE_DELTA( _fname ), \ 304 _max, \ 305 FT_FIELD_OFFSET( num_ ## _fname ), \ 306 _dict \ 307 }, 308 309 #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ 310 { \ 311 _ident, T1CODE, _type, \ 312 0, \ 313 FT_FIELD_OFFSET( _fname ), \ 314 FT_FIELD_SIZE_DELTA( _fname ), \ 315 _max, 0, \ 316 _dict \ 317 }, 318 319 320 #define T1_FIELD_BOOL( _ident, _fname, _dict ) \ 321 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) 322 323 #define T1_FIELD_NUM( _ident, _fname, _dict ) \ 324 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) 325 326 #define T1_FIELD_FIXED( _ident, _fname, _dict ) \ 327 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) 328 329 #define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ 330 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ 331 _dict ) 332 333 #define T1_FIELD_STRING( _ident, _fname, _dict ) \ 334 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) 335 336 #define T1_FIELD_KEY( _ident, _fname, _dict ) \ 337 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) 338 339 #define T1_FIELD_BBOX( _ident, _fname, _dict ) \ 340 T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) 341 342 343 #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ 344 T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 345 _fname, _fmax, _dict ) 346 347 #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ 348 T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 349 _fname, _fmax, _dict ) 350 351 #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ 352 T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 353 _fname, _fmax, _dict ) 354 355 #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ 356 T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 357 _fname, _fmax, _dict ) 358 359 #define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ 360 T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) 361 362 363 /*************************************************************************/ 364 /*************************************************************************/ 365 /***** *****/ 366 /***** T1 PARSER *****/ 367 /***** *****/ 368 /*************************************************************************/ 369 /*************************************************************************/ 370 371 typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; 372 373 typedef struct PS_Parser_FuncsRec_ 374 { 375 void 376 (*init)( PS_Parser parser, 377 FT_Byte* base, 378 FT_Byte* limit, 379 FT_Memory memory ); 380 381 void 382 (*done)( PS_Parser parser ); 383 384 void 385 (*skip_spaces)( PS_Parser parser ); 386 void 387 (*skip_PS_token)( PS_Parser parser ); 388 389 FT_Long 390 (*to_int)( PS_Parser parser ); 391 FT_Fixed 392 (*to_fixed)( PS_Parser parser, 393 FT_Int power_ten ); 394 395 FT_Error 396 (*to_bytes)( PS_Parser parser, 397 FT_Byte* bytes, 398 FT_Offset max_bytes, 399 FT_ULong* pnum_bytes, 400 FT_Bool delimiters ); 401 402 FT_Int 403 (*to_coord_array)( PS_Parser parser, 404 FT_Int max_coords, 405 FT_Short* coords ); 406 FT_Int 407 (*to_fixed_array)( PS_Parser parser, 408 FT_Int max_values, 409 FT_Fixed* values, 410 FT_Int power_ten ); 411 412 void 413 (*to_token)( PS_Parser parser, 414 T1_Token token ); 415 void 416 (*to_token_array)( PS_Parser parser, 417 T1_Token tokens, 418 FT_UInt max_tokens, 419 FT_Int* pnum_tokens ); 420 421 FT_Error 422 (*load_field)( PS_Parser parser, 423 const T1_Field field, 424 void** objects, 425 FT_UInt max_objects, 426 FT_ULong* pflags ); 427 428 FT_Error 429 (*load_field_table)( PS_Parser parser, 430 const T1_Field field, 431 void** objects, 432 FT_UInt max_objects, 433 FT_ULong* pflags ); 434 435 } PS_Parser_FuncsRec; 436 437 438 /************************************************************************** 439 * 440 * @struct: 441 * PS_ParserRec 442 * 443 * @description: 444 * A PS_Parser is an object used to parse a Type 1 font very quickly. 445 * 446 * @fields: 447 * cursor :: 448 * The current position in the text. 449 * 450 * base :: 451 * Start of the processed text. 452 * 453 * limit :: 454 * End of the processed text. 455 * 456 * error :: 457 * The last error returned. 458 * 459 * memory :: 460 * The object used for memory operations (alloc/realloc). 461 * 462 * funcs :: 463 * A table of functions for the parser. 464 */ 465 typedef struct PS_ParserRec_ 466 { 467 FT_Byte* cursor; 468 FT_Byte* base; 469 FT_Byte* limit; 470 FT_Error error; 471 FT_Memory memory; 472 473 PS_Parser_FuncsRec funcs; 474 475 } PS_ParserRec; 476 477 478 /*************************************************************************/ 479 /*************************************************************************/ 480 /***** *****/ 481 /***** PS BUILDER *****/ 482 /***** *****/ 483 /*************************************************************************/ 484 /*************************************************************************/ 485 486 487 typedef struct PS_Builder_ PS_Builder; 488 typedef const struct PS_Builder_FuncsRec_* PS_Builder_Funcs; 489 490 typedef struct PS_Builder_FuncsRec_ 491 { 492 void 493 (*init)( PS_Builder* ps_builder, 494 void* builder, 495 FT_Bool is_t1 ); 496 497 void 498 (*done)( PS_Builder* builder ); 499 500 } PS_Builder_FuncsRec; 501 502 503 /************************************************************************** 504 * 505 * @struct: 506 * PS_Builder 507 * 508 * @description: 509 * A structure used during glyph loading to store its outline. 510 * 511 * @fields: 512 * memory :: 513 * The current memory object. 514 * 515 * face :: 516 * The current face object. 517 * 518 * glyph :: 519 * The current glyph slot. 520 * 521 * loader :: 522 * XXX 523 * 524 * base :: 525 * The base glyph outline. 526 * 527 * current :: 528 * The current glyph outline. 529 * 530 * pos_x :: 531 * The horizontal translation (if composite glyph). 532 * 533 * pos_y :: 534 * The vertical translation (if composite glyph). 535 * 536 * left_bearing :: 537 * The left side bearing point. 538 * 539 * advance :: 540 * The horizontal advance vector. 541 * 542 * bbox :: 543 * Unused. 544 * 545 * path_begun :: 546 * A flag which indicates that a new path has begun. 547 * 548 * load_points :: 549 * If this flag is not set, no points are loaded. 550 * 551 * no_recurse :: 552 * Set but not used. 553 * 554 * metrics_only :: 555 * A boolean indicating that we only want to compute the metrics of a 556 * given glyph, not load all of its points. 557 * 558 * is_t1 :: 559 * Set if current font type is Type 1. 560 * 561 * funcs :: 562 * An array of function pointers for the builder. 563 */ 564 struct PS_Builder_ 565 { 566 FT_Memory memory; 567 FT_Face face; 568 CFF_GlyphSlot glyph; 569 FT_GlyphLoader loader; 570 FT_Outline* base; 571 FT_Outline* current; 572 573 FT_Pos* pos_x; 574 FT_Pos* pos_y; 575 576 FT_Vector* left_bearing; 577 FT_Vector* advance; 578 579 FT_BBox* bbox; /* bounding box */ 580 FT_Bool path_begun; 581 FT_Bool load_points; 582 FT_Bool no_recurse; 583 584 FT_Bool metrics_only; 585 FT_Bool is_t1; 586 587 PS_Builder_FuncsRec funcs; 588 589 }; 590 591 592 /*************************************************************************/ 593 /*************************************************************************/ 594 /***** *****/ 595 /***** PS DECODER *****/ 596 /***** *****/ 597 /*************************************************************************/ 598 /*************************************************************************/ 599 600 #define PS_MAX_OPERANDS 48 601 #define PS_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ 602 /* only 10 are allowed but there exist */ 603 /* fonts like `HiraKakuProN-W3.ttf' */ 604 /* (Hiragino Kaku Gothic ProN W3; */ 605 /* 8.2d6e1; 2014-12-19) that exceed */ 606 /* this limit */ 607 608 /* execution context charstring zone */ 609 610 typedef struct PS_Decoder_Zone_ 611 { 612 FT_Byte* base; 613 FT_Byte* limit; 614 FT_Byte* cursor; 615 616 } PS_Decoder_Zone; 617 618 619 typedef FT_Error 620 (*CFF_Decoder_Get_Glyph_Callback)( TT_Face face, 621 FT_UInt glyph_index, 622 FT_Byte** pointer, 623 FT_ULong* length ); 624 625 typedef void 626 (*CFF_Decoder_Free_Glyph_Callback)( TT_Face face, 627 FT_Byte** pointer, 628 FT_ULong length ); 629 630 631 typedef struct PS_Decoder_ 632 { 633 PS_Builder builder; 634 635 FT_Fixed stack[PS_MAX_OPERANDS + 1]; 636 FT_Fixed* top; 637 638 PS_Decoder_Zone zones[PS_MAX_SUBRS_CALLS + 1]; 639 PS_Decoder_Zone* zone; 640 641 FT_Int flex_state; 642 FT_Int num_flex_vectors; 643 FT_Vector flex_vectors[7]; 644 645 CFF_Font cff; 646 CFF_SubFont current_subfont; /* for current glyph_index */ 647 FT_Generic* cf2_instance; 648 649 FT_Pos* glyph_width; 650 FT_Bool width_only; 651 FT_Int num_hints; 652 653 FT_UInt num_locals; 654 FT_UInt num_globals; 655 656 FT_Int locals_bias; 657 FT_Int globals_bias; 658 659 FT_Byte** locals; 660 FT_Byte** globals; 661 662 FT_Byte** glyph_names; /* for pure CFF fonts only */ 663 FT_UInt num_glyphs; /* number of glyphs in font */ 664 665 FT_Render_Mode hint_mode; 666 667 FT_Bool seac; 668 669 CFF_Decoder_Get_Glyph_Callback get_glyph_callback; 670 CFF_Decoder_Free_Glyph_Callback free_glyph_callback; 671 672 /* Type 1 stuff */ 673 FT_Service_PsCMaps psnames; /* for seac */ 674 675 FT_Int lenIV; /* internal for sub routine calls */ 676 FT_UInt* locals_len; /* array of subrs length (optional) */ 677 FT_Hash locals_hash; /* used if `num_subrs' was massaged */ 678 679 FT_Matrix font_matrix; 680 FT_Vector font_offset; 681 682 PS_Blend blend; /* for multiple master support */ 683 684 FT_Long* buildchar; 685 FT_UInt len_buildchar; 686 687 } PS_Decoder; 688 689 690 /*************************************************************************/ 691 /*************************************************************************/ 692 /***** *****/ 693 /***** T1 BUILDER *****/ 694 /***** *****/ 695 /*************************************************************************/ 696 /*************************************************************************/ 697 698 699 typedef struct T1_BuilderRec_* T1_Builder; 700 701 702 typedef FT_Error 703 (*T1_Builder_Check_Points_Func)( T1_Builder builder, 704 FT_Int count ); 705 706 typedef void 707 (*T1_Builder_Add_Point_Func)( T1_Builder builder, 708 FT_Pos x, 709 FT_Pos y, 710 FT_Byte flag ); 711 712 typedef FT_Error 713 (*T1_Builder_Add_Point1_Func)( T1_Builder builder, 714 FT_Pos x, 715 FT_Pos y ); 716 717 typedef FT_Error 718 (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); 719 720 typedef FT_Error 721 (*T1_Builder_Start_Point_Func)( T1_Builder builder, 722 FT_Pos x, 723 FT_Pos y ); 724 725 typedef void 726 (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); 727 728 729 typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; 730 731 typedef struct T1_Builder_FuncsRec_ 732 { 733 void 734 (*init)( T1_Builder builder, 735 FT_Face face, 736 FT_Size size, 737 FT_GlyphSlot slot, 738 FT_Bool hinting ); 739 740 void 741 (*done)( T1_Builder builder ); 742 743 T1_Builder_Check_Points_Func check_points; 744 T1_Builder_Add_Point_Func add_point; 745 T1_Builder_Add_Point1_Func add_point1; 746 T1_Builder_Add_Contour_Func add_contour; 747 T1_Builder_Start_Point_Func start_point; 748 T1_Builder_Close_Contour_Func close_contour; 749 750 } T1_Builder_FuncsRec; 751 752 753 /* an enumeration type to handle charstring parsing states */ 754 typedef enum T1_ParseState_ 755 { 756 T1_Parse_Start, 757 T1_Parse_Have_Width, 758 T1_Parse_Have_Moveto, 759 T1_Parse_Have_Path 760 761 } T1_ParseState; 762 763 764 /************************************************************************** 765 * 766 * @struct: 767 * T1_BuilderRec 768 * 769 * @description: 770 * A structure used during glyph loading to store its outline. 771 * 772 * @fields: 773 * memory :: 774 * The current memory object. 775 * 776 * face :: 777 * The current face object. 778 * 779 * glyph :: 780 * The current glyph slot. 781 * 782 * loader :: 783 * XXX 784 * 785 * base :: 786 * The base glyph outline. 787 * 788 * current :: 789 * The current glyph outline. 790 * 791 * max_points :: 792 * maximum points in builder outline 793 * 794 * max_contours :: 795 * Maximum number of contours in builder outline. 796 * 797 * pos_x :: 798 * The horizontal translation (if composite glyph). 799 * 800 * pos_y :: 801 * The vertical translation (if composite glyph). 802 * 803 * left_bearing :: 804 * The left side bearing point. 805 * 806 * advance :: 807 * The horizontal advance vector. 808 * 809 * bbox :: 810 * Unused. 811 * 812 * parse_state :: 813 * An enumeration which controls the charstring parsing state. 814 * 815 * load_points :: 816 * If this flag is not set, no points are loaded. 817 * 818 * no_recurse :: 819 * Set but not used. 820 * 821 * metrics_only :: 822 * A boolean indicating that we only want to compute the metrics of a 823 * given glyph, not load all of its points. 824 * 825 * funcs :: 826 * An array of function pointers for the builder. 827 */ 828 typedef struct T1_BuilderRec_ 829 { 830 FT_Memory memory; 831 FT_Face face; 832 FT_GlyphSlot glyph; 833 FT_GlyphLoader loader; 834 FT_Outline* base; 835 FT_Outline* current; 836 837 FT_Pos pos_x; 838 FT_Pos pos_y; 839 840 FT_Vector left_bearing; 841 FT_Vector advance; 842 843 FT_BBox bbox; /* bounding box */ 844 T1_ParseState parse_state; 845 FT_Bool load_points; 846 FT_Bool no_recurse; 847 848 FT_Bool metrics_only; 849 850 void* hints_funcs; /* hinter-specific */ 851 void* hints_globals; /* hinter-specific */ 852 853 T1_Builder_FuncsRec funcs; 854 855 } T1_BuilderRec; 856 857 858 /*************************************************************************/ 859 /*************************************************************************/ 860 /***** *****/ 861 /***** T1 DECODER *****/ 862 /***** *****/ 863 /*************************************************************************/ 864 /*************************************************************************/ 865 866 #if 0 867 868 /************************************************************************** 869 * 870 * T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine 871 * calls during glyph loading. 872 */ 873 #define T1_MAX_SUBRS_CALLS 8 874 875 876 /************************************************************************** 877 * 878 * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A 879 * minimum of 16 is required. 880 */ 881 #define T1_MAX_CHARSTRINGS_OPERANDS 32 882 883 #endif /* 0 */ 884 885 886 typedef struct T1_Decoder_ZoneRec_ 887 { 888 FT_Byte* cursor; 889 FT_Byte* base; 890 FT_Byte* limit; 891 892 } T1_Decoder_ZoneRec, *T1_Decoder_Zone; 893 894 895 typedef struct T1_DecoderRec_* T1_Decoder; 896 typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; 897 898 899 typedef FT_Error 900 (*T1_Decoder_Callback)( T1_Decoder decoder, 901 FT_UInt glyph_index ); 902 903 904 typedef struct T1_Decoder_FuncsRec_ 905 { 906 FT_Error 907 (*init)( T1_Decoder decoder, 908 FT_Face face, 909 FT_Size size, 910 FT_GlyphSlot slot, 911 FT_Byte** glyph_names, 912 PS_Blend blend, 913 FT_Bool hinting, 914 FT_Render_Mode hint_mode, 915 T1_Decoder_Callback callback ); 916 917 void 918 (*done)( T1_Decoder decoder ); 919 920 #ifdef T1_CONFIG_OPTION_OLD_ENGINE 921 FT_Error 922 (*parse_charstrings_old)( T1_Decoder decoder, 923 FT_Byte* base, 924 FT_UInt len ); 925 #else 926 FT_Error 927 (*parse_metrics)( T1_Decoder decoder, 928 FT_Byte* base, 929 FT_UInt len ); 930 #endif 931 932 FT_Error 933 (*parse_charstrings)( PS_Decoder* decoder, 934 FT_Byte* charstring_base, 935 FT_ULong charstring_len ); 936 937 938 } T1_Decoder_FuncsRec; 939 940 941 typedef struct T1_DecoderRec_ 942 { 943 T1_BuilderRec builder; 944 945 FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; 946 FT_Long* top; 947 948 T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; 949 T1_Decoder_Zone zone; 950 951 FT_Service_PsCMaps psnames; /* for seac */ 952 FT_UInt num_glyphs; 953 FT_Byte** glyph_names; 954 955 FT_Int lenIV; /* internal for sub routine calls */ 956 FT_Int num_subrs; 957 FT_Byte** subrs; 958 FT_UInt* subrs_len; /* array of subrs length (optional) */ 959 FT_Hash subrs_hash; /* used if `num_subrs' was massaged */ 960 961 FT_Matrix font_matrix; 962 FT_Vector font_offset; 963 964 FT_Int flex_state; 965 FT_Int num_flex_vectors; 966 FT_Vector flex_vectors[7]; 967 968 PS_Blend blend; /* for multiple master support */ 969 970 FT_Render_Mode hint_mode; 971 972 T1_Decoder_Callback parse_callback; 973 T1_Decoder_FuncsRec funcs; 974 975 FT_Long* buildchar; 976 FT_UInt len_buildchar; 977 978 FT_Bool seac; 979 980 FT_Generic cf2_instance; 981 982 } T1_DecoderRec; 983 984 985 /*************************************************************************/ 986 /*************************************************************************/ 987 /***** *****/ 988 /***** CFF BUILDER *****/ 989 /***** *****/ 990 /*************************************************************************/ 991 /*************************************************************************/ 992 993 994 typedef struct CFF_Builder_ CFF_Builder; 995 996 997 typedef FT_Error 998 (*CFF_Builder_Check_Points_Func)( CFF_Builder* builder, 999 FT_Int count ); 1000 1001 typedef void 1002 (*CFF_Builder_Add_Point_Func)( CFF_Builder* builder, 1003 FT_Pos x, 1004 FT_Pos y, 1005 FT_Byte flag ); 1006 typedef FT_Error 1007 (*CFF_Builder_Add_Point1_Func)( CFF_Builder* builder, 1008 FT_Pos x, 1009 FT_Pos y ); 1010 typedef FT_Error 1011 (*CFF_Builder_Start_Point_Func)( CFF_Builder* builder, 1012 FT_Pos x, 1013 FT_Pos y ); 1014 typedef void 1015 (*CFF_Builder_Close_Contour_Func)( CFF_Builder* builder ); 1016 1017 typedef FT_Error 1018 (*CFF_Builder_Add_Contour_Func)( CFF_Builder* builder ); 1019 1020 typedef const struct CFF_Builder_FuncsRec_* CFF_Builder_Funcs; 1021 1022 typedef struct CFF_Builder_FuncsRec_ 1023 { 1024 void 1025 (*init)( CFF_Builder* builder, 1026 TT_Face face, 1027 CFF_Size size, 1028 CFF_GlyphSlot glyph, 1029 FT_Bool hinting ); 1030 1031 void 1032 (*done)( CFF_Builder* builder ); 1033 1034 CFF_Builder_Check_Points_Func check_points; 1035 CFF_Builder_Add_Point_Func add_point; 1036 CFF_Builder_Add_Point1_Func add_point1; 1037 CFF_Builder_Add_Contour_Func add_contour; 1038 CFF_Builder_Start_Point_Func start_point; 1039 CFF_Builder_Close_Contour_Func close_contour; 1040 1041 } CFF_Builder_FuncsRec; 1042 1043 1044 /************************************************************************** 1045 * 1046 * @struct: 1047 * CFF_Builder 1048 * 1049 * @description: 1050 * A structure used during glyph loading to store its outline. 1051 * 1052 * @fields: 1053 * memory :: 1054 * The current memory object. 1055 * 1056 * face :: 1057 * The current face object. 1058 * 1059 * glyph :: 1060 * The current glyph slot. 1061 * 1062 * loader :: 1063 * The current glyph loader. 1064 * 1065 * base :: 1066 * The base glyph outline. 1067 * 1068 * current :: 1069 * The current glyph outline. 1070 * 1071 * pos_x :: 1072 * The horizontal translation (if composite glyph). 1073 * 1074 * pos_y :: 1075 * The vertical translation (if composite glyph). 1076 * 1077 * left_bearing :: 1078 * The left side bearing point. 1079 * 1080 * advance :: 1081 * The horizontal advance vector. 1082 * 1083 * bbox :: 1084 * Unused. 1085 * 1086 * path_begun :: 1087 * A flag which indicates that a new path has begun. 1088 * 1089 * load_points :: 1090 * If this flag is not set, no points are loaded. 1091 * 1092 * no_recurse :: 1093 * Set but not used. 1094 * 1095 * metrics_only :: 1096 * A boolean indicating that we only want to compute the metrics of a 1097 * given glyph, not load all of its points. 1098 * 1099 * hints_funcs :: 1100 * Auxiliary pointer for hinting. 1101 * 1102 * hints_globals :: 1103 * Auxiliary pointer for hinting. 1104 * 1105 * funcs :: 1106 * A table of method pointers for this object. 1107 */ 1108 struct CFF_Builder_ 1109 { 1110 FT_Memory memory; 1111 TT_Face face; 1112 CFF_GlyphSlot glyph; 1113 FT_GlyphLoader loader; 1114 FT_Outline* base; 1115 FT_Outline* current; 1116 1117 FT_Pos pos_x; 1118 FT_Pos pos_y; 1119 1120 FT_Vector left_bearing; 1121 FT_Vector advance; 1122 1123 FT_BBox bbox; /* bounding box */ 1124 1125 FT_Bool path_begun; 1126 FT_Bool load_points; 1127 FT_Bool no_recurse; 1128 1129 FT_Bool metrics_only; 1130 1131 void* hints_funcs; /* hinter-specific */ 1132 void* hints_globals; /* hinter-specific */ 1133 1134 CFF_Builder_FuncsRec funcs; 1135 }; 1136 1137 1138 /*************************************************************************/ 1139 /*************************************************************************/ 1140 /***** *****/ 1141 /***** CFF DECODER *****/ 1142 /***** *****/ 1143 /*************************************************************************/ 1144 /*************************************************************************/ 1145 1146 1147 #define CFF_MAX_OPERANDS 48 1148 #define CFF_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ 1149 /* only 10 are allowed but there exist */ 1150 /* fonts like `HiraKakuProN-W3.ttf' */ 1151 /* (Hiragino Kaku Gothic ProN W3; */ 1152 /* 8.2d6e1; 2014-12-19) that exceed */ 1153 /* this limit */ 1154 #define CFF_MAX_TRANS_ELEMENTS 32 1155 1156 /* execution context charstring zone */ 1157 1158 typedef struct CFF_Decoder_Zone_ 1159 { 1160 FT_Byte* base; 1161 FT_Byte* limit; 1162 FT_Byte* cursor; 1163 1164 } CFF_Decoder_Zone; 1165 1166 1167 typedef struct CFF_Decoder_ 1168 { 1169 CFF_Builder builder; 1170 CFF_Font cff; 1171 1172 FT_Fixed stack[CFF_MAX_OPERANDS + 1]; 1173 FT_Fixed* top; 1174 1175 CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; 1176 CFF_Decoder_Zone* zone; 1177 1178 FT_Int flex_state; 1179 FT_Int num_flex_vectors; 1180 FT_Vector flex_vectors[7]; 1181 1182 FT_Pos glyph_width; 1183 FT_Pos nominal_width; 1184 1185 FT_Bool read_width; 1186 FT_Bool width_only; 1187 FT_Int num_hints; 1188 FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; 1189 1190 FT_UInt num_locals; 1191 FT_UInt num_globals; 1192 1193 FT_Int locals_bias; 1194 FT_Int globals_bias; 1195 1196 FT_Byte** locals; 1197 FT_Byte** globals; 1198 1199 FT_Byte** glyph_names; /* for pure CFF fonts only */ 1200 FT_UInt num_glyphs; /* number of glyphs in font */ 1201 1202 FT_Render_Mode hint_mode; 1203 1204 FT_Bool seac; 1205 1206 CFF_SubFont current_subfont; /* for current glyph_index */ 1207 1208 CFF_Decoder_Get_Glyph_Callback get_glyph_callback; 1209 CFF_Decoder_Free_Glyph_Callback free_glyph_callback; 1210 1211 } CFF_Decoder; 1212 1213 1214 typedef const struct CFF_Decoder_FuncsRec_* CFF_Decoder_Funcs; 1215 1216 typedef struct CFF_Decoder_FuncsRec_ 1217 { 1218 void 1219 (*init)( CFF_Decoder* decoder, 1220 TT_Face face, 1221 CFF_Size size, 1222 CFF_GlyphSlot slot, 1223 FT_Bool hinting, 1224 FT_Render_Mode hint_mode, 1225 CFF_Decoder_Get_Glyph_Callback get_callback, 1226 CFF_Decoder_Free_Glyph_Callback free_callback ); 1227 1228 FT_Error 1229 (*prepare)( CFF_Decoder* decoder, 1230 CFF_Size size, 1231 FT_UInt glyph_index ); 1232 1233 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 1234 FT_Error 1235 (*parse_charstrings_old)( CFF_Decoder* decoder, 1236 FT_Byte* charstring_base, 1237 FT_ULong charstring_len, 1238 FT_Bool in_dict ); 1239 #endif 1240 1241 FT_Error 1242 (*parse_charstrings)( PS_Decoder* decoder, 1243 FT_Byte* charstring_base, 1244 FT_ULong charstring_len ); 1245 1246 } CFF_Decoder_FuncsRec; 1247 1248 1249 /*************************************************************************/ 1250 /*************************************************************************/ 1251 /***** *****/ 1252 /***** AFM PARSER *****/ 1253 /***** *****/ 1254 /*************************************************************************/ 1255 /*************************************************************************/ 1256 1257 typedef struct AFM_ParserRec_* AFM_Parser; 1258 1259 typedef struct AFM_Parser_FuncsRec_ 1260 { 1261 FT_Error 1262 (*init)( AFM_Parser parser, 1263 FT_Memory memory, 1264 FT_Byte* base, 1265 FT_Byte* limit ); 1266 1267 void 1268 (*done)( AFM_Parser parser ); 1269 1270 FT_Error 1271 (*parse)( AFM_Parser parser ); 1272 1273 } AFM_Parser_FuncsRec; 1274 1275 1276 typedef struct AFM_StreamRec_* AFM_Stream; 1277 1278 1279 /************************************************************************** 1280 * 1281 * @struct: 1282 * AFM_ParserRec 1283 * 1284 * @description: 1285 * An AFM_Parser is a parser for the AFM files. 1286 * 1287 * @fields: 1288 * memory :: 1289 * The object used for memory operations (alloc and realloc). 1290 * 1291 * stream :: 1292 * This is an opaque object. 1293 * 1294 * FontInfo :: 1295 * The result will be stored here. 1296 * 1297 * get_index :: 1298 * A user provided function to get a glyph index by its name. 1299 */ 1300 typedef struct AFM_ParserRec_ 1301 { 1302 FT_Memory memory; 1303 AFM_Stream stream; 1304 1305 AFM_FontInfo FontInfo; 1306 1307 FT_Int 1308 (*get_index)( const char* name, 1309 FT_Offset len, 1310 void* user_data ); 1311 1312 void* user_data; 1313 1314 } AFM_ParserRec; 1315 1316 1317 /*************************************************************************/ 1318 /*************************************************************************/ 1319 /***** *****/ 1320 /***** TYPE1 CHARMAPS *****/ 1321 /***** *****/ 1322 /*************************************************************************/ 1323 /*************************************************************************/ 1324 1325 typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; 1326 1327 typedef struct T1_CMap_ClassesRec_ 1328 { 1329 FT_CMap_Class standard; 1330 FT_CMap_Class expert; 1331 FT_CMap_Class custom; 1332 FT_CMap_Class unicode; 1333 1334 } T1_CMap_ClassesRec; 1335 1336 1337 /*************************************************************************/ 1338 /*************************************************************************/ 1339 /***** *****/ 1340 /***** PSAux Module Interface *****/ 1341 /***** *****/ 1342 /*************************************************************************/ 1343 /*************************************************************************/ 1344 1345 typedef struct PSAux_ServiceRec_ 1346 { 1347 /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ 1348 const PS_Table_FuncsRec* ps_table_funcs; 1349 const PS_Parser_FuncsRec* ps_parser_funcs; 1350 const T1_Builder_FuncsRec* t1_builder_funcs; 1351 const T1_Decoder_FuncsRec* t1_decoder_funcs; 1352 1353 void 1354 (*t1_decrypt)( FT_Byte* buffer, 1355 FT_Offset length, 1356 FT_UShort seed ); 1357 1358 FT_UInt32 1359 (*cff_random)( FT_UInt32 r ); 1360 1361 void 1362 (*ps_decoder_init)( PS_Decoder* ps_decoder, 1363 void* decoder, 1364 FT_Bool is_t1 ); 1365 1366 void 1367 (*t1_make_subfont)( FT_Face face, 1368 PS_Private priv, 1369 CFF_SubFont subfont ); 1370 1371 T1_CMap_Classes t1_cmap_classes; 1372 1373 /* fields after this comment line were added after version 2.1.10 */ 1374 const AFM_Parser_FuncsRec* afm_parser_funcs; 1375 1376 const CFF_Decoder_FuncsRec* cff_decoder_funcs; 1377 1378 } PSAux_ServiceRec, *PSAux_Service; 1379 1380 /* backward compatible type definition */ 1381 typedef PSAux_ServiceRec PSAux_Interface; 1382 1383 1384 /*************************************************************************/ 1385 /*************************************************************************/ 1386 /***** *****/ 1387 /***** Some convenience functions *****/ 1388 /***** *****/ 1389 /*************************************************************************/ 1390 /*************************************************************************/ 1391 1392 #define IS_PS_NEWLINE( ch ) \ 1393 ( (ch) == '\r' || \ 1394 (ch) == '\n' ) 1395 1396 #define IS_PS_SPACE( ch ) \ 1397 ( (ch) == ' ' || \ 1398 IS_PS_NEWLINE( ch ) || \ 1399 (ch) == '\t' || \ 1400 (ch) == '\f' || \ 1401 (ch) == '\0' ) 1402 1403 #define IS_PS_SPECIAL( ch ) \ 1404 ( (ch) == '/' || \ 1405 (ch) == '(' || (ch) == ')' || \ 1406 (ch) == '<' || (ch) == '>' || \ 1407 (ch) == '[' || (ch) == ']' || \ 1408 (ch) == '{' || (ch) == '}' || \ 1409 (ch) == '%' ) 1410 1411 #define IS_PS_DELIM( ch ) \ 1412 ( IS_PS_SPACE( ch ) || \ 1413 IS_PS_SPECIAL( ch ) ) 1414 1415 #define IS_PS_DIGIT( ch ) \ 1416 ( (ch) >= '0' && (ch) <= '9' ) 1417 1418 #define IS_PS_XDIGIT( ch ) \ 1419 ( IS_PS_DIGIT( ch ) || \ 1420 ( (ch) >= 'A' && (ch) <= 'F' ) || \ 1421 ( (ch) >= 'a' && (ch) <= 'f' ) ) 1422 1423 #define IS_PS_BASE85( ch ) \ 1424 ( (ch) >= '!' && (ch) <= 'u' ) 1425 1426 #define IS_PS_TOKEN( cur, limit, token ) \ 1427 ( (char)(cur)[0] == (token)[0] && \ 1428 ( (cur) + sizeof ( (token) ) == (limit) || \ 1429 ( (cur) + sizeof( (token) ) < (limit) && \ 1430 IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ 1431 ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) 1432 1433 1434 FT_END_HEADER 1435 1436 #endif /* PSAUX_H_ */ 1437 1438 1439 /* END */ 1440