Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1312)

Side by Side Diff: src/cff/cffload.c

Issue 89753003: Update freetype to latest version of ASOP. (Closed) Base URL: https://chromium.googlesource.com/chromium/src/third_party/freetype.git@master
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/cff/cffgload.c ('k') | src/cff/cffobjs.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /***************************************************************************/ 1 /***************************************************************************/
2 /* */ 2 /* */
3 /* cffload.c */ 3 /* cffload.c */
4 /* */ 4 /* */
5 /* OpenType and CFF data/program tables loader (body). */ 5 /* OpenType and CFF data/program tables loader (body). */
6 /* */ 6 /* */
7 /* Copyright 1996-2011 by */ 7 /* Copyright 1996-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
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 FT_ULong size; 243 FT_ULong size;
244 244
245 245
246 /* there is at least one element; read the offset size, */ 246 /* there is at least one element; read the offset size, */
247 /* then access the offset table to compute the index's total size */ 247 /* then access the offset table to compute the index's total size */
248 if ( FT_READ_BYTE( offsize ) ) 248 if ( FT_READ_BYTE( offsize ) )
249 goto Exit; 249 goto Exit;
250 250
251 if ( offsize < 1 || offsize > 4 ) 251 if ( offsize < 1 || offsize > 4 )
252 { 252 {
253 error = CFF_Err_Invalid_Table; 253 error = FT_THROW( Invalid_Table );
254 goto Exit; 254 goto Exit;
255 } 255 }
256 256
257 idx->count = count; 257 idx->count = count;
258 idx->off_size = offsize; 258 idx->off_size = offsize;
259 size = (FT_ULong)( count + 1 ) * offsize; 259 size = (FT_ULong)( count + 1 ) * offsize;
260 260
261 idx->data_offset = idx->start + 3 + size; 261 idx->data_offset = idx->start + 3 + size;
262 262
263 if ( FT_STREAM_SKIP( size - offsize ) ) 263 if ( FT_STREAM_SKIP( size - offsize ) )
264 goto Exit; 264 goto Exit;
265 265
266 size = cff_index_read_offset( idx, &error ); 266 size = cff_index_read_offset( idx, &error );
267 if ( error ) 267 if ( error )
268 goto Exit; 268 goto Exit;
269 269
270 if ( size == 0 ) 270 if ( size == 0 )
271 { 271 {
272 error = CFF_Err_Invalid_Table; 272 error = FT_THROW( Invalid_Table );
273 goto Exit; 273 goto Exit;
274 } 274 }
275 275
276 idx->data_size = --size; 276 idx->data_size = --size;
277 277
278 if ( load ) 278 if ( load )
279 { 279 {
280 /* load the data */ 280 /* load the data */
281 if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) 281 if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
282 goto Exit; 282 goto Exit;
(...skipping 28 matching lines...) Expand all
311 311
312 FT_FREE( idx->offsets ); 312 FT_FREE( idx->offsets );
313 FT_MEM_ZERO( idx, sizeof ( *idx ) ); 313 FT_MEM_ZERO( idx, sizeof ( *idx ) );
314 } 314 }
315 } 315 }
316 316
317 317
318 static FT_Error 318 static FT_Error
319 cff_index_load_offsets( CFF_Index idx ) 319 cff_index_load_offsets( CFF_Index idx )
320 { 320 {
321 FT_Error error = CFF_Err_Ok; 321 FT_Error error = FT_Err_Ok;
322 FT_Stream stream = idx->stream; 322 FT_Stream stream = idx->stream;
323 FT_Memory memory = stream->memory; 323 FT_Memory memory = stream->memory;
324 324
325 325
326 if ( idx->count > 0 && idx->offsets == NULL ) 326 if ( idx->count > 0 && idx->offsets == NULL )
327 { 327 {
328 FT_Byte offsize = idx->off_size; 328 FT_Byte offsize = idx->off_size;
329 FT_ULong data_size; 329 FT_ULong data_size;
330 FT_Byte* p; 330 FT_Byte* p;
331 FT_Byte* p_end; 331 FT_Byte* p_end;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 377
378 378
379 /* Allocate a table containing pointers to an index's elements. */ 379 /* Allocate a table containing pointers to an index's elements. */
380 /* The `pool' argument makes this function convert the index */ 380 /* The `pool' argument makes this function convert the index */
381 /* entries to C-style strings (this is, NULL-terminated). */ 381 /* entries to C-style strings (this is, NULL-terminated). */
382 static FT_Error 382 static FT_Error
383 cff_index_get_pointers( CFF_Index idx, 383 cff_index_get_pointers( CFF_Index idx,
384 FT_Byte*** table, 384 FT_Byte*** table,
385 FT_Byte** pool ) 385 FT_Byte** pool )
386 { 386 {
387 FT_Error error = CFF_Err_Ok; 387 FT_Error error = FT_Err_Ok;
388 FT_Memory memory = idx->stream->memory; 388 FT_Memory memory = idx->stream->memory;
389 FT_Byte** t = NULL; 389
390 FT_Byte** t = NULL;
390 FT_Byte* new_bytes = NULL; 391 FT_Byte* new_bytes = NULL;
391 392
392 393
393 *table = NULL; 394 *table = NULL;
394 395
395 if ( idx->offsets == NULL ) 396 if ( idx->offsets == NULL )
396 { 397 {
397 error = cff_index_load_offsets( idx ); 398 error = cff_index_load_offsets( idx );
398 if ( error ) 399 if ( error )
399 goto Exit; 400 goto Exit;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 return error; 465 return error;
465 } 466 }
466 467
467 468
468 FT_LOCAL_DEF( FT_Error ) 469 FT_LOCAL_DEF( FT_Error )
469 cff_index_access_element( CFF_Index idx, 470 cff_index_access_element( CFF_Index idx,
470 FT_UInt element, 471 FT_UInt element,
471 FT_Byte** pbytes, 472 FT_Byte** pbytes,
472 FT_ULong* pbyte_len ) 473 FT_ULong* pbyte_len )
473 { 474 {
474 FT_Error error = CFF_Err_Ok; 475 FT_Error error = FT_Err_Ok;
475 476
476 477
477 if ( idx && idx->count > element ) 478 if ( idx && idx->count > element )
478 { 479 {
479 /* compute start and end offsets */ 480 /* compute start and end offsets */
480 FT_Stream stream = idx->stream; 481 FT_Stream stream = idx->stream;
481 FT_ULong off1, off2 = 0; 482 FT_ULong off1, off2 = 0;
482 483
483 484
484 /* load offsets from file or the offset table */ 485 /* load offsets from file or the offset table */
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 } 550 }
550 } 551 }
551 else 552 else
552 { 553 {
553 /* empty index element */ 554 /* empty index element */
554 *pbytes = 0; 555 *pbytes = 0;
555 *pbyte_len = 0; 556 *pbyte_len = 0;
556 } 557 }
557 } 558 }
558 else 559 else
559 error = CFF_Err_Invalid_Argument; 560 error = FT_THROW( Invalid_Argument );
560 561
561 Exit: 562 Exit:
562 return error; 563 return error;
563 } 564 }
564 565
565 566
566 FT_LOCAL_DEF( void ) 567 FT_LOCAL_DEF( void )
567 cff_index_forget_element( CFF_Index idx, 568 cff_index_forget_element( CFF_Index idx,
568 FT_Byte** pbytes ) 569 FT_Byte** pbytes )
569 { 570 {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 goto Exit; 690 goto Exit;
690 691
691 fdselect->data_size = num_ranges * 3 + 2; 692 fdselect->data_size = num_ranges * 3 + 2;
692 693
693 Load_Data: 694 Load_Data:
694 if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) 695 if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
695 goto Exit; 696 goto Exit;
696 break; 697 break;
697 698
698 default: /* hmm... that's wrong */ 699 default: /* hmm... that's wrong */
699 error = CFF_Err_Invalid_File_Format; 700 error = FT_THROW( Invalid_File_Format );
700 } 701 }
701 702
702 Exit: 703 Exit:
703 return error; 704 return error;
704 } 705 }
705 706
706 707
707 FT_LOCAL_DEF( FT_Byte ) 708 FT_LOCAL_DEF( FT_Byte )
708 cff_fd_select_get( CFF_FDSelect fdselect, 709 cff_fd_select_get( CFF_FDSelect fdselect,
709 FT_UInt glyph_index ) 710 FT_UInt glyph_index )
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 /*** CFF font support ***/ 774 /*** CFF font support ***/
774 /*** ***/ 775 /*** ***/
775 /*************************************************************************/ 776 /*************************************************************************/
776 /*************************************************************************/ 777 /*************************************************************************/
777 778
778 static FT_Error 779 static FT_Error
779 cff_charset_compute_cids( CFF_Charset charset, 780 cff_charset_compute_cids( CFF_Charset charset,
780 FT_UInt num_glyphs, 781 FT_UInt num_glyphs,
781 FT_Memory memory ) 782 FT_Memory memory )
782 { 783 {
783 FT_Error error = CFF_Err_Ok; 784 FT_Error error = FT_Err_Ok;
784 FT_UInt i; 785 FT_UInt i;
785 FT_Long j; 786 FT_Long j;
786 FT_UShort max_cid = 0; 787 FT_UShort max_cid = 0;
787 788
788 789
789 if ( charset->max_cid > 0 ) 790 if ( charset->max_cid > 0 )
790 goto Exit; 791 goto Exit;
791 792
792 for ( i = 0; i < num_glyphs; i++ ) 793 for ( i = 0; i < num_glyphs; i++ )
793 { 794 {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 853
853 static FT_Error 854 static FT_Error
854 cff_charset_load( CFF_Charset charset, 855 cff_charset_load( CFF_Charset charset,
855 FT_UInt num_glyphs, 856 FT_UInt num_glyphs,
856 FT_Stream stream, 857 FT_Stream stream,
857 FT_ULong base_offset, 858 FT_ULong base_offset,
858 FT_ULong offset, 859 FT_ULong offset,
859 FT_Bool invert ) 860 FT_Bool invert )
860 { 861 {
861 FT_Memory memory = stream->memory; 862 FT_Memory memory = stream->memory;
862 FT_Error error = CFF_Err_Ok; 863 FT_Error error = FT_Err_Ok;
863 FT_UShort glyph_sid; 864 FT_UShort glyph_sid;
864 865
865 866
866 /* If the the offset is greater than 2, we have to parse the */ 867 /* If the the offset is greater than 2, we have to parse the */
867 /* charset table. */ 868 /* charset table. */
868 if ( offset > 2 ) 869 if ( offset > 2 )
869 { 870 {
870 FT_UInt j; 871 FT_UInt j;
871 872
872 873
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 937
937 /* Fill in the range of sids -- `nleft + 1' glyphs. */ 938 /* Fill in the range of sids -- `nleft + 1' glyphs. */
938 for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) 939 for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
939 charset->sids[j] = glyph_sid; 940 charset->sids[j] = glyph_sid;
940 } 941 }
941 } 942 }
942 break; 943 break;
943 944
944 default: 945 default:
945 FT_ERROR(( "cff_charset_load: invalid table format\n" )); 946 FT_ERROR(( "cff_charset_load: invalid table format\n" ));
946 error = CFF_Err_Invalid_File_Format; 947 error = FT_THROW( Invalid_File_Format );
947 goto Exit; 948 goto Exit;
948 } 949 }
949 } 950 }
950 else 951 else
951 { 952 {
952 /* Parse default tables corresponding to offset == 0, 1, or 2. */ 953 /* Parse default tables corresponding to offset == 0, 1, or 2. */
953 /* CFF specification intimates the following: */ 954 /* CFF specification intimates the following: */
954 /* */ 955 /* */
955 /* In order to use a predefined charset, the following must be */ 956 /* In order to use a predefined charset, the following must be */
956 /* true: The charset constructed for the glyphs in the font's */ 957 /* true: The charset constructed for the glyphs in the font's */
957 /* charstrings dictionary must match the predefined charset in */ 958 /* charstrings dictionary must match the predefined charset in */
958 /* the first num_glyphs. */ 959 /* the first num_glyphs. */
959 960
960 charset->offset = offset; /* record charset type */ 961 charset->offset = offset; /* record charset type */
961 962
962 switch ( (FT_UInt)offset ) 963 switch ( (FT_UInt)offset )
963 { 964 {
964 case 0: 965 case 0:
965 if ( num_glyphs > 229 ) 966 if ( num_glyphs > 229 )
966 { 967 {
967 FT_ERROR(( "cff_charset_load: implicit charset larger than\n" 968 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
968 "predefined charset (Adobe ISO-Latin)\n" )); 969 "predefined charset (Adobe ISO-Latin)\n" ));
969 error = CFF_Err_Invalid_File_Format; 970 error = FT_THROW( Invalid_File_Format );
970 goto Exit; 971 goto Exit;
971 } 972 }
972 973
973 /* Allocate memory for sids. */ 974 /* Allocate memory for sids. */
974 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 975 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
975 goto Exit; 976 goto Exit;
976 977
977 /* Copy the predefined charset into the allocated memory. */ 978 /* Copy the predefined charset into the allocated memory. */
978 FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); 979 FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
979 980
980 break; 981 break;
981 982
982 case 1: 983 case 1:
983 if ( num_glyphs > 166 ) 984 if ( num_glyphs > 166 )
984 { 985 {
985 FT_ERROR(( "cff_charset_load: implicit charset larger than\n" 986 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
986 "predefined charset (Adobe Expert)\n" )); 987 "predefined charset (Adobe Expert)\n" ));
987 error = CFF_Err_Invalid_File_Format; 988 error = FT_THROW( Invalid_File_Format );
988 goto Exit; 989 goto Exit;
989 } 990 }
990 991
991 /* Allocate memory for sids. */ 992 /* Allocate memory for sids. */
992 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 993 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
993 goto Exit; 994 goto Exit;
994 995
995 /* Copy the predefined charset into the allocated memory. */ 996 /* Copy the predefined charset into the allocated memory. */
996 FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); 997 FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
997 998
998 break; 999 break;
999 1000
1000 case 2: 1001 case 2:
1001 if ( num_glyphs > 87 ) 1002 if ( num_glyphs > 87 )
1002 { 1003 {
1003 FT_ERROR(( "cff_charset_load: implicit charset larger than\n" 1004 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
1004 "predefined charset (Adobe Expert Subset)\n" )); 1005 "predefined charset (Adobe Expert Subset)\n" ));
1005 error = CFF_Err_Invalid_File_Format; 1006 error = FT_THROW( Invalid_File_Format );
1006 goto Exit; 1007 goto Exit;
1007 } 1008 }
1008 1009
1009 /* Allocate memory for sids. */ 1010 /* Allocate memory for sids. */
1010 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 1011 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
1011 goto Exit; 1012 goto Exit;
1012 1013
1013 /* Copy the predefined charset into the allocated memory. */ 1014 /* Copy the predefined charset into the allocated memory. */
1014 FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); 1015 FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
1015 1016
1016 break; 1017 break;
1017 1018
1018 default: 1019 default:
1019 error = CFF_Err_Invalid_File_Format; 1020 error = FT_THROW( Invalid_File_Format );
1020 goto Exit; 1021 goto Exit;
1021 } 1022 }
1022 } 1023 }
1023 1024
1024 /* we have to invert the `sids' array for subsetted CID-keyed fonts */ 1025 /* we have to invert the `sids' array for subsetted CID-keyed fonts */
1025 if ( invert ) 1026 if ( invert )
1026 error = cff_charset_compute_cids( charset, num_glyphs, memory ); 1027 error = cff_charset_compute_cids( charset, num_glyphs, memory );
1027 1028
1028 Exit: 1029 Exit:
1029 /* Clean up if there was an error. */ 1030 /* Clean up if there was an error. */
(...skipping 20 matching lines...) Expand all
1050 1051
1051 1052
1052 static FT_Error 1053 static FT_Error
1053 cff_encoding_load( CFF_Encoding encoding, 1054 cff_encoding_load( CFF_Encoding encoding,
1054 CFF_Charset charset, 1055 CFF_Charset charset,
1055 FT_UInt num_glyphs, 1056 FT_UInt num_glyphs,
1056 FT_Stream stream, 1057 FT_Stream stream,
1057 FT_ULong base_offset, 1058 FT_ULong base_offset,
1058 FT_ULong offset ) 1059 FT_ULong offset )
1059 { 1060 {
1060 FT_Error error = CFF_Err_Ok; 1061 FT_Error error = FT_Err_Ok;
1061 FT_UInt count; 1062 FT_UInt count;
1062 FT_UInt j; 1063 FT_UInt j;
1063 FT_UShort glyph_sid; 1064 FT_UShort glyph_sid;
1064 FT_UInt glyph_code; 1065 FT_UInt glyph_code;
1065 1066
1066 1067
1067 /* Check for charset->sids. If we do not have this, we fail. */ 1068 /* Check for charset->sids. If we do not have this, we fail. */
1068 if ( !charset->sids ) 1069 if ( !charset->sids )
1069 { 1070 {
1070 error = CFF_Err_Invalid_File_Format; 1071 error = FT_THROW( Invalid_File_Format );
1071 goto Exit; 1072 goto Exit;
1072 } 1073 }
1073 1074
1074 /* Zero out the code to gid/sid mappings. */ 1075 /* Zero out the code to gid/sid mappings. */
1075 for ( j = 0; j < 256; j++ ) 1076 for ( j = 0; j < 256; j++ )
1076 { 1077 {
1077 encoding->sids [j] = 0; 1078 encoding->sids [j] = 0;
1078 encoding->codes[j] = 0; 1079 encoding->codes[j] = 0;
1079 } 1080 }
1080 1081
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 } 1181 }
1181 1182
1182 /* simple check; one never knows what can be found in a font */ 1183 /* simple check; one never knows what can be found in a font */
1183 if ( encoding->count > 256 ) 1184 if ( encoding->count > 256 )
1184 encoding->count = 256; 1185 encoding->count = 256;
1185 } 1186 }
1186 break; 1187 break;
1187 1188
1188 default: 1189 default:
1189 FT_ERROR(( "cff_encoding_load: invalid table format\n" )); 1190 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1190 error = CFF_Err_Invalid_File_Format; 1191 error = FT_THROW( Invalid_File_Format );
1191 goto Exit; 1192 goto Exit;
1192 } 1193 }
1193 1194
1194 /* Parse supplemental encodings, if any. */ 1195 /* Parse supplemental encodings, if any. */
1195 if ( encoding->format & 0x80 ) 1196 if ( encoding->format & 0x80 )
1196 { 1197 {
1197 FT_UInt gindex; 1198 FT_UInt gindex;
1198 1199
1199 1200
1200 /* count supplements */ 1201 /* count supplements */
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 else 1274 else
1274 { 1275 {
1275 encoding->codes[j] = 0; 1276 encoding->codes[j] = 0;
1276 encoding->sids [j] = 0; 1277 encoding->sids [j] = 0;
1277 } 1278 }
1278 } 1279 }
1279 break; 1280 break;
1280 1281
1281 default: 1282 default:
1282 FT_ERROR(( "cff_encoding_load: invalid table format\n" )); 1283 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1283 error = CFF_Err_Invalid_File_Format; 1284 error = FT_THROW( Invalid_File_Format );
1284 goto Exit; 1285 goto Exit;
1285 } 1286 }
1286 } 1287 }
1287 1288
1288 Exit: 1289 Exit:
1289 1290
1290 /* Clean up if there was an error. */ 1291 /* Clean up if there was an error. */
1291 return error; 1292 return error;
1292 } 1293 }
1293 1294
(...skipping 12 matching lines...) Expand all
1306 FT_ULong dict_len; 1307 FT_ULong dict_len;
1307 CFF_FontRecDict top = &font->font_dict; 1308 CFF_FontRecDict top = &font->font_dict;
1308 CFF_Private priv = &font->private_dict; 1309 CFF_Private priv = &font->private_dict;
1309 1310
1310 1311
1311 cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library ); 1312 cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
1312 1313
1313 /* set defaults */ 1314 /* set defaults */
1314 FT_MEM_ZERO( top, sizeof ( *top ) ); 1315 FT_MEM_ZERO( top, sizeof ( *top ) );
1315 1316
1316 top->underline_position = -100L << 16; 1317 top->underline_position = -( 100L << 16 );
1317 top->underline_thickness = 50L << 16; 1318 top->underline_thickness = 50L << 16;
1318 top->charstring_type = 2; 1319 top->charstring_type = 2;
1319 top->font_matrix.xx = 0x10000L; 1320 top->font_matrix.xx = 0x10000L;
1320 top->font_matrix.yy = 0x10000L; 1321 top->font_matrix.yy = 0x10000L;
1321 top->cid_count = 8720; 1322 top->cid_count = 8720;
1322 1323
1323 /* we use the implementation specific SID value 0xFFFF to indicate */ 1324 /* we use the implementation specific SID value 0xFFFF to indicate */
1324 /* missing entries */ 1325 /* missing entries */
1325 top->version = 0xFFFFU; 1326 top->version = 0xFFFFU;
1326 top->notice = 0xFFFFU; 1327 top->notice = 0xFFFFU;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 FT_FRAME_BYTE( header_size ), 1433 FT_FRAME_BYTE( header_size ),
1433 FT_FRAME_BYTE( absolute_offsize ), 1434 FT_FRAME_BYTE( absolute_offsize ),
1434 FT_FRAME_END 1435 FT_FRAME_END
1435 }; 1436 };
1436 1437
1437 FT_Error error; 1438 FT_Error error;
1438 FT_Memory memory = stream->memory; 1439 FT_Memory memory = stream->memory;
1439 FT_ULong base_offset; 1440 FT_ULong base_offset;
1440 CFF_FontRecDict dict; 1441 CFF_FontRecDict dict;
1441 CFF_IndexRec string_index; 1442 CFF_IndexRec string_index;
1443 FT_Int subfont_index;
1442 1444
1443 1445
1444 FT_ZERO( font ); 1446 FT_ZERO( font );
1445 FT_ZERO( &string_index ); 1447 FT_ZERO( &string_index );
1446 1448
1447 font->stream = stream; 1449 font->stream = stream;
1448 font->memory = memory; 1450 font->memory = memory;
1449 dict = &font->top_font.font_dict; 1451 dict = &font->top_font.font_dict;
1450 base_offset = FT_STREAM_POS(); 1452 base_offset = FT_STREAM_POS();
1451 1453
1452 /* read CFF font header */ 1454 /* read CFF font header */
1453 if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) 1455 if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
1454 goto Exit; 1456 goto Exit;
1455 1457
1456 /* check format */ 1458 /* check format */
1457 if ( font->version_major != 1 || 1459 if ( font->version_major != 1 ||
1458 font->header_size < 4 || 1460 font->header_size < 4 ||
1459 font->absolute_offsize > 4 ) 1461 font->absolute_offsize > 4 )
1460 { 1462 {
1461 FT_TRACE2(( " not a CFF font header\n" )); 1463 FT_TRACE2(( " not a CFF font header\n" ));
1462 error = CFF_Err_Unknown_File_Format; 1464 error = FT_THROW( Unknown_File_Format );
1463 goto Exit; 1465 goto Exit;
1464 } 1466 }
1465 1467
1466 /* skip the rest of the header */ 1468 /* skip the rest of the header */
1467 if ( FT_STREAM_SKIP( font->header_size - 4 ) ) 1469 if ( FT_STREAM_SKIP( font->header_size - 4 ) )
1468 goto Exit; 1470 goto Exit;
1469 1471
1470 /* read the name, top dict, string and global subrs index */ 1472 /* read the name, top dict, string and global subrs index */
1471 if ( FT_SET_ERROR( cff_index_init( &font->name_index, 1473 if ( FT_SET_ERROR( cff_index_init( &font->name_index,
1472 stream, 0 ) ) || 1474 stream, 0 ) ) ||
1473 FT_SET_ERROR( cff_index_init( &font->font_dict_index, 1475 FT_SET_ERROR( cff_index_init( &font->font_dict_index,
1474 stream, 0 ) ) || 1476 stream, 0 ) ) ||
1475 FT_SET_ERROR( cff_index_init( &string_index, 1477 FT_SET_ERROR( cff_index_init( &string_index,
1476 stream, 1 ) ) || 1478 stream, 1 ) ) ||
1477 FT_SET_ERROR( cff_index_init( &font->global_subrs_index, 1479 FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
1478 stream, 1 ) ) || 1480 stream, 1 ) ) ||
1479 FT_SET_ERROR( cff_index_get_pointers( &string_index, 1481 FT_SET_ERROR( cff_index_get_pointers( &string_index,
1480 &font->strings, 1482 &font->strings,
1481 &font->string_pool ) ) ) 1483 &font->string_pool ) ) )
1482 goto Exit; 1484 goto Exit;
1483 1485
1484 font->num_strings = string_index.count; 1486 font->num_strings = string_index.count;
1485 1487
1486 /* well, we don't really forget the `disabled' fonts... */ 1488 if ( pure_cff )
1487 font->num_faces = font->name_index.count;
1488 if ( face_index >= (FT_Int)font->num_faces )
1489 { 1489 {
1490 FT_ERROR(( "cff_font_load: incorrect face index = %d\n", 1490 /* well, we don't really forget the `disabled' fonts... */
1491 face_index )); 1491 subfont_index = face_index;
1492 error = CFF_Err_Invalid_Argument; 1492
1493 if ( subfont_index >= (FT_Int)font->name_index.count )
1494 {
1495 FT_ERROR(( "cff_font_load:"
1496 " invalid subfont index for pure CFF font (%d)\n",
1497 subfont_index ));
1498 error = FT_THROW( Invalid_Argument );
1499 goto Exit;
1500 }
1501
1502 font->num_faces = font->name_index.count;
1503 }
1504 else
1505 {
1506 subfont_index = 0;
1507
1508 if ( font->name_index.count > 1 )
1509 {
1510 FT_ERROR(( "cff_font_load:"
1511 " invalid CFF font with multiple subfonts\n"
1512 " "
1513 " in SFNT wrapper\n" ));
1514 error = FT_THROW( Invalid_File_Format );
1515 goto Exit;
1516 }
1493 } 1517 }
1494 1518
1495 /* in case of a font format check, simply exit now */ 1519 /* in case of a font format check, simply exit now */
1496 if ( face_index < 0 ) 1520 if ( face_index < 0 )
1497 goto Exit; 1521 goto Exit;
1498 1522
1499 /* now, parse the top-level font dictionary */ 1523 /* now, parse the top-level font dictionary */
1500 FT_TRACE4(( "parsing top-level\n" )); 1524 FT_TRACE4(( "parsing top-level\n" ));
1501 error = cff_subfont_load( &font->top_font, 1525 error = cff_subfont_load( &font->top_font,
1502 &font->font_dict_index, 1526 &font->font_dict_index,
1503 face_index, 1527 subfont_index,
1504 stream, 1528 stream,
1505 base_offset, 1529 base_offset,
1506 library ); 1530 library );
1507 if ( error ) 1531 if ( error )
1508 goto Exit; 1532 goto Exit;
1509 1533
1510 if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) 1534 if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
1511 goto Exit; 1535 goto Exit;
1512 1536
1513 error = cff_index_init( &font->charstrings_index, stream, 0 ); 1537 error = cff_index_init( &font->charstrings_index, stream, 0 );
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 if ( error ) 1593 if ( error )
1570 goto Exit; 1594 goto Exit;
1571 } 1595 }
1572 else 1596 else
1573 font->num_subfonts = 0; 1597 font->num_subfonts = 0;
1574 1598
1575 /* read the charstrings index now */ 1599 /* read the charstrings index now */
1576 if ( dict->charstrings_offset == 0 ) 1600 if ( dict->charstrings_offset == 0 )
1577 { 1601 {
1578 FT_ERROR(( "cff_font_load: no charstrings offset\n" )); 1602 FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
1579 error = CFF_Err_Invalid_File_Format; 1603 error = FT_THROW( Invalid_File_Format );
1580 goto Exit; 1604 goto Exit;
1581 } 1605 }
1582 1606
1583 font->num_glyphs = font->charstrings_index.count; 1607 font->num_glyphs = font->charstrings_index.count;
1584 1608
1585 error = cff_index_get_pointers( &font->global_subrs_index, 1609 error = cff_index_get_pointers( &font->global_subrs_index,
1586 &font->global_subrs, NULL ); 1610 &font->global_subrs, NULL );
1587 1611
1588 if ( error ) 1612 if ( error )
1589 goto Exit; 1613 goto Exit;
(...skipping 18 matching lines...) Expand all
1608 stream, 1632 stream,
1609 base_offset, 1633 base_offset,
1610 dict->encoding_offset ); 1634 dict->encoding_offset );
1611 if ( error ) 1635 if ( error )
1612 goto Exit; 1636 goto Exit;
1613 } 1637 }
1614 } 1638 }
1615 1639
1616 /* get the font name (/CIDFontName for CID-keyed fonts, */ 1640 /* get the font name (/CIDFontName for CID-keyed fonts, */
1617 /* /FontName otherwise) */ 1641 /* /FontName otherwise) */
1618 font->font_name = cff_index_get_name( font, face_index ); 1642 font->font_name = cff_index_get_name( font, subfont_index );
1619 1643
1620 Exit: 1644 Exit:
1621 cff_index_done( &string_index ); 1645 cff_index_done( &string_index );
1622 1646
1623 return error; 1647 return error;
1624 } 1648 }
1625 1649
1626 1650
1627 FT_LOCAL_DEF( void ) 1651 FT_LOCAL_DEF( void )
1628 cff_font_done( CFF_Font font ) 1652 cff_font_done( CFF_Font font )
(...skipping 24 matching lines...) Expand all
1653 cff_subfont_done( memory, &font->top_font ); 1677 cff_subfont_done( memory, &font->top_font );
1654 1678
1655 CFF_Done_FD_Select( &font->fd_select, font->stream ); 1679 CFF_Done_FD_Select( &font->fd_select, font->stream );
1656 1680
1657 FT_FREE( font->font_info ); 1681 FT_FREE( font->font_info );
1658 1682
1659 FT_FREE( font->font_name ); 1683 FT_FREE( font->font_name );
1660 FT_FREE( font->global_subrs ); 1684 FT_FREE( font->global_subrs );
1661 FT_FREE( font->strings ); 1685 FT_FREE( font->strings );
1662 FT_FREE( font->string_pool ); 1686 FT_FREE( font->string_pool );
1687
1688 if ( font->cf2_instance.finalizer )
1689 {
1690 font->cf2_instance.finalizer( font->cf2_instance.data );
1691 FT_FREE( font->cf2_instance.data );
1692 }
1663 } 1693 }
1664 1694
1665 1695
1666 /* END */ 1696 /* END */
OLDNEW
« no previous file with comments | « src/cff/cffgload.c ('k') | src/cff/cffobjs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698