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