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