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 |