1 /***************************************************************************/ 2 /* */ 3 /* cffparse.c */ 4 /* */ 5 /* CFF token stream parser (body) */ 6 /* */ 7 /* Copyright 1996-2004, 2007-2011 by */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9 /* */ 10 /* This file is part of the FreeType project, and may only be used, */ 11 /* modified, and distributed under the terms of the FreeType project */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13 /* this file you indicate that you have read the license and */ 14 /* understand and accept it fully. */ 15 /* */ 16 /***************************************************************************/ 17 18 19 #include <ft2build.h> 20 #include "cffparse.h" 21 #include FT_INTERNAL_STREAM_H 22 #include FT_INTERNAL_DEBUG_H 23 24 #include "cfferrs.h" 25 #include "cffpic.h" 26 27 28 /*************************************************************************/ 29 /* */ 30 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 31 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 32 /* messages during execution. */ 33 /* */ 34 #undef FT_COMPONENT 35 #define FT_COMPONENT trace_cffparse 36 37 38 FT_LOCAL_DEF( void ) 39 cff_parser_init( CFF_Parser parser, 40 FT_UInt code, 41 void* object, 42 FT_Library library) 43 { 44 FT_MEM_ZERO( parser, sizeof ( *parser ) ); 45 46 parser->top = parser->stack; 47 parser->object_code = code; 48 parser->object = object; 49 parser->library = library; 50 } 51 52 53 /* read an integer */ 54 static FT_Long 55 cff_parse_integer( FT_Byte* start, 56 FT_Byte* limit ) 57 { 58 FT_Byte* p = start; 59 FT_Int v = *p++; 60 FT_Long val = 0; 61 62 63 if ( v == 28 ) 64 { 65 if ( p + 2 > limit ) 66 goto Bad; 67 68 val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); 69 p += 2; 70 } 71 else if ( v == 29 ) 72 { 73 if ( p + 4 > limit ) 74 goto Bad; 75 76 val = ( (FT_Long)p[0] << 24 ) | 77 ( (FT_Long)p[1] << 16 ) | 78 ( (FT_Long)p[2] << 8 ) | 79 p[3]; 80 p += 4; 81 } 82 else if ( v < 247 ) 83 { 84 val = v - 139; 85 } 86 else if ( v < 251 ) 87 { 88 if ( p + 1 > limit ) 89 goto Bad; 90 91 val = ( v - 247 ) * 256 + p[0] + 108; 92 p++; 93 } 94 else 95 { 96 if ( p + 1 > limit ) 97 goto Bad; 98 99 val = -( v - 251 ) * 256 - p[0] - 108; 100 p++; 101 } 102 103 Exit: 104 return val; 105 106 Bad: 107 val = 0; 108 goto Exit; 109 } 110 111 112 static const FT_Long power_tens[] = 113 { 114 1L, 115 10L, 116 100L, 117 1000L, 118 10000L, 119 100000L, 120 1000000L, 121 10000000L, 122 100000000L, 123 1000000000L 124 }; 125 126 127 /* read a real */ 128 static FT_Fixed 129 cff_parse_real( FT_Byte* start, 130 FT_Byte* limit, 131 FT_Long power_ten, 132 FT_Long* scaling ) 133 { 134 FT_Byte* p = start; 135 FT_UInt nib; 136 FT_UInt phase; 137 138 FT_Long result, number, exponent; 139 FT_Int sign = 0, exponent_sign = 0; 140 FT_Long exponent_add, integer_length, fraction_length; 141 142 143 if ( scaling ) 144 *scaling = 0; 145 146 result = 0; 147 148 number = 0; 149 exponent = 0; 150 151 exponent_add = 0; 152 integer_length = 0; 153 fraction_length = 0; 154 155 /* First of all, read the integer part. */ 156 phase = 4; 157 158 for (;;) 159 { 160 /* If we entered this iteration with phase == 4, we need to */ 161 /* read a new byte. This also skips past the initial 0x1E. */ 162 if ( phase ) 163 { 164 p++; 165 166 /* Make sure we don't read past the end. */ 167 if ( p >= limit ) 168 goto Exit; 169 } 170 171 /* Get the nibble. */ 172 nib = ( p[0] >> phase ) & 0xF; 173 phase = 4 - phase; 174 175 if ( nib == 0xE ) 176 sign = 1; 177 else if ( nib > 9 ) 178 break; 179 else 180 { 181 /* Increase exponent if we can't add the digit. */ 182 if ( number >= 0xCCCCCCCL ) 183 exponent_add++; 184 /* Skip leading zeros. */ 185 else if ( nib || number ) 186 { 187 integer_length++; 188 number = number * 10 + nib; 189 } 190 } 191 } 192 193 /* Read fraction part, if any. */ 194 if ( nib == 0xa ) 195 for (;;) 196 { 197 /* If we entered this iteration with phase == 4, we need */ 198 /* to read a new byte. */ 199 if ( phase ) 200 { 201 p++; 202 203 /* Make sure we don't read past the end. */ 204 if ( p >= limit ) 205 goto Exit; 206 } 207 208 /* Get the nibble. */ 209 nib = ( p[0] >> phase ) & 0xF; 210 phase = 4 - phase; 211 if ( nib >= 10 ) 212 break; 213 214 /* Skip leading zeros if possible. */ 215 if ( !nib && !number ) 216 exponent_add--; 217 /* Only add digit if we don't overflow. */ 218 else if ( number < 0xCCCCCCCL && fraction_length < 9 ) 219 { 220 fraction_length++; 221 number = number * 10 + nib; 222 } 223 } 224 225 /* Read exponent, if any. */ 226 if ( nib == 12 ) 227 { 228 exponent_sign = 1; 229 nib = 11; 230 } 231 232 if ( nib == 11 ) 233 { 234 for (;;) 235 { 236 /* If we entered this iteration with phase == 4, */ 237 /* we need to read a new byte. */ 238 if ( phase ) 239 { 240 p++; 241 242 /* Make sure we don't read past the end. */ 243 if ( p >= limit ) 244 goto Exit; 245 } 246 247 /* Get the nibble. */ 248 nib = ( p[0] >> phase ) & 0xF; 249 phase = 4 - phase; 250 if ( nib >= 10 ) 251 break; 252 253 exponent = exponent * 10 + nib; 254 255 /* Arbitrarily limit exponent. */ 256 if ( exponent > 1000 ) 257 goto Exit; 258 } 259 260 if ( exponent_sign ) 261 exponent = -exponent; 262 } 263 264 /* We don't check `power_ten' and `exponent_add'. */ 265 exponent += power_ten + exponent_add; 266 267 if ( scaling ) 268 { 269 /* Only use `fraction_length'. */ 270 fraction_length += integer_length; 271 exponent += integer_length; 272 273 if ( fraction_length <= 5 ) 274 { 275 if ( number > 0x7FFFL ) 276 { 277 result = FT_DivFix( number, 10 ); 278 *scaling = exponent - fraction_length + 1; 279 } 280 else 281 { 282 if ( exponent > 0 ) 283 { 284 FT_Long new_fraction_length, shift; 285 286 287 /* Make `scaling' as small as possible. */ 288 new_fraction_length = FT_MIN( exponent, 5 ); 289 exponent -= new_fraction_length; 290 shift = new_fraction_length - fraction_length; 291 292 number *= power_tens[shift]; 293 if ( number > 0x7FFFL ) 294 { 295 number /= 10; 296 exponent += 1; 297 } 298 } 299 else 300 exponent -= fraction_length; 301 302 result = number << 16; 303 *scaling = exponent; 304 } 305 } 306 else 307 { 308 if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) 309 { 310 result = FT_DivFix( number, power_tens[fraction_length - 4] ); 311 *scaling = exponent - 4; 312 } 313 else 314 { 315 result = FT_DivFix( number, power_tens[fraction_length - 5] ); 316 *scaling = exponent - 5; 317 } 318 } 319 } 320 else 321 { 322 integer_length += exponent; 323 fraction_length -= exponent; 324 325 /* Check for overflow and underflow. */ 326 if ( FT_ABS( integer_length ) > 5 ) 327 goto Exit; 328 329 /* Remove non-significant digits. */ 330 if ( integer_length < 0 ) 331 { 332 number /= power_tens[-integer_length]; 333 fraction_length += integer_length; 334 } 335 336 /* this can only happen if exponent was non-zero */ 337 if ( fraction_length == 10 ) 338 { 339 number /= 10; 340 fraction_length -= 1; 341 } 342 343 /* Convert into 16.16 format. */ 344 if ( fraction_length > 0 ) 345 { 346 if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) 347 goto Exit; 348 349 result = FT_DivFix( number, power_tens[fraction_length] ); 350 } 351 else 352 { 353 number *= power_tens[-fraction_length]; 354 355 if ( number > 0x7FFFL ) 356 goto Exit; 357 358 result = number << 16; 359 } 360 } 361 362 if ( sign ) 363 result = -result; 364 365 Exit: 366 return result; 367 } 368 369 370 /* read a number, either integer or real */ 371 static FT_Long 372 cff_parse_num( FT_Byte** d ) 373 { 374 return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) 375 : cff_parse_integer( d[0], d[1] ); 376 } 377 378 379 /* read a floating point number, either integer or real */ 380 static FT_Fixed 381 cff_parse_fixed( FT_Byte** d ) 382 { 383 return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) 384 : cff_parse_integer( d[0], d[1] ) << 16; 385 } 386 387 388 /* read a floating point number, either integer or real, */ 389 /* but return `10^scaling' times the number read in */ 390 static FT_Fixed 391 cff_parse_fixed_scaled( FT_Byte** d, 392 FT_Long scaling ) 393 { 394 return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) 395 : ( cff_parse_integer( d[0], d[1] ) * 396 power_tens[scaling] ) << 16; 397 } 398 399 400 /* read a floating point number, either integer or real, */ 401 /* and return it as precise as possible -- `scaling' returns */ 402 /* the scaling factor (as a power of 10) */ 403 static FT_Fixed 404 cff_parse_fixed_dynamic( FT_Byte** d, 405 FT_Long* scaling ) 406 { 407 FT_ASSERT( scaling ); 408 409 if ( **d == 30 ) 410 return cff_parse_real( d[0], d[1], 0, scaling ); 411 else 412 { 413 FT_Long number; 414 FT_Int integer_length; 415 416 417 number = cff_parse_integer( d[0], d[1] ); 418 419 if ( number > 0x7FFFL ) 420 { 421 for ( integer_length = 5; integer_length < 10; integer_length++ ) 422 if ( number < power_tens[integer_length] ) 423 break; 424 425 if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) 426 { 427 *scaling = integer_length - 4; 428 return FT_DivFix( number, power_tens[integer_length - 4] ); 429 } 430 else 431 { 432 *scaling = integer_length - 5; 433 return FT_DivFix( number, power_tens[integer_length - 5] ); 434 } 435 } 436 else 437 { 438 *scaling = 0; 439 return number << 16; 440 } 441 } 442 } 443 444 445 static FT_Error 446 cff_parse_font_matrix( CFF_Parser parser ) 447 { 448 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 449 FT_Matrix* matrix = &dict->font_matrix; 450 FT_Vector* offset = &dict->font_offset; 451 FT_ULong* upm = &dict->units_per_em; 452 FT_Byte** data = parser->stack; 453 FT_Error error = CFF_Err_Stack_Underflow; 454 455 456 if ( parser->top >= parser->stack + 6 ) 457 { 458 FT_Long scaling; 459 460 461 error = CFF_Err_Ok; 462 463 dict->has_font_matrix = TRUE; 464 465 /* We expect a well-formed font matrix, this is, the matrix elements */ 466 /* `xx' and `yy' are of approximately the same magnitude. To avoid */ 467 /* loss of precision, we use the magnitude of element `xx' to scale */ 468 /* all other elements. The scaling factor is then contained in the */ 469 /* `units_per_em' value. */ 470 471 matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); 472 473 scaling = -scaling; 474 475 if ( scaling < 0 || scaling > 9 ) 476 { 477 /* Return default matrix in case of unlikely values. */ 478 479 FT_TRACE1(( "cff_parse_font_matrix:" 480 " strange scaling value for xx element (%d),\n" 481 " " 482 " using default matrix\n", scaling )); 483 484 matrix->xx = 0x10000L; 485 matrix->yx = 0; 486 matrix->xy = 0; 487 matrix->yy = 0x10000L; 488 offset->x = 0; 489 offset->y = 0; 490 *upm = 1; 491 492 goto Exit; 493 } 494 495 matrix->yx = cff_parse_fixed_scaled( data++, scaling ); 496 matrix->xy = cff_parse_fixed_scaled( data++, scaling ); 497 matrix->yy = cff_parse_fixed_scaled( data++, scaling ); 498 offset->x = cff_parse_fixed_scaled( data++, scaling ); 499 offset->y = cff_parse_fixed_scaled( data, scaling ); 500 501 *upm = power_tens[scaling]; 502 503 FT_TRACE4(( " [%f %f %f %f %f %f]\n", 504 (double)matrix->xx / *upm / 65536, 505 (double)matrix->xy / *upm / 65536, 506 (double)matrix->yx / *upm / 65536, 507 (double)matrix->yy / *upm / 65536, 508 (double)offset->x / *upm / 65536, 509 (double)offset->y / *upm / 65536 )); 510 } 511 512 Exit: 513 return error; 514 } 515 516 517 static FT_Error 518 cff_parse_font_bbox( CFF_Parser parser ) 519 { 520 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 521 FT_BBox* bbox = &dict->font_bbox; 522 FT_Byte** data = parser->stack; 523 FT_Error error; 524 525 526 error = CFF_Err_Stack_Underflow; 527 528 if ( parser->top >= parser->stack + 4 ) 529 { 530 bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 531 bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 532 bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); 533 bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); 534 error = CFF_Err_Ok; 535 536 FT_TRACE4(( " [%d %d %d %d]\n", 537 bbox->xMin / 65536, 538 bbox->yMin / 65536, 539 bbox->xMax / 65536, 540 bbox->yMax / 65536 )); 541 } 542 543 return error; 544 } 545 546 547 static FT_Error 548 cff_parse_private_dict( CFF_Parser parser ) 549 { 550 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 551 FT_Byte** data = parser->stack; 552 FT_Error error; 553 554 555 error = CFF_Err_Stack_Underflow; 556 557 if ( parser->top >= parser->stack + 2 ) 558 { 559 dict->private_size = cff_parse_num( data++ ); 560 dict->private_offset = cff_parse_num( data ); 561 FT_TRACE4(( " %lu %lu\n", 562 dict->private_size, dict->private_offset )); 563 564 error = CFF_Err_Ok; 565 } 566 567 return error; 568 } 569 570 571 static FT_Error 572 cff_parse_cid_ros( CFF_Parser parser ) 573 { 574 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 575 FT_Byte** data = parser->stack; 576 FT_Error error; 577 578 579 error = CFF_Err_Stack_Underflow; 580 581 if ( parser->top >= parser->stack + 3 ) 582 { 583 dict->cid_registry = (FT_UInt)cff_parse_num( data++ ); 584 dict->cid_ordering = (FT_UInt)cff_parse_num( data++ ); 585 if ( **data == 30 ) 586 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); 587 dict->cid_supplement = cff_parse_num( data ); 588 if ( dict->cid_supplement < 0 ) 589 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", 590 dict->cid_supplement )); 591 error = CFF_Err_Ok; 592 593 FT_TRACE4(( " %d %d %d\n", 594 dict->cid_registry, 595 dict->cid_ordering, 596 dict->cid_supplement )); 597 } 598 599 return error; 600 } 601 602 603 #define CFF_FIELD_NUM( code, name, id ) \ 604 CFF_FIELD( code, name, id, cff_kind_num ) 605 #define CFF_FIELD_FIXED( code, name, id ) \ 606 CFF_FIELD( code, name, id, cff_kind_fixed ) 607 #define CFF_FIELD_FIXED_1000( code, name, id ) \ 608 CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) 609 #define CFF_FIELD_STRING( code, name, id ) \ 610 CFF_FIELD( code, name, id, cff_kind_string ) 611 #define CFF_FIELD_BOOL( code, name, id ) \ 612 CFF_FIELD( code, name, id, cff_kind_bool ) 613 614 #define CFFCODE_TOPDICT 0x1000 615 #define CFFCODE_PRIVATE 0x2000 616 617 618 #ifndef FT_CONFIG_OPTION_PIC 619 620 621 #undef CFF_FIELD 622 #undef CFF_FIELD_DELTA 623 624 625 #ifndef FT_DEBUG_LEVEL_TRACE 626 627 628 #define CFF_FIELD_CALLBACK( code, name, id ) \ 629 { \ 630 cff_kind_callback, \ 631 code | CFFCODE, \ 632 0, 0, \ 633 cff_parse_ ## name, \ 634 0, 0 \ 635 }, 636 637 #define CFF_FIELD( code, name, id, kind ) \ 638 { \ 639 kind, \ 640 code | CFFCODE, \ 641 FT_FIELD_OFFSET( name ), \ 642 FT_FIELD_SIZE( name ), \ 643 0, 0, 0 \ 644 }, 645 646 #define CFF_FIELD_DELTA( code, name, max, id ) \ 647 { \ 648 cff_kind_delta, \ 649 code | CFFCODE, \ 650 FT_FIELD_OFFSET( name ), \ 651 FT_FIELD_SIZE_DELTA( name ), \ 652 0, \ 653 max, \ 654 FT_FIELD_OFFSET( num_ ## name ) \ 655 }, 656 657 static const CFF_Field_Handler cff_field_handlers[] = 658 { 659 660 #include "cfftoken.h" 661 662 { 0, 0, 0, 0, 0, 0, 0 } 663 }; 664 665 666 #else /* FT_DEBUG_LEVEL_TRACE */ 667 668 669 670 #define CFF_FIELD_CALLBACK( code, name, id ) \ 671 { \ 672 cff_kind_callback, \ 673 code | CFFCODE, \ 674 0, 0, \ 675 cff_parse_ ## name, \ 676 0, 0, \ 677 id \ 678 }, 679 680 #define CFF_FIELD( code, name, id, kind ) \ 681 { \ 682 kind, \ 683 code | CFFCODE, \ 684 FT_FIELD_OFFSET( name ), \ 685 FT_FIELD_SIZE( name ), \ 686 0, 0, 0, \ 687 id \ 688 }, 689 690 #define CFF_FIELD_DELTA( code, name, max, id ) \ 691 { \ 692 cff_kind_delta, \ 693 code | CFFCODE, \ 694 FT_FIELD_OFFSET( name ), \ 695 FT_FIELD_SIZE_DELTA( name ), \ 696 0, \ 697 max, \ 698 FT_FIELD_OFFSET( num_ ## name ), \ 699 id \ 700 }, 701 702 static const CFF_Field_Handler cff_field_handlers[] = 703 { 704 705 #include "cfftoken.h" 706 707 { 0, 0, 0, 0, 0, 0, 0, 0 } 708 }; 709 710 711 #endif /* FT_DEBUG_LEVEL_TRACE */ 712 713 714 #else /* FT_CONFIG_OPTION_PIC */ 715 716 717 void 718 FT_Destroy_Class_cff_field_handlers( FT_Library library, 719 CFF_Field_Handler* clazz ) 720 { 721 FT_Memory memory = library->memory; 722 723 724 if ( clazz ) 725 FT_FREE( clazz ); 726 } 727 728 729 FT_Error 730 FT_Create_Class_cff_field_handlers( FT_Library library, 731 CFF_Field_Handler** output_class ) 732 { 733 CFF_Field_Handler* clazz; 734 FT_Error error; 735 FT_Memory memory = library->memory; 736 737 int i = 0; 738 739 740 #undef CFF_FIELD 741 #define CFF_FIELD( code, name, id, kind ) i++; 742 #undef CFF_FIELD_DELTA 743 #define CFF_FIELD_DELTA( code, name, max, id ) i++; 744 #undef CFF_FIELD_CALLBACK 745 #define CFF_FIELD_CALLBACK( code, name, id ) i++; 746 747 #include "cfftoken.h" 748 749 i++; /* { 0, 0, 0, 0, 0, 0, 0 } */ 750 751 if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) ) 752 return error; 753 754 i = 0; 755 756 757 #ifndef FT_DEBUG_LEVEL_TRACE 758 759 760 #undef CFF_FIELD_CALLBACK 761 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ 762 clazz[i].kind = cff_kind_callback; \ 763 clazz[i].code = code_ | CFFCODE; \ 764 clazz[i].offset = 0; \ 765 clazz[i].size = 0; \ 766 clazz[i].reader = cff_parse_ ## name_; \ 767 clazz[i].array_max = 0; \ 768 clazz[i].count_offset = 0; \ 769 i++; 770 771 #undef CFF_FIELD 772 #define CFF_FIELD( code_, name_, id_, kind_ ) \ 773 clazz[i].kind = kind_; \ 774 clazz[i].code = code_ | CFFCODE; \ 775 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 776 clazz[i].size = FT_FIELD_SIZE( name_ ); \ 777 clazz[i].reader = 0; \ 778 clazz[i].array_max = 0; \ 779 clazz[i].count_offset = 0; \ 780 i++; \ 781 782 #undef CFF_FIELD_DELTA 783 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ 784 clazz[i].kind = cff_kind_delta; \ 785 clazz[i].code = code_ | CFFCODE; \ 786 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 787 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ 788 clazz[i].reader = 0; \ 789 clazz[i].array_max = max_; \ 790 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ 791 i++; 792 793 #include "cfftoken.h" 794 795 clazz[i].kind = 0; 796 clazz[i].code = 0; 797 clazz[i].offset = 0; 798 clazz[i].size = 0; 799 clazz[i].reader = 0; 800 clazz[i].array_max = 0; 801 clazz[i].count_offset = 0; 802 803 804 #else /* FT_DEBUG_LEVEL_TRACE */ 805 806 807 #undef CFF_FIELD_CALLBACK 808 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ 809 clazz[i].kind = cff_kind_callback; \ 810 clazz[i].code = code_ | CFFCODE; \ 811 clazz[i].offset = 0; \ 812 clazz[i].size = 0; \ 813 clazz[i].reader = cff_parse_ ## name_; \ 814 clazz[i].array_max = 0; \ 815 clazz[i].count_offset = 0; \ 816 clazz[i].id = id_; \ 817 i++; 818 819 #undef CFF_FIELD 820 #define CFF_FIELD( code_, name_, id_, kind_ ) \ 821 clazz[i].kind = kind_; \ 822 clazz[i].code = code_ | CFFCODE; \ 823 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 824 clazz[i].size = FT_FIELD_SIZE( name_ ); \ 825 clazz[i].reader = 0; \ 826 clazz[i].array_max = 0; \ 827 clazz[i].count_offset = 0; \ 828 clazz[i].id = id_; \ 829 i++; \ 830 831 #undef CFF_FIELD_DELTA 832 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ 833 clazz[i].kind = cff_kind_delta; \ 834 clazz[i].code = code_ | CFFCODE; \ 835 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 836 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ 837 clazz[i].reader = 0; \ 838 clazz[i].array_max = max_; \ 839 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ 840 clazz[i].id = id_; \ 841 i++; 842 843 #include "cfftoken.h" 844 845 clazz[i].kind = 0; 846 clazz[i].code = 0; 847 clazz[i].offset = 0; 848 clazz[i].size = 0; 849 clazz[i].reader = 0; 850 clazz[i].array_max = 0; 851 clazz[i].count_offset = 0; 852 clazz[i].id = 0; 853 854 855 #endif /* FT_DEBUG_LEVEL_TRACE */ 856 857 858 *output_class = clazz; 859 860 return CFF_Err_Ok; 861 } 862 863 864 #endif /* FT_CONFIG_OPTION_PIC */ 865 866 867 FT_LOCAL_DEF( FT_Error ) 868 cff_parser_run( CFF_Parser parser, 869 FT_Byte* start, 870 FT_Byte* limit ) 871 { 872 FT_Byte* p = start; 873 FT_Error error = CFF_Err_Ok; 874 FT_Library library = parser->library; 875 FT_UNUSED( library ); 876 877 878 parser->top = parser->stack; 879 parser->start = start; 880 parser->limit = limit; 881 parser->cursor = start; 882 883 while ( p < limit ) 884 { 885 FT_UInt v = *p; 886 887 888 if ( v >= 27 && v != 31 ) 889 { 890 /* it's a number; we will push its position on the stack */ 891 if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) 892 goto Stack_Overflow; 893 894 *parser->top ++ = p; 895 896 /* now, skip it */ 897 if ( v == 30 ) 898 { 899 /* skip real number */ 900 p++; 901 for (;;) 902 { 903 /* An unterminated floating point number at the */ 904 /* end of a dictionary is invalid but harmless. */ 905 if ( p >= limit ) 906 goto Exit; 907 v = p[0] >> 4; 908 if ( v == 15 ) 909 break; 910 v = p[0] & 0xF; 911 if ( v == 15 ) 912 break; 913 p++; 914 } 915 } 916 else if ( v == 28 ) 917 p += 2; 918 else if ( v == 29 ) 919 p += 4; 920 else if ( v > 246 ) 921 p += 1; 922 } 923 else 924 { 925 /* This is not a number, hence it's an operator. Compute its code */ 926 /* and look for it in our current list. */ 927 928 FT_UInt code; 929 FT_UInt num_args = (FT_UInt) 930 ( parser->top - parser->stack ); 931 const CFF_Field_Handler* field; 932 933 934 *parser->top = p; 935 code = v; 936 if ( v == 12 ) 937 { 938 /* two byte operator */ 939 p++; 940 if ( p >= limit ) 941 goto Syntax_Error; 942 943 code = 0x100 | p[0]; 944 } 945 code = code | parser->object_code; 946 947 for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) 948 { 949 if ( field->code == (FT_Int)code ) 950 { 951 /* we found our field's handler; read it */ 952 FT_Long val; 953 FT_Byte* q = (FT_Byte*)parser->object + field->offset; 954 955 956 #ifdef FT_DEBUG_LEVEL_TRACE 957 FT_TRACE4(( " %s", field->id )); 958 #endif 959 960 /* check that we have enough arguments -- except for */ 961 /* delta encoded arrays, which can be empty */ 962 if ( field->kind != cff_kind_delta && num_args < 1 ) 963 goto Stack_Underflow; 964 965 switch ( field->kind ) 966 { 967 case cff_kind_bool: 968 case cff_kind_string: 969 case cff_kind_num: 970 val = cff_parse_num( parser->stack ); 971 goto Store_Number; 972 973 case cff_kind_fixed: 974 val = cff_parse_fixed( parser->stack ); 975 goto Store_Number; 976 977 case cff_kind_fixed_thousand: 978 val = cff_parse_fixed_scaled( parser->stack, 3 ); 979 980 Store_Number: 981 switch ( field->size ) 982 { 983 case (8 / FT_CHAR_BIT): 984 *(FT_Byte*)q = (FT_Byte)val; 985 break; 986 987 case (16 / FT_CHAR_BIT): 988 *(FT_Short*)q = (FT_Short)val; 989 break; 990 991 case (32 / FT_CHAR_BIT): 992 *(FT_Int32*)q = (FT_Int)val; 993 break; 994 995 default: /* for 64-bit systems */ 996 *(FT_Long*)q = val; 997 } 998 999 #ifdef FT_DEBUG_LEVEL_TRACE 1000 switch ( field->kind ) 1001 { 1002 case cff_kind_bool: 1003 FT_TRACE4(( " %s\n", val ? "true" : "false" )); 1004 break; 1005 1006 case cff_kind_string: 1007 FT_TRACE4(( " %ld (SID)\n", val )); 1008 break; 1009 1010 case cff_kind_num: 1011 FT_TRACE4(( " %ld\n", val )); 1012 break; 1013 1014 case cff_kind_fixed: 1015 FT_TRACE4(( " %f\n", (double)val / 65536 )); 1016 break; 1017 1018 case cff_kind_fixed_thousand: 1019 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 )); 1020 1021 default: 1022 ; /* never reached */ 1023 } 1024 #endif 1025 1026 break; 1027 1028 case cff_kind_delta: 1029 { 1030 FT_Byte* qcount = (FT_Byte*)parser->object + 1031 field->count_offset; 1032 1033 FT_Byte** data = parser->stack; 1034 1035 1036 if ( num_args > field->array_max ) 1037 num_args = field->array_max; 1038 1039 FT_TRACE4(( " [" )); 1040 1041 /* store count */ 1042 *qcount = (FT_Byte)num_args; 1043 1044 val = 0; 1045 while ( num_args > 0 ) 1046 { 1047 val += cff_parse_num( data++ ); 1048 switch ( field->size ) 1049 { 1050 case (8 / FT_CHAR_BIT): 1051 *(FT_Byte*)q = (FT_Byte)val; 1052 break; 1053 1054 case (16 / FT_CHAR_BIT): 1055 *(FT_Short*)q = (FT_Short)val; 1056 break; 1057 1058 case (32 / FT_CHAR_BIT): 1059 *(FT_Int32*)q = (FT_Int)val; 1060 break; 1061 1062 default: /* for 64-bit systems */ 1063 *(FT_Long*)q = val; 1064 } 1065 1066 FT_TRACE4(( " %ld", val )); 1067 1068 q += field->size; 1069 num_args--; 1070 } 1071 1072 FT_TRACE4(( "]\n" )); 1073 } 1074 break; 1075 1076 default: /* callback */ 1077 error = field->reader( parser ); 1078 if ( error ) 1079 goto Exit; 1080 } 1081 goto Found; 1082 } 1083 } 1084 1085 /* this is an unknown operator, or it is unsupported; */ 1086 /* we will ignore it for now. */ 1087 1088 Found: 1089 /* clear stack */ 1090 parser->top = parser->stack; 1091 } 1092 p++; 1093 } 1094 1095 Exit: 1096 return error; 1097 1098 Stack_Overflow: 1099 error = CFF_Err_Invalid_Argument; 1100 goto Exit; 1101 1102 Stack_Underflow: 1103 error = CFF_Err_Invalid_Argument; 1104 goto Exit; 1105 1106 Syntax_Error: 1107 error = CFF_Err_Invalid_Argument; 1108 goto Exit; 1109 } 1110 1111 1112 /* END */ 1113