| OLD | NEW |
| 1 /***************************************************************************/ | 1 /***************************************************************************/ |
| 2 /* */ | 2 /* */ |
| 3 /* afmparse.c */ | 3 /* afmparse.c */ |
| 4 /* */ | 4 /* */ |
| 5 /* AFM parser (body). */ | 5 /* AFM parser (body). */ |
| 6 /* */ | 6 /* */ |
| 7 /* Copyright 2006-2010, 2012, 2013 by */ | 7 /* Copyright 2006-2015 by */ |
| 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
| 9 /* */ | 9 /* */ |
| 10 /* This file is part of the FreeType project, and may only be used, */ | 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 */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
| 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
| 13 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
| 14 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
| 15 /* */ | 15 /* */ |
| 16 /***************************************************************************/ | 16 /***************************************************************************/ |
| 17 | 17 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 /* column separator; there is no `column' in the spec actually */ | 68 /* column separator; there is no `column' in the spec actually */ |
| 69 #define AFM_IS_SEP( ch ) ( (ch) == ';' ) | 69 #define AFM_IS_SEP( ch ) ( (ch) == ';' ) |
| 70 | 70 |
| 71 #define AFM_GETC() \ | 71 #define AFM_GETC() \ |
| 72 ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ | 72 ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ |
| 73 : EOF ) | 73 : EOF ) |
| 74 | 74 |
| 75 #define AFM_STREAM_KEY_BEGIN( stream ) \ | 75 #define AFM_STREAM_KEY_BEGIN( stream ) \ |
| 76 (char*)( (stream)->cursor - 1 ) | 76 (char*)( (stream)->cursor - 1 ) |
| 77 | 77 |
| 78 #define AFM_STREAM_KEY_LEN( stream, key ) \ | 78 #define AFM_STREAM_KEY_LEN( stream, key ) \ |
| 79 ( (char*)(stream)->cursor - key - 1 ) | 79 (FT_Offset)( (char*)(stream)->cursor - key - 1 ) |
| 80 | 80 |
| 81 #define AFM_STATUS_EOC( stream ) \ | 81 #define AFM_STATUS_EOC( stream ) \ |
| 82 ( (stream)->status >= AFM_STREAM_STATUS_EOC ) | 82 ( (stream)->status >= AFM_STREAM_STATUS_EOC ) |
| 83 | 83 |
| 84 #define AFM_STATUS_EOL( stream ) \ | 84 #define AFM_STATUS_EOL( stream ) \ |
| 85 ( (stream)->status >= AFM_STREAM_STATUS_EOL ) | 85 ( (stream)->status >= AFM_STREAM_STATUS_EOL ) |
| 86 | 86 |
| 87 #define AFM_STATUS_EOF( stream ) \ | 87 #define AFM_STATUS_EOF( stream ) \ |
| 88 ( (stream)->status >= AFM_STREAM_STATUS_EOF ) | 88 ( (stream)->status >= AFM_STREAM_STATUS_EOF ) |
| 89 | 89 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 /* | 362 /* |
| 363 * `afm_parser_read_vals' and `afm_parser_next_key' provide | 363 * `afm_parser_read_vals' and `afm_parser_next_key' provide |
| 364 * high-level operations to an AFM_Stream. The rest of the | 364 * high-level operations to an AFM_Stream. The rest of the |
| 365 * parser functions should use them without accessing the | 365 * parser functions should use them without accessing the |
| 366 * AFM_Stream directly. | 366 * AFM_Stream directly. |
| 367 */ | 367 */ |
| 368 | 368 |
| 369 FT_LOCAL_DEF( FT_Int ) | 369 FT_LOCAL_DEF( FT_Int ) |
| 370 afm_parser_read_vals( AFM_Parser parser, | 370 afm_parser_read_vals( AFM_Parser parser, |
| 371 AFM_Value vals, | 371 AFM_Value vals, |
| 372 FT_UInt n ) | 372 FT_Int n ) |
| 373 { | 373 { |
| 374 AFM_Stream stream = parser->stream; | 374 AFM_Stream stream = parser->stream; |
| 375 char* str; | 375 char* str; |
| 376 FT_UInt i; | 376 FT_Int i; |
| 377 | 377 |
| 378 | 378 |
| 379 if ( n > AFM_MAX_ARGUMENTS ) | 379 if ( n > AFM_MAX_ARGUMENTS ) |
| 380 return 0; | 380 return 0; |
| 381 | 381 |
| 382 for ( i = 0; i < n; i++ ) | 382 for ( i = 0; i < n; i++ ) |
| 383 { | 383 { |
| 384 FT_Offset len; | 384 FT_Offset len; |
| 385 AFM_Value val = vals + i; | 385 AFM_Value val = vals + i; |
| 386 | 386 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 return i; | 439 return i; |
| 440 } | 440 } |
| 441 | 441 |
| 442 | 442 |
| 443 FT_LOCAL_DEF( char* ) | 443 FT_LOCAL_DEF( char* ) |
| 444 afm_parser_next_key( AFM_Parser parser, | 444 afm_parser_next_key( AFM_Parser parser, |
| 445 FT_Bool line, | 445 FT_Bool line, |
| 446 FT_Offset* len ) | 446 FT_Offset* len ) |
| 447 { | 447 { |
| 448 AFM_Stream stream = parser->stream; | 448 AFM_Stream stream = parser->stream; |
| 449 char* key = 0; /* make stupid compiler happy */ | 449 char* key = NULL; /* make stupid compiler happy */ |
| 450 | 450 |
| 451 | 451 |
| 452 if ( line ) | 452 if ( line ) |
| 453 { | 453 { |
| 454 while ( 1 ) | 454 while ( 1 ) |
| 455 { | 455 { |
| 456 /* skip current line */ | 456 /* skip current line */ |
| 457 if ( !AFM_STATUS_EOL( stream ) ) | 457 if ( !AFM_STATUS_EOL( stream ) ) |
| 458 afm_stream_read_string( stream ); | 458 afm_stream_read_string( stream ); |
| 459 | 459 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 FT_LOCAL( void ) | 555 FT_LOCAL( void ) |
| 556 afm_parser_done( AFM_Parser parser ) | 556 afm_parser_done( AFM_Parser parser ) |
| 557 { | 557 { |
| 558 FT_Memory memory = parser->memory; | 558 FT_Memory memory = parser->memory; |
| 559 | 559 |
| 560 | 560 |
| 561 FT_FREE( parser->stream ); | 561 FT_FREE( parser->stream ); |
| 562 } | 562 } |
| 563 | 563 |
| 564 | 564 |
| 565 FT_LOCAL_DEF( FT_Error ) | 565 static FT_Error |
| 566 afm_parser_read_int( AFM_Parser parser, | 566 afm_parser_read_int( AFM_Parser parser, |
| 567 FT_Int* aint ) | 567 FT_Int* aint ) |
| 568 { | 568 { |
| 569 AFM_ValueRec val; | 569 AFM_ValueRec val; |
| 570 | 570 |
| 571 | 571 |
| 572 val.type = AFM_VALUE_TYPE_INTEGER; | 572 val.type = AFM_VALUE_TYPE_INTEGER; |
| 573 | 573 |
| 574 if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) | 574 if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) |
| 575 { | 575 { |
| 576 *aint = val.u.i; | 576 *aint = val.u.i; |
| 577 | 577 |
| 578 return FT_Err_Ok; | 578 return FT_Err_Ok; |
| 579 } | 579 } |
| 580 else | 580 else |
| 581 return FT_THROW( Syntax_Error ); | 581 return FT_THROW( Syntax_Error ); |
| 582 } | 582 } |
| 583 | 583 |
| 584 | 584 |
| 585 static FT_Error | 585 static FT_Error |
| 586 afm_parse_track_kern( AFM_Parser parser ) | 586 afm_parse_track_kern( AFM_Parser parser ) |
| 587 { | 587 { |
| 588 AFM_FontInfo fi = parser->FontInfo; | 588 AFM_FontInfo fi = parser->FontInfo; |
| 589 AFM_TrackKern tk; | 589 AFM_TrackKern tk; |
| 590 char* key; | 590 char* key; |
| 591 FT_Offset len; | 591 FT_Offset len; |
| 592 int n = -1; | 592 int n = -1; |
| 593 FT_Int tmp; |
| 593 | 594 |
| 594 | 595 |
| 595 if ( afm_parser_read_int( parser, &fi->NumTrackKern ) ) | 596 if ( afm_parser_read_int( parser, &tmp ) ) |
| 596 goto Fail; | 597 goto Fail; |
| 597 | 598 |
| 599 if ( tmp < 0 ) |
| 600 goto Fail; |
| 601 |
| 602 fi->NumTrackKern = (FT_UInt)tmp; |
| 603 |
| 598 if ( fi->NumTrackKern ) | 604 if ( fi->NumTrackKern ) |
| 599 { | 605 { |
| 600 FT_Memory memory = parser->memory; | 606 FT_Memory memory = parser->memory; |
| 601 FT_Error error; | 607 FT_Error error; |
| 602 | 608 |
| 603 | 609 |
| 604 if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) | 610 if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) |
| 605 return error; | 611 return error; |
| 606 } | 612 } |
| 607 | 613 |
| 608 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) | 614 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) |
| 609 { | 615 { |
| 610 AFM_ValueRec shared_vals[5]; | 616 AFM_ValueRec shared_vals[5]; |
| 611 | 617 |
| 612 | 618 |
| 613 switch ( afm_tokenize( key, len ) ) | 619 switch ( afm_tokenize( key, len ) ) |
| 614 { | 620 { |
| 615 case AFM_TOKEN_TRACKKERN: | 621 case AFM_TOKEN_TRACKKERN: |
| 616 n++; | 622 n++; |
| 617 | 623 |
| 618 if ( n >= fi->NumTrackKern ) | 624 if ( n >= (int)fi->NumTrackKern ) |
| 619 goto Fail; | 625 goto Fail; |
| 620 | 626 |
| 621 tk = fi->TrackKerns + n; | 627 tk = fi->TrackKerns + n; |
| 622 | 628 |
| 623 shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; | 629 shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; |
| 624 shared_vals[1].type = AFM_VALUE_TYPE_FIXED; | 630 shared_vals[1].type = AFM_VALUE_TYPE_FIXED; |
| 625 shared_vals[2].type = AFM_VALUE_TYPE_FIXED; | 631 shared_vals[2].type = AFM_VALUE_TYPE_FIXED; |
| 626 shared_vals[3].type = AFM_VALUE_TYPE_FIXED; | 632 shared_vals[3].type = AFM_VALUE_TYPE_FIXED; |
| 627 shared_vals[4].type = AFM_VALUE_TYPE_FIXED; | 633 shared_vals[4].type = AFM_VALUE_TYPE_FIXED; |
| 628 if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) | 634 if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) |
| 629 goto Fail; | 635 goto Fail; |
| 630 | 636 |
| 631 tk->degree = shared_vals[0].u.i; | 637 tk->degree = shared_vals[0].u.i; |
| 632 tk->min_ptsize = shared_vals[1].u.f; | 638 tk->min_ptsize = shared_vals[1].u.f; |
| 633 tk->min_kern = shared_vals[2].u.f; | 639 tk->min_kern = shared_vals[2].u.f; |
| 634 tk->max_ptsize = shared_vals[3].u.f; | 640 tk->max_ptsize = shared_vals[3].u.f; |
| 635 tk->max_kern = shared_vals[4].u.f; | 641 tk->max_kern = shared_vals[4].u.f; |
| 636 | 642 |
| 637 break; | 643 break; |
| 638 | 644 |
| 639 case AFM_TOKEN_ENDTRACKKERN: | 645 case AFM_TOKEN_ENDTRACKKERN: |
| 640 case AFM_TOKEN_ENDKERNDATA: | 646 case AFM_TOKEN_ENDKERNDATA: |
| 641 case AFM_TOKEN_ENDFONTMETRICS: | 647 case AFM_TOKEN_ENDFONTMETRICS: |
| 642 fi->NumTrackKern = n + 1; | 648 fi->NumTrackKern = (FT_UInt)( n + 1 ); |
| 643 return FT_Err_Ok; | 649 return FT_Err_Ok; |
| 644 | 650 |
| 645 case AFM_TOKEN_UNKNOWN: | 651 case AFM_TOKEN_UNKNOWN: |
| 646 break; | 652 break; |
| 647 | 653 |
| 648 default: | 654 default: |
| 649 goto Fail; | 655 goto Fail; |
| 650 } | 656 } |
| 651 } | 657 } |
| 652 | 658 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 681 | 687 |
| 682 | 688 |
| 683 static FT_Error | 689 static FT_Error |
| 684 afm_parse_kern_pairs( AFM_Parser parser ) | 690 afm_parse_kern_pairs( AFM_Parser parser ) |
| 685 { | 691 { |
| 686 AFM_FontInfo fi = parser->FontInfo; | 692 AFM_FontInfo fi = parser->FontInfo; |
| 687 AFM_KernPair kp; | 693 AFM_KernPair kp; |
| 688 char* key; | 694 char* key; |
| 689 FT_Offset len; | 695 FT_Offset len; |
| 690 int n = -1; | 696 int n = -1; |
| 697 FT_Int tmp; |
| 691 | 698 |
| 692 | 699 |
| 693 if ( afm_parser_read_int( parser, &fi->NumKernPair ) ) | 700 if ( afm_parser_read_int( parser, &tmp ) ) |
| 694 goto Fail; | 701 goto Fail; |
| 695 | 702 |
| 703 if ( tmp < 0 ) |
| 704 goto Fail; |
| 705 |
| 706 fi->NumKernPair = (FT_UInt)tmp; |
| 707 |
| 696 if ( fi->NumKernPair ) | 708 if ( fi->NumKernPair ) |
| 697 { | 709 { |
| 698 FT_Memory memory = parser->memory; | 710 FT_Memory memory = parser->memory; |
| 699 FT_Error error; | 711 FT_Error error; |
| 700 | 712 |
| 701 | 713 |
| 702 if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) | 714 if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) |
| 703 return error; | 715 return error; |
| 704 } | 716 } |
| 705 | 717 |
| 706 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) | 718 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) |
| 707 { | 719 { |
| 708 AFM_Token token = afm_tokenize( key, len ); | 720 AFM_Token token = afm_tokenize( key, len ); |
| 709 | 721 |
| 710 | 722 |
| 711 switch ( token ) | 723 switch ( token ) |
| 712 { | 724 { |
| 713 case AFM_TOKEN_KP: | 725 case AFM_TOKEN_KP: |
| 714 case AFM_TOKEN_KPX: | 726 case AFM_TOKEN_KPX: |
| 715 case AFM_TOKEN_KPY: | 727 case AFM_TOKEN_KPY: |
| 716 { | 728 { |
| 717 FT_Int r; | 729 FT_Int r; |
| 718 AFM_ValueRec shared_vals[4]; | 730 AFM_ValueRec shared_vals[4]; |
| 719 | 731 |
| 720 | 732 |
| 721 n++; | 733 n++; |
| 722 | 734 |
| 723 if ( n >= fi->NumKernPair ) | 735 if ( n >= (int)fi->NumKernPair ) |
| 724 goto Fail; | 736 goto Fail; |
| 725 | 737 |
| 726 kp = fi->KernPairs + n; | 738 kp = fi->KernPairs + n; |
| 727 | 739 |
| 728 shared_vals[0].type = AFM_VALUE_TYPE_INDEX; | 740 shared_vals[0].type = AFM_VALUE_TYPE_INDEX; |
| 729 shared_vals[1].type = AFM_VALUE_TYPE_INDEX; | 741 shared_vals[1].type = AFM_VALUE_TYPE_INDEX; |
| 730 shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; | 742 shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; |
| 731 shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; | 743 shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; |
| 732 r = afm_parser_read_vals( parser, shared_vals, 4 ); | 744 r = afm_parser_read_vals( parser, shared_vals, 4 ); |
| 733 if ( r < 3 ) | 745 if ( r < 3 ) |
| 734 goto Fail; | 746 goto Fail; |
| 735 | 747 |
| 736 kp->index1 = shared_vals[0].u.i; | 748 /* index values can't be negative */ |
| 737 kp->index2 = shared_vals[1].u.i; | 749 kp->index1 = shared_vals[0].u.u; |
| 750 kp->index2 = shared_vals[1].u.u; |
| 738 if ( token == AFM_TOKEN_KPY ) | 751 if ( token == AFM_TOKEN_KPY ) |
| 739 { | 752 { |
| 740 kp->x = 0; | 753 kp->x = 0; |
| 741 kp->y = shared_vals[2].u.i; | 754 kp->y = shared_vals[2].u.i; |
| 742 } | 755 } |
| 743 else | 756 else |
| 744 { | 757 { |
| 745 kp->x = shared_vals[2].u.i; | 758 kp->x = shared_vals[2].u.i; |
| 746 kp->y = ( token == AFM_TOKEN_KP && r == 4 ) | 759 kp->y = ( token == AFM_TOKEN_KP && r == 4 ) |
| 747 ? shared_vals[3].u.i : 0; | 760 ? shared_vals[3].u.i : 0; |
| 748 } | 761 } |
| 749 } | 762 } |
| 750 break; | 763 break; |
| 751 | 764 |
| 752 case AFM_TOKEN_ENDKERNPAIRS: | 765 case AFM_TOKEN_ENDKERNPAIRS: |
| 753 case AFM_TOKEN_ENDKERNDATA: | 766 case AFM_TOKEN_ENDKERNDATA: |
| 754 case AFM_TOKEN_ENDFONTMETRICS: | 767 case AFM_TOKEN_ENDFONTMETRICS: |
| 755 fi->NumKernPair = n + 1; | 768 fi->NumKernPair = (FT_UInt)( n + 1 ); |
| 756 ft_qsort( fi->KernPairs, fi->NumKernPair, | 769 ft_qsort( fi->KernPairs, fi->NumKernPair, |
| 757 sizeof ( AFM_KernPairRec ), | 770 sizeof ( AFM_KernPairRec ), |
| 758 afm_compare_kern_pairs ); | 771 afm_compare_kern_pairs ); |
| 759 return FT_Err_Ok; | 772 return FT_Err_Ok; |
| 760 | 773 |
| 761 case AFM_TOKEN_UNKNOWN: | 774 case AFM_TOKEN_UNKNOWN: |
| 762 break; | 775 break; |
| 763 | 776 |
| 764 default: | 777 default: |
| 765 goto Fail; | 778 goto Fail; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 } | 821 } |
| 809 } | 822 } |
| 810 | 823 |
| 811 Fail: | 824 Fail: |
| 812 return FT_THROW( Syntax_Error ); | 825 return FT_THROW( Syntax_Error ); |
| 813 } | 826 } |
| 814 | 827 |
| 815 | 828 |
| 816 static FT_Error | 829 static FT_Error |
| 817 afm_parser_skip_section( AFM_Parser parser, | 830 afm_parser_skip_section( AFM_Parser parser, |
| 818 FT_UInt n, | 831 FT_Int n, |
| 819 AFM_Token end_section ) | 832 AFM_Token end_section ) |
| 820 { | 833 { |
| 821 char* key; | 834 char* key; |
| 822 FT_Offset len; | 835 FT_Offset len; |
| 823 | 836 |
| 824 | 837 |
| 825 while ( n-- > 0 ) | 838 while ( n-- > 0 ) |
| 826 { | 839 { |
| 827 key = afm_parser_next_key( parser, 1, NULL ); | 840 key = afm_parser_next_key( parser, 1, NULL ); |
| 828 if ( !key ) | 841 if ( !key ) |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 FT_FREE( fi->KernPairs ); | 968 FT_FREE( fi->KernPairs ); |
| 956 fi->NumKernPair = 0; | 969 fi->NumKernPair = 0; |
| 957 | 970 |
| 958 fi->IsCIDFont = 0; | 971 fi->IsCIDFont = 0; |
| 959 | 972 |
| 960 return error; | 973 return error; |
| 961 } | 974 } |
| 962 | 975 |
| 963 | 976 |
| 964 /* END */ | 977 /* END */ |
| OLD | NEW |