| 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 by */ | 7 /* Copyright 2006-2010, 2012, 2013 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 |
| 18 #include <ft2build.h> | 18 #include <ft2build.h> |
| 19 #include FT_FREETYPE_H | 19 #include FT_FREETYPE_H |
| 20 #include FT_INTERNAL_DEBUG_H |
| 20 #include FT_INTERNAL_POSTSCRIPT_AUX_H | 21 #include FT_INTERNAL_POSTSCRIPT_AUX_H |
| 21 | 22 |
| 22 #include "afmparse.h" | 23 #include "afmparse.h" |
| 23 #include "psconv.h" | 24 #include "psconv.h" |
| 24 | 25 |
| 25 #include "psauxerr.h" | 26 #include "psauxerr.h" |
| 26 | 27 |
| 27 | 28 |
| 28 /***************************************************************************/ | 29 /***************************************************************************/ |
| 29 /* */ | 30 /* */ |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 113 |
| 113 return ch; | 114 return ch; |
| 114 } | 115 } |
| 115 | 116 |
| 116 | 117 |
| 117 /* read a key or value in current column */ | 118 /* read a key or value in current column */ |
| 118 static char* | 119 static char* |
| 119 afm_stream_read_one( AFM_Stream stream ) | 120 afm_stream_read_one( AFM_Stream stream ) |
| 120 { | 121 { |
| 121 char* str; | 122 char* str; |
| 122 int ch; | |
| 123 | 123 |
| 124 | 124 |
| 125 afm_stream_skip_spaces( stream ); | 125 afm_stream_skip_spaces( stream ); |
| 126 if ( AFM_STATUS_EOC( stream ) ) | 126 if ( AFM_STATUS_EOC( stream ) ) |
| 127 return NULL; | 127 return NULL; |
| 128 | 128 |
| 129 str = AFM_STREAM_KEY_BEGIN( stream ); | 129 str = AFM_STREAM_KEY_BEGIN( stream ); |
| 130 | 130 |
| 131 while ( 1 ) | 131 while ( 1 ) |
| 132 { | 132 { |
| 133 ch = AFM_GETC(); | 133 int ch = AFM_GETC(); |
| 134 |
| 135 |
| 134 if ( AFM_IS_SPACE( ch ) ) | 136 if ( AFM_IS_SPACE( ch ) ) |
| 135 break; | 137 break; |
| 136 else if ( AFM_IS_NEWLINE( ch ) ) | 138 else if ( AFM_IS_NEWLINE( ch ) ) |
| 137 { | 139 { |
| 138 stream->status = AFM_STREAM_STATUS_EOL; | 140 stream->status = AFM_STREAM_STATUS_EOL; |
| 139 break; | 141 break; |
| 140 } | 142 } |
| 141 else if ( AFM_IS_SEP( ch ) ) | 143 else if ( AFM_IS_SEP( ch ) ) |
| 142 { | 144 { |
| 143 stream->status = AFM_STREAM_STATUS_EOC; | 145 stream->status = AFM_STREAM_STATUS_EOC; |
| 144 break; | 146 break; |
| 145 } | 147 } |
| 146 else if ( AFM_IS_EOF( ch ) ) | 148 else if ( AFM_IS_EOF( ch ) ) |
| 147 { | 149 { |
| 148 stream->status = AFM_STREAM_STATUS_EOF; | 150 stream->status = AFM_STREAM_STATUS_EOF; |
| 149 break; | 151 break; |
| 150 } | 152 } |
| 151 } | 153 } |
| 152 | 154 |
| 153 return str; | 155 return str; |
| 154 } | 156 } |
| 155 | 157 |
| 156 | 158 |
| 157 /* read a string (i.e., read to EOL) */ | 159 /* read a string (i.e., read to EOL) */ |
| 158 static char* | 160 static char* |
| 159 afm_stream_read_string( AFM_Stream stream ) | 161 afm_stream_read_string( AFM_Stream stream ) |
| 160 { | 162 { |
| 161 char* str; | 163 char* str; |
| 162 int ch; | |
| 163 | 164 |
| 164 | 165 |
| 165 afm_stream_skip_spaces( stream ); | 166 afm_stream_skip_spaces( stream ); |
| 166 if ( AFM_STATUS_EOL( stream ) ) | 167 if ( AFM_STATUS_EOL( stream ) ) |
| 167 return NULL; | 168 return NULL; |
| 168 | 169 |
| 169 str = AFM_STREAM_KEY_BEGIN( stream ); | 170 str = AFM_STREAM_KEY_BEGIN( stream ); |
| 170 | 171 |
| 171 /* scan to eol */ | 172 /* scan to eol */ |
| 172 while ( 1 ) | 173 while ( 1 ) |
| 173 { | 174 { |
| 174 ch = AFM_GETC(); | 175 int ch = AFM_GETC(); |
| 176 |
| 177 |
| 175 if ( AFM_IS_NEWLINE( ch ) ) | 178 if ( AFM_IS_NEWLINE( ch ) ) |
| 176 { | 179 { |
| 177 stream->status = AFM_STREAM_STATUS_EOL; | 180 stream->status = AFM_STREAM_STATUS_EOL; |
| 178 break; | 181 break; |
| 179 } | 182 } |
| 180 else if ( AFM_IS_EOF( ch ) ) | 183 else if ( AFM_IS_EOF( ch ) ) |
| 181 { | 184 { |
| 182 stream->status = AFM_STREAM_STATUS_EOF; | 185 stream->status = AFM_STREAM_STATUS_EOF; |
| 183 break; | 186 break; |
| 184 } | 187 } |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 stream->limit = limit; | 541 stream->limit = limit; |
| 539 | 542 |
| 540 /* don't skip the first line during the first call */ | 543 /* don't skip the first line during the first call */ |
| 541 stream->status = AFM_STREAM_STATUS_EOL; | 544 stream->status = AFM_STREAM_STATUS_EOL; |
| 542 | 545 |
| 543 parser->memory = memory; | 546 parser->memory = memory; |
| 544 parser->stream = stream; | 547 parser->stream = stream; |
| 545 parser->FontInfo = NULL; | 548 parser->FontInfo = NULL; |
| 546 parser->get_index = NULL; | 549 parser->get_index = NULL; |
| 547 | 550 |
| 548 return PSaux_Err_Ok; | 551 return FT_Err_Ok; |
| 549 } | 552 } |
| 550 | 553 |
| 551 | 554 |
| 552 FT_LOCAL( void ) | 555 FT_LOCAL( void ) |
| 553 afm_parser_done( AFM_Parser parser ) | 556 afm_parser_done( AFM_Parser parser ) |
| 554 { | 557 { |
| 555 FT_Memory memory = parser->memory; | 558 FT_Memory memory = parser->memory; |
| 556 | 559 |
| 557 | 560 |
| 558 FT_FREE( parser->stream ); | 561 FT_FREE( parser->stream ); |
| 559 } | 562 } |
| 560 | 563 |
| 561 | 564 |
| 562 FT_LOCAL_DEF( FT_Error ) | 565 FT_LOCAL_DEF( FT_Error ) |
| 563 afm_parser_read_int( AFM_Parser parser, | 566 afm_parser_read_int( AFM_Parser parser, |
| 564 FT_Int* aint ) | 567 FT_Int* aint ) |
| 565 { | 568 { |
| 566 AFM_ValueRec val; | 569 AFM_ValueRec val; |
| 567 | 570 |
| 568 | 571 |
| 569 val.type = AFM_VALUE_TYPE_INTEGER; | 572 val.type = AFM_VALUE_TYPE_INTEGER; |
| 570 | 573 |
| 571 if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) | 574 if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) |
| 572 { | 575 { |
| 573 *aint = val.u.i; | 576 *aint = val.u.i; |
| 574 | 577 |
| 575 return PSaux_Err_Ok; | 578 return FT_Err_Ok; |
| 576 } | 579 } |
| 577 else | 580 else |
| 578 return PSaux_Err_Syntax_Error; | 581 return FT_THROW( Syntax_Error ); |
| 579 } | 582 } |
| 580 | 583 |
| 581 | 584 |
| 582 static FT_Error | 585 static FT_Error |
| 583 afm_parse_track_kern( AFM_Parser parser ) | 586 afm_parse_track_kern( AFM_Parser parser ) |
| 584 { | 587 { |
| 585 AFM_FontInfo fi = parser->FontInfo; | 588 AFM_FontInfo fi = parser->FontInfo; |
| 586 AFM_TrackKern tk; | 589 AFM_TrackKern tk; |
| 587 char* key; | 590 char* key; |
| 588 FT_Offset len; | 591 FT_Offset len; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 tk->min_kern = shared_vals[2].u.f; | 633 tk->min_kern = shared_vals[2].u.f; |
| 631 tk->max_ptsize = shared_vals[3].u.f; | 634 tk->max_ptsize = shared_vals[3].u.f; |
| 632 tk->max_kern = shared_vals[4].u.f; | 635 tk->max_kern = shared_vals[4].u.f; |
| 633 | 636 |
| 634 break; | 637 break; |
| 635 | 638 |
| 636 case AFM_TOKEN_ENDTRACKKERN: | 639 case AFM_TOKEN_ENDTRACKKERN: |
| 637 case AFM_TOKEN_ENDKERNDATA: | 640 case AFM_TOKEN_ENDKERNDATA: |
| 638 case AFM_TOKEN_ENDFONTMETRICS: | 641 case AFM_TOKEN_ENDFONTMETRICS: |
| 639 fi->NumTrackKern = n + 1; | 642 fi->NumTrackKern = n + 1; |
| 640 return PSaux_Err_Ok; | 643 return FT_Err_Ok; |
| 641 | 644 |
| 642 case AFM_TOKEN_UNKNOWN: | 645 case AFM_TOKEN_UNKNOWN: |
| 643 break; | 646 break; |
| 644 | 647 |
| 645 default: | 648 default: |
| 646 goto Fail; | 649 goto Fail; |
| 647 } | 650 } |
| 648 } | 651 } |
| 649 | 652 |
| 650 Fail: | 653 Fail: |
| 651 return PSaux_Err_Syntax_Error; | 654 return FT_THROW( Syntax_Error ); |
| 652 } | 655 } |
| 653 | 656 |
| 654 | 657 |
| 655 #undef KERN_INDEX | 658 #undef KERN_INDEX |
| 656 #define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) | 659 #define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) |
| 657 | 660 |
| 658 | 661 |
| 659 /* compare two kerning pairs */ | 662 /* compare two kerning pairs */ |
| 660 FT_CALLBACK_DEF( int ) | 663 FT_CALLBACK_DEF( int ) |
| 661 afm_compare_kern_pairs( const void* a, | 664 afm_compare_kern_pairs( const void* a, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 } | 749 } |
| 747 break; | 750 break; |
| 748 | 751 |
| 749 case AFM_TOKEN_ENDKERNPAIRS: | 752 case AFM_TOKEN_ENDKERNPAIRS: |
| 750 case AFM_TOKEN_ENDKERNDATA: | 753 case AFM_TOKEN_ENDKERNDATA: |
| 751 case AFM_TOKEN_ENDFONTMETRICS: | 754 case AFM_TOKEN_ENDFONTMETRICS: |
| 752 fi->NumKernPair = n + 1; | 755 fi->NumKernPair = n + 1; |
| 753 ft_qsort( fi->KernPairs, fi->NumKernPair, | 756 ft_qsort( fi->KernPairs, fi->NumKernPair, |
| 754 sizeof ( AFM_KernPairRec ), | 757 sizeof ( AFM_KernPairRec ), |
| 755 afm_compare_kern_pairs ); | 758 afm_compare_kern_pairs ); |
| 756 return PSaux_Err_Ok; | 759 return FT_Err_Ok; |
| 757 | 760 |
| 758 case AFM_TOKEN_UNKNOWN: | 761 case AFM_TOKEN_UNKNOWN: |
| 759 break; | 762 break; |
| 760 | 763 |
| 761 default: | 764 default: |
| 762 goto Fail; | 765 goto Fail; |
| 763 } | 766 } |
| 764 } | 767 } |
| 765 | 768 |
| 766 Fail: | 769 Fail: |
| 767 return PSaux_Err_Syntax_Error; | 770 return FT_THROW( Syntax_Error ); |
| 768 } | 771 } |
| 769 | 772 |
| 770 | 773 |
| 771 static FT_Error | 774 static FT_Error |
| 772 afm_parse_kern_data( AFM_Parser parser ) | 775 afm_parse_kern_data( AFM_Parser parser ) |
| 773 { | 776 { |
| 774 FT_Error error; | 777 FT_Error error; |
| 775 char* key; | 778 char* key; |
| 776 FT_Offset len; | 779 FT_Offset len; |
| 777 | 780 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 788 | 791 |
| 789 case AFM_TOKEN_STARTKERNPAIRS: | 792 case AFM_TOKEN_STARTKERNPAIRS: |
| 790 case AFM_TOKEN_STARTKERNPAIRS0: | 793 case AFM_TOKEN_STARTKERNPAIRS0: |
| 791 error = afm_parse_kern_pairs( parser ); | 794 error = afm_parse_kern_pairs( parser ); |
| 792 if ( error ) | 795 if ( error ) |
| 793 return error; | 796 return error; |
| 794 break; | 797 break; |
| 795 | 798 |
| 796 case AFM_TOKEN_ENDKERNDATA: | 799 case AFM_TOKEN_ENDKERNDATA: |
| 797 case AFM_TOKEN_ENDFONTMETRICS: | 800 case AFM_TOKEN_ENDFONTMETRICS: |
| 798 return PSaux_Err_Ok; | 801 return FT_Err_Ok; |
| 799 | 802 |
| 800 case AFM_TOKEN_UNKNOWN: | 803 case AFM_TOKEN_UNKNOWN: |
| 801 break; | 804 break; |
| 802 | 805 |
| 803 default: | 806 default: |
| 804 goto Fail; | 807 goto Fail; |
| 805 } | 808 } |
| 806 } | 809 } |
| 807 | 810 |
| 808 Fail: | 811 Fail: |
| 809 return PSaux_Err_Syntax_Error; | 812 return FT_THROW( Syntax_Error ); |
| 810 } | 813 } |
| 811 | 814 |
| 812 | 815 |
| 813 static FT_Error | 816 static FT_Error |
| 814 afm_parser_skip_section( AFM_Parser parser, | 817 afm_parser_skip_section( AFM_Parser parser, |
| 815 FT_UInt n, | 818 FT_UInt n, |
| 816 AFM_Token end_section ) | 819 AFM_Token end_section ) |
| 817 { | 820 { |
| 818 char* key; | 821 char* key; |
| 819 FT_Offset len; | 822 FT_Offset len; |
| 820 | 823 |
| 821 | 824 |
| 822 while ( n-- > 0 ) | 825 while ( n-- > 0 ) |
| 823 { | 826 { |
| 824 key = afm_parser_next_key( parser, 1, NULL ); | 827 key = afm_parser_next_key( parser, 1, NULL ); |
| 825 if ( !key ) | 828 if ( !key ) |
| 826 goto Fail; | 829 goto Fail; |
| 827 } | 830 } |
| 828 | 831 |
| 829 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) | 832 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) |
| 830 { | 833 { |
| 831 AFM_Token token = afm_tokenize( key, len ); | 834 AFM_Token token = afm_tokenize( key, len ); |
| 832 | 835 |
| 833 | 836 |
| 834 if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) | 837 if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) |
| 835 return PSaux_Err_Ok; | 838 return FT_Err_Ok; |
| 836 } | 839 } |
| 837 | 840 |
| 838 Fail: | 841 Fail: |
| 839 return PSaux_Err_Syntax_Error; | 842 return FT_THROW( Syntax_Error ); |
| 840 } | 843 } |
| 841 | 844 |
| 842 | 845 |
| 843 FT_LOCAL_DEF( FT_Error ) | 846 FT_LOCAL_DEF( FT_Error ) |
| 844 afm_parser_parse( AFM_Parser parser ) | 847 afm_parser_parse( AFM_Parser parser ) |
| 845 { | 848 { |
| 846 FT_Memory memory = parser->memory; | 849 FT_Memory memory = parser->memory; |
| 847 AFM_FontInfo fi = parser->FontInfo; | 850 AFM_FontInfo fi = parser->FontInfo; |
| 848 FT_Error error = PSaux_Err_Syntax_Error; | 851 FT_Error error = FT_ERR( Syntax_Error ); |
| 849 char* key; | 852 char* key; |
| 850 FT_Offset len; | 853 FT_Offset len; |
| 851 FT_Int metrics_sets = 0; | 854 FT_Int metrics_sets = 0; |
| 852 | 855 |
| 853 | 856 |
| 854 if ( !fi ) | 857 if ( !fi ) |
| 855 return PSaux_Err_Invalid_Argument; | 858 return FT_THROW( Invalid_Argument ); |
| 856 | 859 |
| 857 key = afm_parser_next_key( parser, 1, &len ); | 860 key = afm_parser_next_key( parser, 1, &len ); |
| 858 if ( !key || len != 16 || | 861 if ( !key || len != 16 || |
| 859 ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) | 862 ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) |
| 860 return PSaux_Err_Unknown_File_Format; | 863 return FT_THROW( Unknown_File_Format ); |
| 861 | 864 |
| 862 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) | 865 while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) |
| 863 { | 866 { |
| 864 AFM_ValueRec shared_vals[4]; | 867 AFM_ValueRec shared_vals[4]; |
| 865 | 868 |
| 866 | 869 |
| 867 switch ( afm_tokenize( key, len ) ) | 870 switch ( afm_tokenize( key, len ) ) |
| 868 { | 871 { |
| 869 case AFM_TOKEN_METRICSSETS: | 872 case AFM_TOKEN_METRICSSETS: |
| 870 if ( afm_parser_read_int( parser, &metrics_sets ) ) | 873 if ( afm_parser_read_int( parser, &metrics_sets ) ) |
| 871 goto Fail; | 874 goto Fail; |
| 872 | 875 |
| 873 if ( metrics_sets != 0 && metrics_sets != 2 ) | 876 if ( metrics_sets != 0 && metrics_sets != 2 ) |
| 874 { | 877 { |
| 875 error = PSaux_Err_Unimplemented_Feature; | 878 error = FT_THROW( Unimplemented_Feature ); |
| 876 | 879 |
| 877 goto Fail; | 880 goto Fail; |
| 878 } | 881 } |
| 879 break; | 882 break; |
| 880 | 883 |
| 881 case AFM_TOKEN_ISCIDFONT: | 884 case AFM_TOKEN_ISCIDFONT: |
| 882 shared_vals[0].type = AFM_VALUE_TYPE_BOOL; | 885 shared_vals[0].type = AFM_VALUE_TYPE_BOOL; |
| 883 if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) | 886 if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) |
| 884 goto Fail; | 887 goto Fail; |
| 885 | 888 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 931 } | 934 } |
| 932 break; | 935 break; |
| 933 | 936 |
| 934 case AFM_TOKEN_STARTKERNDATA: | 937 case AFM_TOKEN_STARTKERNDATA: |
| 935 error = afm_parse_kern_data( parser ); | 938 error = afm_parse_kern_data( parser ); |
| 936 if ( error ) | 939 if ( error ) |
| 937 goto Fail; | 940 goto Fail; |
| 938 /* fall through since we only support kern data */ | 941 /* fall through since we only support kern data */ |
| 939 | 942 |
| 940 case AFM_TOKEN_ENDFONTMETRICS: | 943 case AFM_TOKEN_ENDFONTMETRICS: |
| 941 return PSaux_Err_Ok; | 944 return FT_Err_Ok; |
| 942 | 945 |
| 943 default: | 946 default: |
| 944 break; | 947 break; |
| 945 } | 948 } |
| 946 } | 949 } |
| 947 | 950 |
| 948 Fail: | 951 Fail: |
| 949 FT_FREE( fi->TrackKerns ); | 952 FT_FREE( fi->TrackKerns ); |
| 950 fi->NumTrackKern = 0; | 953 fi->NumTrackKern = 0; |
| 951 | 954 |
| 952 FT_FREE( fi->KernPairs ); | 955 FT_FREE( fi->KernPairs ); |
| 953 fi->NumKernPair = 0; | 956 fi->NumKernPair = 0; |
| 954 | 957 |
| 955 fi->IsCIDFont = 0; | 958 fi->IsCIDFont = 0; |
| 956 | 959 |
| 957 return error; | 960 return error; |
| 958 } | 961 } |
| 959 | 962 |
| 960 | 963 |
| 961 /* END */ | 964 /* END */ |
| OLD | NEW |