1 /***************************************************************************/ 2 /* */ 3 /* cffparse.c */ 4 /* */ 5 /* CFF token stream parser (body) */ 6 /* */ 7 /* Copyright 1996-2018 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 #include FT_INTERNAL_CALC_H 24 #include FT_INTERNAL_POSTSCRIPT_AUX_H 25 26 #include "cfferrs.h" 27 #include "cffpic.h" 28 #include "cffload.h" 29 30 31 /*************************************************************************/ 32 /* */ 33 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 34 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 35 /* messages during execution. */ 36 /* */ 37 #undef FT_COMPONENT 38 #define FT_COMPONENT trace_cffparse 39 40 41 FT_LOCAL_DEF( FT_Error ) 42 cff_parser_init( CFF_Parser parser, 43 FT_UInt code, 44 void* object, 45 FT_Library library, 46 FT_UInt stackSize, 47 FT_UShort num_designs, 48 FT_UShort num_axes ) 49 { 50 FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */ 51 FT_Error error; /* for FT_NEW_ARRAY */ 52 53 54 FT_ZERO( parser ); 55 56 #if 0 57 parser->top = parser->stack; 58 #endif 59 parser->object_code = code; 60 parser->object = object; 61 parser->library = library; 62 parser->num_designs = num_designs; 63 parser->num_axes = num_axes; 64 65 /* allocate the stack buffer */ 66 if ( FT_NEW_ARRAY( parser->stack, stackSize ) ) 67 { 68 FT_FREE( parser->stack ); 69 goto Exit; 70 } 71 72 parser->stackSize = stackSize; 73 parser->top = parser->stack; /* empty stack */ 74 75 Exit: 76 return error; 77 } 78 79 80 FT_LOCAL_DEF( void ) 81 cff_parser_done( CFF_Parser parser ) 82 { 83 FT_Memory memory = parser->library->memory; /* for FT_FREE */ 84 85 86 FT_FREE( parser->stack ); 87 } 88 89 90 /* read an integer */ 91 static FT_Long 92 cff_parse_integer( FT_Byte* start, 93 FT_Byte* limit ) 94 { 95 FT_Byte* p = start; 96 FT_Int v = *p++; 97 FT_Long val = 0; 98 99 100 if ( v == 28 ) 101 { 102 if ( p + 2 > limit ) 103 goto Bad; 104 105 val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); 106 } 107 else if ( v == 29 ) 108 { 109 if ( p + 4 > limit ) 110 goto Bad; 111 112 val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | 113 ( (FT_ULong)p[1] << 16 ) | 114 ( (FT_ULong)p[2] << 8 ) | 115 (FT_ULong)p[3] ); 116 } 117 else if ( v < 247 ) 118 { 119 val = v - 139; 120 } 121 else if ( v < 251 ) 122 { 123 if ( p + 1 > limit ) 124 goto Bad; 125 126 val = ( v - 247 ) * 256 + p[0] + 108; 127 } 128 else 129 { 130 if ( p + 1 > limit ) 131 goto Bad; 132 133 val = -( v - 251 ) * 256 - p[0] - 108; 134 } 135 136 Exit: 137 return val; 138 139 Bad: 140 val = 0; 141 FT_TRACE4(( "!!!END OF DATA:!!!" )); 142 goto Exit; 143 } 144 145 146 static const FT_Long power_tens[] = 147 { 148 1L, 149 10L, 150 100L, 151 1000L, 152 10000L, 153 100000L, 154 1000000L, 155 10000000L, 156 100000000L, 157 1000000000L 158 }; 159 160 /* maximum values allowed for multiplying */ 161 /* with the corresponding `power_tens' element */ 162 static const FT_Long power_ten_limits[] = 163 { 164 FT_LONG_MAX / 1L, 165 FT_LONG_MAX / 10L, 166 FT_LONG_MAX / 100L, 167 FT_LONG_MAX / 1000L, 168 FT_LONG_MAX / 10000L, 169 FT_LONG_MAX / 100000L, 170 FT_LONG_MAX / 1000000L, 171 FT_LONG_MAX / 10000000L, 172 FT_LONG_MAX / 100000000L, 173 FT_LONG_MAX / 1000000000L, 174 }; 175 176 177 /* read a real */ 178 static FT_Fixed 179 cff_parse_real( FT_Byte* start, 180 FT_Byte* limit, 181 FT_Long power_ten, 182 FT_Long* scaling ) 183 { 184 FT_Byte* p = start; 185 FT_Int nib; 186 FT_UInt phase; 187 188 FT_Long result, number, exponent; 189 FT_Int sign = 0, exponent_sign = 0, have_overflow = 0; 190 FT_Long exponent_add, integer_length, fraction_length; 191 192 193 if ( scaling ) 194 *scaling = 0; 195 196 result = 0; 197 198 number = 0; 199 exponent = 0; 200 201 exponent_add = 0; 202 integer_length = 0; 203 fraction_length = 0; 204 205 /* First of all, read the integer part. */ 206 phase = 4; 207 208 for (;;) 209 { 210 /* If we entered this iteration with phase == 4, we need to */ 211 /* read a new byte. This also skips past the initial 0x1E. */ 212 if ( phase ) 213 { 214 p++; 215 216 /* Make sure we don't read past the end. */ 217 if ( p >= limit ) 218 goto Bad; 219 } 220 221 /* Get the nibble. */ 222 nib = (FT_Int)( p[0] >> phase ) & 0xF; 223 phase = 4 - phase; 224 225 if ( nib == 0xE ) 226 sign = 1; 227 else if ( nib > 9 ) 228 break; 229 else 230 { 231 /* Increase exponent if we can't add the digit. */ 232 if ( number >= 0xCCCCCCCL ) 233 exponent_add++; 234 /* Skip leading zeros. */ 235 else if ( nib || number ) 236 { 237 integer_length++; 238 number = number * 10 + nib; 239 } 240 } 241 } 242 243 /* Read fraction part, if any. */ 244 if ( nib == 0xA ) 245 for (;;) 246 { 247 /* If we entered this iteration with phase == 4, we need */ 248 /* to read a new byte. */ 249 if ( phase ) 250 { 251 p++; 252 253 /* Make sure we don't read past the end. */ 254 if ( p >= limit ) 255 goto Bad; 256 } 257 258 /* Get the nibble. */ 259 nib = ( p[0] >> phase ) & 0xF; 260 phase = 4 - phase; 261 if ( nib >= 10 ) 262 break; 263 264 /* Skip leading zeros if possible. */ 265 if ( !nib && !number ) 266 exponent_add--; 267 /* Only add digit if we don't overflow. */ 268 else if ( number < 0xCCCCCCCL && fraction_length < 9 ) 269 { 270 fraction_length++; 271 number = number * 10 + nib; 272 } 273 } 274 275 /* Read exponent, if any. */ 276 if ( nib == 12 ) 277 { 278 exponent_sign = 1; 279 nib = 11; 280 } 281 282 if ( nib == 11 ) 283 { 284 for (;;) 285 { 286 /* If we entered this iteration with phase == 4, */ 287 /* we need to read a new byte. */ 288 if ( phase ) 289 { 290 p++; 291 292 /* Make sure we don't read past the end. */ 293 if ( p >= limit ) 294 goto Bad; 295 } 296 297 /* Get the nibble. */ 298 nib = ( p[0] >> phase ) & 0xF; 299 phase = 4 - phase; 300 if ( nib >= 10 ) 301 break; 302 303 /* Arbitrarily limit exponent. */ 304 if ( exponent > 1000 ) 305 have_overflow = 1; 306 else 307 exponent = exponent * 10 + nib; 308 } 309 310 if ( exponent_sign ) 311 exponent = -exponent; 312 } 313 314 if ( !number ) 315 goto Exit; 316 317 if ( have_overflow ) 318 { 319 if ( exponent_sign ) 320 goto Underflow; 321 else 322 goto Overflow; 323 } 324 325 /* We don't check `power_ten' and `exponent_add'. */ 326 exponent += power_ten + exponent_add; 327 328 if ( scaling ) 329 { 330 /* Only use `fraction_length'. */ 331 fraction_length += integer_length; 332 exponent += integer_length; 333 334 if ( fraction_length <= 5 ) 335 { 336 if ( number > 0x7FFFL ) 337 { 338 result = FT_DivFix( number, 10 ); 339 *scaling = exponent - fraction_length + 1; 340 } 341 else 342 { 343 if ( exponent > 0 ) 344 { 345 FT_Long new_fraction_length, shift; 346 347 348 /* Make `scaling' as small as possible. */ 349 new_fraction_length = FT_MIN( exponent, 5 ); 350 shift = new_fraction_length - fraction_length; 351 352 if ( shift > 0 ) 353 { 354 exponent -= new_fraction_length; 355 number *= power_tens[shift]; 356 if ( number > 0x7FFFL ) 357 { 358 number /= 10; 359 exponent += 1; 360 } 361 } 362 else 363 exponent -= fraction_length; 364 } 365 else 366 exponent -= fraction_length; 367 368 result = (FT_Long)( (FT_ULong)number << 16 ); 369 *scaling = exponent; 370 } 371 } 372 else 373 { 374 if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) 375 { 376 result = FT_DivFix( number, power_tens[fraction_length - 4] ); 377 *scaling = exponent - 4; 378 } 379 else 380 { 381 result = FT_DivFix( number, power_tens[fraction_length - 5] ); 382 *scaling = exponent - 5; 383 } 384 } 385 } 386 else 387 { 388 integer_length += exponent; 389 fraction_length -= exponent; 390 391 if ( integer_length > 5 ) 392 goto Overflow; 393 if ( integer_length < -5 ) 394 goto Underflow; 395 396 /* Remove non-significant digits. */ 397 if ( integer_length < 0 ) 398 { 399 number /= power_tens[-integer_length]; 400 fraction_length += integer_length; 401 } 402 403 /* this can only happen if exponent was non-zero */ 404 if ( fraction_length == 10 ) 405 { 406 number /= 10; 407 fraction_length -= 1; 408 } 409 410 /* Convert into 16.16 format. */ 411 if ( fraction_length > 0 ) 412 { 413 if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) 414 goto Exit; 415 416 result = FT_DivFix( number, power_tens[fraction_length] ); 417 } 418 else 419 { 420 number *= power_tens[-fraction_length]; 421 422 if ( number > 0x7FFFL ) 423 goto Overflow; 424 425 result = (FT_Long)( (FT_ULong)number << 16 ); 426 } 427 } 428 429 Exit: 430 if ( sign ) 431 result = -result; 432 433 return result; 434 435 Overflow: 436 result = 0x7FFFFFFFL; 437 FT_TRACE4(( "!!!OVERFLOW:!!!" )); 438 goto Exit; 439 440 Underflow: 441 result = 0; 442 FT_TRACE4(( "!!!UNDERFLOW:!!!" )); 443 goto Exit; 444 445 Bad: 446 result = 0; 447 FT_TRACE4(( "!!!END OF DATA:!!!" )); 448 goto Exit; 449 } 450 451 452 /* read a number, either integer or real */ 453 FT_LOCAL_DEF( FT_Long ) 454 cff_parse_num( CFF_Parser parser, 455 FT_Byte** d ) 456 { 457 if ( **d == 30 ) 458 { 459 /* binary-coded decimal is truncated to integer */ 460 return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; 461 } 462 463 else if ( **d == 255 ) 464 { 465 /* 16.16 fixed point is used internally for CFF2 blend results. */ 466 /* Since these are trusted values, a limit check is not needed. */ 467 468 /* After the 255, 4 bytes give the number. */ 469 /* The blend value is converted to integer, with rounding; */ 470 /* due to the right-shift we don't need the lowest byte. */ 471 #if 0 472 return (FT_Short)( 473 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | 474 ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | 475 ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | 476 (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 ); 477 #else 478 return (FT_Short)( 479 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) | 480 ( (FT_UInt32)*( d[0] + 2 ) << 8 ) | 481 (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 ); 482 #endif 483 } 484 485 else 486 return cff_parse_integer( *d, parser->limit ); 487 } 488 489 490 /* read a floating point number, either integer or real */ 491 static FT_Fixed 492 do_fixed( CFF_Parser parser, 493 FT_Byte** d, 494 FT_Long scaling ) 495 { 496 if ( **d == 30 ) 497 return cff_parse_real( *d, parser->limit, scaling, NULL ); 498 else 499 { 500 FT_Long val = cff_parse_integer( *d, parser->limit ); 501 502 503 if ( scaling ) 504 { 505 if ( FT_ABS( val ) > power_ten_limits[scaling] ) 506 { 507 val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; 508 goto Overflow; 509 } 510 511 val *= power_tens[scaling]; 512 } 513 514 if ( val > 0x7FFF ) 515 { 516 val = 0x7FFFFFFFL; 517 goto Overflow; 518 } 519 else if ( val < -0x7FFF ) 520 { 521 val = -0x7FFFFFFFL; 522 goto Overflow; 523 } 524 525 return (FT_Long)( (FT_ULong)val << 16 ); 526 527 Overflow: 528 FT_TRACE4(( "!!!OVERFLOW:!!!" )); 529 return val; 530 } 531 } 532 533 534 /* read a floating point number, either integer or real */ 535 static FT_Fixed 536 cff_parse_fixed( CFF_Parser parser, 537 FT_Byte** d ) 538 { 539 return do_fixed( parser, d, 0 ); 540 } 541 542 543 /* read a floating point number, either integer or real, */ 544 /* but return `10^scaling' times the number read in */ 545 static FT_Fixed 546 cff_parse_fixed_scaled( CFF_Parser parser, 547 FT_Byte** d, 548 FT_Long scaling ) 549 { 550 return do_fixed( parser, d, scaling ); 551 } 552 553 554 /* read a floating point number, either integer or real, */ 555 /* and return it as precise as possible -- `scaling' returns */ 556 /* the scaling factor (as a power of 10) */ 557 static FT_Fixed 558 cff_parse_fixed_dynamic( CFF_Parser parser, 559 FT_Byte** d, 560 FT_Long* scaling ) 561 { 562 FT_ASSERT( scaling ); 563 564 if ( **d == 30 ) 565 return cff_parse_real( *d, parser->limit, 0, scaling ); 566 else 567 { 568 FT_Long number; 569 FT_Int integer_length; 570 571 572 number = cff_parse_integer( d[0], d[1] ); 573 574 if ( number > 0x7FFFL ) 575 { 576 for ( integer_length = 5; integer_length < 10; integer_length++ ) 577 if ( number < power_tens[integer_length] ) 578 break; 579 580 if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) 581 { 582 *scaling = integer_length - 4; 583 return FT_DivFix( number, power_tens[integer_length - 4] ); 584 } 585 else 586 { 587 *scaling = integer_length - 5; 588 return FT_DivFix( number, power_tens[integer_length - 5] ); 589 } 590 } 591 else 592 { 593 *scaling = 0; 594 return (FT_Long)( (FT_ULong)number << 16 ); 595 } 596 } 597 } 598 599 600 static FT_Error 601 cff_parse_font_matrix( CFF_Parser parser ) 602 { 603 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 604 FT_Matrix* matrix = &dict->font_matrix; 605 FT_Vector* offset = &dict->font_offset; 606 FT_ULong* upm = &dict->units_per_em; 607 FT_Byte** data = parser->stack; 608 FT_Error error = FT_ERR( Stack_Underflow ); 609 610 611 if ( parser->top >= parser->stack + 6 ) 612 { 613 FT_Fixed values[6]; 614 FT_Long scalings[6]; 615 616 FT_Long min_scaling, max_scaling; 617 int i; 618 619 620 error = FT_Err_Ok; 621 622 dict->has_font_matrix = TRUE; 623 624 /* We expect a well-formed font matrix, this is, the matrix elements */ 625 /* `xx' and `yy' are of approximately the same magnitude. To avoid */ 626 /* loss of precision, we use the magnitude of the largest matrix */ 627 /* element to scale all other elements. The scaling factor is then */ 628 /* contained in the `units_per_em' value. */ 629 630 max_scaling = FT_LONG_MIN; 631 min_scaling = FT_LONG_MAX; 632 633 for ( i = 0; i < 6; i++ ) 634 { 635 values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] ); 636 if ( values[i] ) 637 { 638 if ( scalings[i] > max_scaling ) 639 max_scaling = scalings[i]; 640 if ( scalings[i] < min_scaling ) 641 min_scaling = scalings[i]; 642 } 643 } 644 645 if ( max_scaling < -9 || 646 max_scaling > 0 || 647 ( max_scaling - min_scaling ) < 0 || 648 ( max_scaling - min_scaling ) > 9 ) 649 { 650 /* Return default matrix in case of unlikely values. */ 651 652 FT_TRACE1(( "cff_parse_font_matrix:" 653 " strange scaling values (minimum %d, maximum %d),\n" 654 " " 655 " using default matrix\n", min_scaling, max_scaling )); 656 657 matrix->xx = 0x10000L; 658 matrix->yx = 0; 659 matrix->xy = 0; 660 matrix->yy = 0x10000L; 661 offset->x = 0; 662 offset->y = 0; 663 *upm = 1; 664 665 goto Exit; 666 } 667 668 for ( i = 0; i < 6; i++ ) 669 { 670 FT_Fixed value = values[i]; 671 FT_Long divisor, half_divisor; 672 673 674 if ( !value ) 675 continue; 676 677 divisor = power_tens[max_scaling - scalings[i]]; 678 half_divisor = divisor >> 1; 679 680 if ( value < 0 ) 681 { 682 if ( FT_LONG_MIN + half_divisor < value ) 683 values[i] = ( value - half_divisor ) / divisor; 684 else 685 values[i] = FT_LONG_MIN / divisor; 686 } 687 else 688 { 689 if ( FT_LONG_MAX - half_divisor > value ) 690 values[i] = ( value + half_divisor ) / divisor; 691 else 692 values[i] = FT_LONG_MAX / divisor; 693 } 694 } 695 696 matrix->xx = values[0]; 697 matrix->yx = values[1]; 698 matrix->xy = values[2]; 699 matrix->yy = values[3]; 700 offset->x = values[4]; 701 offset->y = values[5]; 702 703 *upm = (FT_ULong)power_tens[-max_scaling]; 704 705 FT_TRACE4(( " [%f %f %f %f %f %f]\n", 706 (double)matrix->xx / *upm / 65536, 707 (double)matrix->xy / *upm / 65536, 708 (double)matrix->yx / *upm / 65536, 709 (double)matrix->yy / *upm / 65536, 710 (double)offset->x / *upm / 65536, 711 (double)offset->y / *upm / 65536 )); 712 } 713 714 Exit: 715 return error; 716 } 717 718 719 static FT_Error 720 cff_parse_font_bbox( CFF_Parser parser ) 721 { 722 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 723 FT_BBox* bbox = &dict->font_bbox; 724 FT_Byte** data = parser->stack; 725 FT_Error error; 726 727 728 error = FT_ERR( Stack_Underflow ); 729 730 if ( parser->top >= parser->stack + 4 ) 731 { 732 bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); 733 bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); 734 bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); 735 bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); 736 error = FT_Err_Ok; 737 738 FT_TRACE4(( " [%d %d %d %d]\n", 739 bbox->xMin / 65536, 740 bbox->yMin / 65536, 741 bbox->xMax / 65536, 742 bbox->yMax / 65536 )); 743 } 744 745 return error; 746 } 747 748 749 static FT_Error 750 cff_parse_private_dict( CFF_Parser parser ) 751 { 752 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 753 FT_Byte** data = parser->stack; 754 FT_Error error; 755 756 757 error = FT_ERR( Stack_Underflow ); 758 759 if ( parser->top >= parser->stack + 2 ) 760 { 761 FT_Long tmp; 762 763 764 tmp = cff_parse_num( parser, data++ ); 765 if ( tmp < 0 ) 766 { 767 FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); 768 error = FT_THROW( Invalid_File_Format ); 769 goto Fail; 770 } 771 dict->private_size = (FT_ULong)tmp; 772 773 tmp = cff_parse_num( parser, data ); 774 if ( tmp < 0 ) 775 { 776 FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); 777 error = FT_THROW( Invalid_File_Format ); 778 goto Fail; 779 } 780 dict->private_offset = (FT_ULong)tmp; 781 782 FT_TRACE4(( " %lu %lu\n", 783 dict->private_size, dict->private_offset )); 784 785 error = FT_Err_Ok; 786 } 787 788 Fail: 789 return error; 790 } 791 792 793 /* The `MultipleMaster' operator comes before any */ 794 /* top DICT operators that contain T2 charstrings. */ 795 796 static FT_Error 797 cff_parse_multiple_master( CFF_Parser parser ) 798 { 799 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 800 FT_Error error; 801 802 803 #ifdef FT_DEBUG_LEVEL_TRACE 804 /* beautify tracing message */ 805 if ( ft_trace_levels[FT_COMPONENT] < 4 ) 806 FT_TRACE1(( "Multiple Master CFFs not supported yet," 807 " handling first master design only\n" )); 808 else 809 FT_TRACE1(( " (not supported yet," 810 " handling first master design only)\n" )); 811 #endif 812 813 error = FT_ERR( Stack_Underflow ); 814 815 /* currently, we handle only the first argument */ 816 if ( parser->top >= parser->stack + 5 ) 817 { 818 FT_Long num_designs = cff_parse_num( parser, parser->stack ); 819 820 821 if ( num_designs > 16 || num_designs < 2 ) 822 { 823 FT_ERROR(( "cff_parse_multiple_master:" 824 " Invalid number of designs\n" )); 825 error = FT_THROW( Invalid_File_Format ); 826 } 827 else 828 { 829 dict->num_designs = (FT_UShort)num_designs; 830 dict->num_axes = (FT_UShort)( parser->top - parser->stack - 4 ); 831 832 parser->num_designs = dict->num_designs; 833 parser->num_axes = dict->num_axes; 834 835 error = FT_Err_Ok; 836 } 837 } 838 839 return error; 840 } 841 842 843 static FT_Error 844 cff_parse_cid_ros( CFF_Parser parser ) 845 { 846 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 847 FT_Byte** data = parser->stack; 848 FT_Error error; 849 850 851 error = FT_ERR( Stack_Underflow ); 852 853 if ( parser->top >= parser->stack + 3 ) 854 { 855 dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ ); 856 dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ ); 857 if ( **data == 30 ) 858 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); 859 dict->cid_supplement = cff_parse_num( parser, data ); 860 if ( dict->cid_supplement < 0 ) 861 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", 862 dict->cid_supplement )); 863 error = FT_Err_Ok; 864 865 FT_TRACE4(( " %d %d %d\n", 866 dict->cid_registry, 867 dict->cid_ordering, 868 dict->cid_supplement )); 869 } 870 871 return error; 872 } 873 874 875 static FT_Error 876 cff_parse_vsindex( CFF_Parser parser ) 877 { 878 /* vsindex operator can only be used in a Private DICT */ 879 CFF_Private priv = (CFF_Private)parser->object; 880 FT_Byte** data = parser->stack; 881 CFF_Blend blend; 882 FT_Error error; 883 884 885 if ( !priv || !priv->subfont ) 886 { 887 error = FT_THROW( Invalid_File_Format ); 888 goto Exit; 889 } 890 891 blend = &priv->subfont->blend; 892 893 if ( blend->usedBV ) 894 { 895 FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" )); 896 error = FT_THROW( Syntax_Error ); 897 goto Exit; 898 } 899 900 priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ ); 901 902 FT_TRACE4(( " %d\n", priv->vsindex )); 903 904 error = FT_Err_Ok; 905 906 Exit: 907 return error; 908 } 909 910 911 static FT_Error 912 cff_parse_blend( CFF_Parser parser ) 913 { 914 /* blend operator can only be used in a Private DICT */ 915 CFF_Private priv = (CFF_Private)parser->object; 916 CFF_SubFont subFont; 917 CFF_Blend blend; 918 FT_UInt numBlends; 919 FT_Error error; 920 921 922 if ( !priv || !priv->subfont ) 923 { 924 error = FT_THROW( Invalid_File_Format ); 925 goto Exit; 926 } 927 928 subFont = priv->subfont; 929 blend = &subFont->blend; 930 931 if ( cff_blend_check_vector( blend, 932 priv->vsindex, 933 subFont->lenNDV, 934 subFont->NDV ) ) 935 { 936 error = cff_blend_build_vector( blend, 937 priv->vsindex, 938 subFont->lenNDV, 939 subFont->NDV ); 940 if ( error ) 941 goto Exit; 942 } 943 944 numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 ); 945 if ( numBlends > parser->stackSize ) 946 { 947 FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" )); 948 error = FT_THROW( Invalid_File_Format ); 949 goto Exit; 950 } 951 952 FT_TRACE4(( " %d value%s blended\n", 953 numBlends, 954 numBlends == 1 ? "" : "s" )); 955 956 error = cff_blend_doBlend( subFont, parser, numBlends ); 957 958 blend->usedBV = TRUE; 959 960 Exit: 961 return error; 962 } 963 964 965 /* maxstack operator increases parser and operand stacks for CFF2 */ 966 static FT_Error 967 cff_parse_maxstack( CFF_Parser parser ) 968 { 969 /* maxstack operator can only be used in a Top DICT */ 970 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 971 FT_Byte** data = parser->stack; 972 FT_Error error = FT_Err_Ok; 973 974 975 if ( !dict ) 976 { 977 error = FT_THROW( Invalid_File_Format ); 978 goto Exit; 979 } 980 981 dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ ); 982 if ( dict->maxstack > CFF2_MAX_STACK ) 983 dict->maxstack = CFF2_MAX_STACK; 984 if ( dict->maxstack < CFF2_DEFAULT_STACK ) 985 dict->maxstack = CFF2_DEFAULT_STACK; 986 987 FT_TRACE4(( " %d\n", dict->maxstack )); 988 989 Exit: 990 return error; 991 } 992 993 994 #define CFF_FIELD_NUM( code, name, id ) \ 995 CFF_FIELD( code, name, id, cff_kind_num ) 996 #define CFF_FIELD_FIXED( code, name, id ) \ 997 CFF_FIELD( code, name, id, cff_kind_fixed ) 998 #define CFF_FIELD_FIXED_1000( code, name, id ) \ 999 CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) 1000 #define CFF_FIELD_STRING( code, name, id ) \ 1001 CFF_FIELD( code, name, id, cff_kind_string ) 1002 #define CFF_FIELD_BOOL( code, name, id ) \ 1003 CFF_FIELD( code, name, id, cff_kind_bool ) 1004 1005 1006 #ifndef FT_CONFIG_OPTION_PIC 1007 1008 1009 #undef CFF_FIELD 1010 #undef CFF_FIELD_DELTA 1011 1012 1013 #ifndef FT_DEBUG_LEVEL_TRACE 1014 1015 1016 #define CFF_FIELD_CALLBACK( code, name, id ) \ 1017 { \ 1018 cff_kind_callback, \ 1019 code | CFFCODE, \ 1020 0, 0, \ 1021 cff_parse_ ## name, \ 1022 0, 0 \ 1023 }, 1024 1025 #define CFF_FIELD_BLEND( code, id ) \ 1026 { \ 1027 cff_kind_blend, \ 1028 code | CFFCODE, \ 1029 0, 0, \ 1030 cff_parse_blend, \ 1031 0, 0 \ 1032 }, 1033 1034 #define CFF_FIELD( code, name, id, kind ) \ 1035 { \ 1036 kind, \ 1037 code | CFFCODE, \ 1038 FT_FIELD_OFFSET( name ), \ 1039 FT_FIELD_SIZE( name ), \ 1040 0, 0, 0 \ 1041 }, 1042 1043 #define CFF_FIELD_DELTA( code, name, max, id ) \ 1044 { \ 1045 cff_kind_delta, \ 1046 code | CFFCODE, \ 1047 FT_FIELD_OFFSET( name ), \ 1048 FT_FIELD_SIZE_DELTA( name ), \ 1049 0, \ 1050 max, \ 1051 FT_FIELD_OFFSET( num_ ## name ) \ 1052 }, 1053 1054 static const CFF_Field_Handler cff_field_handlers[] = 1055 { 1056 1057 #include "cfftoken.h" 1058 1059 { 0, 0, 0, 0, 0, 0, 0 } 1060 }; 1061 1062 1063 #else /* FT_DEBUG_LEVEL_TRACE */ 1064 1065 1066 1067 #define CFF_FIELD_CALLBACK( code, name, id ) \ 1068 { \ 1069 cff_kind_callback, \ 1070 code | CFFCODE, \ 1071 0, 0, \ 1072 cff_parse_ ## name, \ 1073 0, 0, \ 1074 id \ 1075 }, 1076 1077 #define CFF_FIELD_BLEND( code, id ) \ 1078 { \ 1079 cff_kind_blend, \ 1080 code | CFFCODE, \ 1081 0, 0, \ 1082 cff_parse_blend, \ 1083 0, 0, \ 1084 id \ 1085 }, 1086 1087 #define CFF_FIELD( code, name, id, kind ) \ 1088 { \ 1089 kind, \ 1090 code | CFFCODE, \ 1091 FT_FIELD_OFFSET( name ), \ 1092 FT_FIELD_SIZE( name ), \ 1093 0, 0, 0, \ 1094 id \ 1095 }, 1096 1097 #define CFF_FIELD_DELTA( code, name, max, id ) \ 1098 { \ 1099 cff_kind_delta, \ 1100 code | CFFCODE, \ 1101 FT_FIELD_OFFSET( name ), \ 1102 FT_FIELD_SIZE_DELTA( name ), \ 1103 0, \ 1104 max, \ 1105 FT_FIELD_OFFSET( num_ ## name ), \ 1106 id \ 1107 }, 1108 1109 static const CFF_Field_Handler cff_field_handlers[] = 1110 { 1111 1112 #include "cfftoken.h" 1113 1114 { 0, 0, 0, 0, 0, 0, 0, 0 } 1115 }; 1116 1117 1118 #endif /* FT_DEBUG_LEVEL_TRACE */ 1119 1120 1121 #else /* FT_CONFIG_OPTION_PIC */ 1122 1123 1124 void 1125 FT_Destroy_Class_cff_field_handlers( FT_Library library, 1126 CFF_Field_Handler* clazz ) 1127 { 1128 FT_Memory memory = library->memory; 1129 1130 1131 if ( clazz ) 1132 FT_FREE( clazz ); 1133 } 1134 1135 1136 FT_Error 1137 FT_Create_Class_cff_field_handlers( FT_Library library, 1138 CFF_Field_Handler** output_class ) 1139 { 1140 CFF_Field_Handler* clazz = NULL; 1141 FT_Error error; 1142 FT_Memory memory = library->memory; 1143 1144 int i = 0; 1145 1146 1147 #undef CFF_FIELD 1148 #define CFF_FIELD( code, name, id, kind ) i++; 1149 #undef CFF_FIELD_DELTA 1150 #define CFF_FIELD_DELTA( code, name, max, id ) i++; 1151 #undef CFF_FIELD_CALLBACK 1152 #define CFF_FIELD_CALLBACK( code, name, id ) i++; 1153 #undef CFF_FIELD_BLEND 1154 #define CFF_FIELD_BLEND( code, id ) i++; 1155 1156 #include "cfftoken.h" 1157 1158 i++; /* { 0, 0, 0, 0, 0, 0, 0 } */ 1159 1160 if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) ) 1161 return error; 1162 1163 i = 0; 1164 1165 1166 #ifndef FT_DEBUG_LEVEL_TRACE 1167 1168 1169 #undef CFF_FIELD_CALLBACK 1170 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ 1171 clazz[i].kind = cff_kind_callback; \ 1172 clazz[i].code = code_ | CFFCODE; \ 1173 clazz[i].offset = 0; \ 1174 clazz[i].size = 0; \ 1175 clazz[i].reader = cff_parse_ ## name_; \ 1176 clazz[i].array_max = 0; \ 1177 clazz[i].count_offset = 0; \ 1178 i++; 1179 1180 #undef CFF_FIELD 1181 #define CFF_FIELD( code_, name_, id_, kind_ ) \ 1182 clazz[i].kind = kind_; \ 1183 clazz[i].code = code_ | CFFCODE; \ 1184 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 1185 clazz[i].size = FT_FIELD_SIZE( name_ ); \ 1186 clazz[i].reader = 0; \ 1187 clazz[i].array_max = 0; \ 1188 clazz[i].count_offset = 0; \ 1189 i++; \ 1190 1191 #undef CFF_FIELD_DELTA 1192 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ 1193 clazz[i].kind = cff_kind_delta; \ 1194 clazz[i].code = code_ | CFFCODE; \ 1195 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 1196 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ 1197 clazz[i].reader = 0; \ 1198 clazz[i].array_max = max_; \ 1199 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ 1200 i++; 1201 1202 #undef CFF_FIELD_BLEND 1203 #define CFF_FIELD_BLEND( code_, id_ ) \ 1204 clazz[i].kind = cff_kind_blend; \ 1205 clazz[i].code = code_ | CFFCODE; \ 1206 clazz[i].offset = 0; \ 1207 clazz[i].size = 0; \ 1208 clazz[i].reader = cff_parse_blend; \ 1209 clazz[i].array_max = 0; \ 1210 clazz[i].count_offset = 0; \ 1211 i++; 1212 1213 #include "cfftoken.h" 1214 1215 clazz[i].kind = 0; 1216 clazz[i].code = 0; 1217 clazz[i].offset = 0; 1218 clazz[i].size = 0; 1219 clazz[i].reader = 0; 1220 clazz[i].array_max = 0; 1221 clazz[i].count_offset = 0; 1222 1223 1224 #else /* FT_DEBUG_LEVEL_TRACE */ 1225 1226 1227 #undef CFF_FIELD_CALLBACK 1228 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ 1229 clazz[i].kind = cff_kind_callback; \ 1230 clazz[i].code = code_ | CFFCODE; \ 1231 clazz[i].offset = 0; \ 1232 clazz[i].size = 0; \ 1233 clazz[i].reader = cff_parse_ ## name_; \ 1234 clazz[i].array_max = 0; \ 1235 clazz[i].count_offset = 0; \ 1236 clazz[i].id = id_; \ 1237 i++; 1238 1239 #undef CFF_FIELD 1240 #define CFF_FIELD( code_, name_, id_, kind_ ) \ 1241 clazz[i].kind = kind_; \ 1242 clazz[i].code = code_ | CFFCODE; \ 1243 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 1244 clazz[i].size = FT_FIELD_SIZE( name_ ); \ 1245 clazz[i].reader = 0; \ 1246 clazz[i].array_max = 0; \ 1247 clazz[i].count_offset = 0; \ 1248 clazz[i].id = id_; \ 1249 i++; \ 1250 1251 #undef CFF_FIELD_DELTA 1252 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ 1253 clazz[i].kind = cff_kind_delta; \ 1254 clazz[i].code = code_ | CFFCODE; \ 1255 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 1256 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ 1257 clazz[i].reader = 0; \ 1258 clazz[i].array_max = max_; \ 1259 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ 1260 clazz[i].id = id_; \ 1261 i++; 1262 1263 #undef CFF_FIELD_BLEND 1264 #define CFF_FIELD_BLEND( code_, id_ ) \ 1265 clazz[i].kind = cff_kind_blend; \ 1266 clazz[i].code = code_ | CFFCODE; \ 1267 clazz[i].offset = 0; \ 1268 clazz[i].size = 0; \ 1269 clazz[i].reader = cff_parse_blend; \ 1270 clazz[i].array_max = 0; \ 1271 clazz[i].count_offset = 0; \ 1272 clazz[i].id = id_; \ 1273 i++; 1274 1275 #include "cfftoken.h" 1276 1277 clazz[i].kind = 0; 1278 clazz[i].code = 0; 1279 clazz[i].offset = 0; 1280 clazz[i].size = 0; 1281 clazz[i].reader = 0; 1282 clazz[i].array_max = 0; 1283 clazz[i].count_offset = 0; 1284 clazz[i].id = 0; 1285 1286 1287 #endif /* FT_DEBUG_LEVEL_TRACE */ 1288 1289 1290 *output_class = clazz; 1291 1292 return FT_Err_Ok; 1293 } 1294 1295 1296 #endif /* FT_CONFIG_OPTION_PIC */ 1297 1298 1299 FT_LOCAL_DEF( FT_Error ) 1300 cff_parser_run( CFF_Parser parser, 1301 FT_Byte* start, 1302 FT_Byte* limit ) 1303 { 1304 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 1305 PSAux_Service psaux; 1306 #endif 1307 1308 FT_Byte* p = start; 1309 FT_Error error = FT_Err_Ok; 1310 FT_Library library = parser->library; 1311 1312 FT_UNUSED( library ); 1313 1314 1315 parser->top = parser->stack; 1316 parser->start = start; 1317 parser->limit = limit; 1318 parser->cursor = start; 1319 1320 while ( p < limit ) 1321 { 1322 FT_UInt v = *p; 1323 1324 /* Opcode 31 is legacy MM T2 operator, not a number. */ 1325 /* Opcode 255 is reserved and should not appear in fonts; */ 1326 /* it is used internally for CFF2 blends. */ 1327 if ( v >= 27 && v != 31 && v != 255 ) 1328 { 1329 /* it's a number; we will push its position on the stack */ 1330 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) 1331 goto Stack_Overflow; 1332 1333 *parser->top++ = p; 1334 1335 /* now, skip it */ 1336 if ( v == 30 ) 1337 { 1338 /* skip real number */ 1339 p++; 1340 for (;;) 1341 { 1342 /* An unterminated floating point number at the */ 1343 /* end of a dictionary is invalid but harmless. */ 1344 if ( p >= limit ) 1345 goto Exit; 1346 v = p[0] >> 4; 1347 if ( v == 15 ) 1348 break; 1349 v = p[0] & 0xF; 1350 if ( v == 15 ) 1351 break; 1352 p++; 1353 } 1354 } 1355 else if ( v == 28 ) 1356 p += 2; 1357 else if ( v == 29 ) 1358 p += 4; 1359 else if ( v > 246 ) 1360 p += 1; 1361 } 1362 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE 1363 else if ( v == 31 ) 1364 { 1365 /* a Type 2 charstring */ 1366 1367 CFF_Decoder decoder; 1368 CFF_FontRec cff_rec; 1369 FT_Byte* charstring_base; 1370 FT_ULong charstring_len; 1371 1372 FT_Fixed* stack; 1373 FT_Byte* q; 1374 1375 1376 charstring_base = ++p; 1377 1378 /* search `endchar' operator */ 1379 for (;;) 1380 { 1381 if ( p >= limit ) 1382 goto Exit; 1383 if ( *p == 14 ) 1384 break; 1385 p++; 1386 } 1387 1388 charstring_len = (FT_ULong)( p - charstring_base ) + 1; 1389 1390 /* construct CFF_Decoder object */ 1391 FT_ZERO( &decoder ); 1392 FT_ZERO( &cff_rec ); 1393 1394 cff_rec.top_font.font_dict.num_designs = parser->num_designs; 1395 cff_rec.top_font.font_dict.num_axes = parser->num_axes; 1396 decoder.cff = &cff_rec; 1397 1398 psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); 1399 if ( !psaux ) 1400 { 1401 FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" )); 1402 error = FT_THROW( Missing_Module ); 1403 goto Exit; 1404 } 1405 1406 error = psaux->cff_decoder_funcs->parse_charstrings_old( 1407 &decoder, charstring_base, charstring_len, 1 ); 1408 1409 /* Now copy the stack data in the temporary decoder object, */ 1410 /* converting it back to charstring number representations */ 1411 /* (this is ugly, I know). */ 1412 /* */ 1413 /* We overwrite the original top DICT charstring under the */ 1414 /* assumption that the charstring representation of the result */ 1415 /* of `cff_decoder_parse_charstrings' is shorter, which should */ 1416 /* be always true. */ 1417 1418 q = charstring_base - 1; 1419 stack = decoder.stack; 1420 1421 while ( stack < decoder.top ) 1422 { 1423 FT_ULong num; 1424 FT_Bool neg; 1425 1426 1427 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) 1428 goto Stack_Overflow; 1429 1430 *parser->top++ = q; 1431 1432 if ( *stack < 0 ) 1433 { 1434 num = (FT_ULong)-*stack; 1435 neg = 1; 1436 } 1437 else 1438 { 1439 num = (FT_ULong)*stack; 1440 neg = 0; 1441 } 1442 1443 if ( num & 0xFFFFU ) 1444 { 1445 if ( neg ) 1446 num = (FT_ULong)-num; 1447 1448 *q++ = 255; 1449 *q++ = ( num & 0xFF000000U ) >> 24; 1450 *q++ = ( num & 0x00FF0000U ) >> 16; 1451 *q++ = ( num & 0x0000FF00U ) >> 8; 1452 *q++ = num & 0x000000FFU; 1453 } 1454 else 1455 { 1456 num >>= 16; 1457 1458 if ( neg ) 1459 { 1460 if ( num <= 107 ) 1461 *q++ = (FT_Byte)( 139 - num ); 1462 else if ( num <= 1131 ) 1463 { 1464 *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 ); 1465 *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); 1466 } 1467 else 1468 { 1469 num = (FT_ULong)-num; 1470 1471 *q++ = 28; 1472 *q++ = (FT_Byte)( num >> 8 ); 1473 *q++ = (FT_Byte)( num & 0xFF ); 1474 } 1475 } 1476 else 1477 { 1478 if ( num <= 107 ) 1479 *q++ = (FT_Byte)( num + 139 ); 1480 else if ( num <= 1131 ) 1481 { 1482 *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); 1483 *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); 1484 } 1485 else 1486 { 1487 *q++ = 28; 1488 *q++ = (FT_Byte)( num >> 8 ); 1489 *q++ = (FT_Byte)( num & 0xFF ); 1490 } 1491 } 1492 } 1493 1494 stack++; 1495 } 1496 } 1497 #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ 1498 else 1499 { 1500 /* This is not a number, hence it's an operator. Compute its code */ 1501 /* and look for it in our current list. */ 1502 1503 FT_UInt code; 1504 FT_UInt num_args; 1505 const CFF_Field_Handler* field; 1506 1507 1508 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) 1509 goto Stack_Overflow; 1510 1511 num_args = (FT_UInt)( parser->top - parser->stack ); 1512 *parser->top = p; 1513 code = v; 1514 1515 if ( v == 12 ) 1516 { 1517 /* two byte operator */ 1518 p++; 1519 if ( p >= limit ) 1520 goto Syntax_Error; 1521 1522 code = 0x100 | p[0]; 1523 } 1524 code = code | parser->object_code; 1525 1526 for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ ) 1527 { 1528 if ( field->code == (FT_Int)code ) 1529 { 1530 /* we found our field's handler; read it */ 1531 FT_Long val; 1532 FT_Byte* q = (FT_Byte*)parser->object + field->offset; 1533 1534 1535 #ifdef FT_DEBUG_LEVEL_TRACE 1536 FT_TRACE4(( " %s", field->id )); 1537 #endif 1538 1539 /* check that we have enough arguments -- except for */ 1540 /* delta encoded arrays, which can be empty */ 1541 if ( field->kind != cff_kind_delta && num_args < 1 ) 1542 goto Stack_Underflow; 1543 1544 switch ( field->kind ) 1545 { 1546 case cff_kind_bool: 1547 case cff_kind_string: 1548 case cff_kind_num: 1549 val = cff_parse_num( parser, parser->stack ); 1550 goto Store_Number; 1551 1552 case cff_kind_fixed: 1553 val = cff_parse_fixed( parser, parser->stack ); 1554 goto Store_Number; 1555 1556 case cff_kind_fixed_thousand: 1557 val = cff_parse_fixed_scaled( parser, parser->stack, 3 ); 1558 1559 Store_Number: 1560 switch ( field->size ) 1561 { 1562 case (8 / FT_CHAR_BIT): 1563 *(FT_Byte*)q = (FT_Byte)val; 1564 break; 1565 1566 case (16 / FT_CHAR_BIT): 1567 *(FT_Short*)q = (FT_Short)val; 1568 break; 1569 1570 case (32 / FT_CHAR_BIT): 1571 *(FT_Int32*)q = (FT_Int)val; 1572 break; 1573 1574 default: /* for 64-bit systems */ 1575 *(FT_Long*)q = val; 1576 } 1577 1578 #ifdef FT_DEBUG_LEVEL_TRACE 1579 switch ( field->kind ) 1580 { 1581 case cff_kind_bool: 1582 FT_TRACE4(( " %s\n", val ? "true" : "false" )); 1583 break; 1584 1585 case cff_kind_string: 1586 FT_TRACE4(( " %ld (SID)\n", val )); 1587 break; 1588 1589 case cff_kind_num: 1590 FT_TRACE4(( " %ld\n", val )); 1591 break; 1592 1593 case cff_kind_fixed: 1594 FT_TRACE4(( " %f\n", (double)val / 65536 )); 1595 break; 1596 1597 case cff_kind_fixed_thousand: 1598 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 )); 1599 1600 default: 1601 ; /* never reached */ 1602 } 1603 #endif 1604 1605 break; 1606 1607 case cff_kind_delta: 1608 { 1609 FT_Byte* qcount = (FT_Byte*)parser->object + 1610 field->count_offset; 1611 1612 FT_Byte** data = parser->stack; 1613 1614 1615 if ( num_args > field->array_max ) 1616 num_args = field->array_max; 1617 1618 FT_TRACE4(( " [" )); 1619 1620 /* store count */ 1621 *qcount = (FT_Byte)num_args; 1622 1623 val = 0; 1624 while ( num_args > 0 ) 1625 { 1626 val = ADD_LONG( val, cff_parse_num( parser, data++ ) ); 1627 switch ( field->size ) 1628 { 1629 case (8 / FT_CHAR_BIT): 1630 *(FT_Byte*)q = (FT_Byte)val; 1631 break; 1632 1633 case (16 / FT_CHAR_BIT): 1634 *(FT_Short*)q = (FT_Short)val; 1635 break; 1636 1637 case (32 / FT_CHAR_BIT): 1638 *(FT_Int32*)q = (FT_Int)val; 1639 break; 1640 1641 default: /* for 64-bit systems */ 1642 *(FT_Long*)q = val; 1643 } 1644 1645 FT_TRACE4(( " %ld", val )); 1646 1647 q += field->size; 1648 num_args--; 1649 } 1650 1651 FT_TRACE4(( "]\n" )); 1652 } 1653 break; 1654 1655 default: /* callback or blend */ 1656 error = field->reader( parser ); 1657 if ( error ) 1658 goto Exit; 1659 } 1660 goto Found; 1661 } 1662 } 1663 1664 /* this is an unknown operator, or it is unsupported; */ 1665 /* we will ignore it for now. */ 1666 1667 Found: 1668 /* clear stack */ 1669 /* TODO: could clear blend stack here, */ 1670 /* but we don't have access to subFont */ 1671 if ( field->kind != cff_kind_blend ) 1672 parser->top = parser->stack; 1673 } 1674 p++; 1675 } 1676 1677 Exit: 1678 return error; 1679 1680 Stack_Overflow: 1681 error = FT_THROW( Invalid_Argument ); 1682 goto Exit; 1683 1684 Stack_Underflow: 1685 error = FT_THROW( Invalid_Argument ); 1686 goto Exit; 1687 1688 Syntax_Error: 1689 error = FT_THROW( Invalid_Argument ); 1690 goto Exit; 1691 } 1692 1693 1694 /* END */