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 |