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

Side by Side Diff: third_party/freetype/src/type1/t1load.c

Issue 1413673003: Update bundled freetype to 2.6.1 (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: DEPS for corpus Created 5 years, 1 month 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 | « third_party/freetype/src/type1/t1load.h ('k') | third_party/freetype/src/type1/t1objs.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 /* t1load.c */ 3 /* t1load.c */
4 /* */ 4 /* */
5 /* Type 1 font loader (body). */ 5 /* Type 1 font loader (body). */
6 /* */ 6 /* */
7 /* Copyright 1996-2014 by */ 7 /* Copyright 1996-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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 219
220 return error; 220 return error;
221 } 221 }
222 222
223 223
224 /*************************************************************************/ 224 /*************************************************************************/
225 /* */ 225 /* */
226 /* Given a normalized (blend) coordinate, figure out the design */ 226 /* Given a normalized (blend) coordinate, figure out the design */
227 /* coordinate appropriate for that value. */ 227 /* coordinate appropriate for that value. */
228 /* */ 228 /* */
229 FT_LOCAL_DEF( FT_Fixed ) 229 static FT_Fixed
230 mm_axis_unmap( PS_DesignMap axismap, 230 mm_axis_unmap( PS_DesignMap axismap,
231 FT_Fixed ncv ) 231 FT_Fixed ncv )
232 { 232 {
233 int j; 233 int j;
234 234
235 235
236 if ( ncv <= axismap->blend_points[0] ) 236 if ( ncv <= axismap->blend_points[0] )
237 return INT_TO_FIXED( axismap->design_points[0] ); 237 return INT_TO_FIXED( axismap->design_points[0] );
238 238
239 for ( j = 1; j < axismap->num_points; ++j ) 239 for ( j = 1; j < axismap->num_points; ++j )
240 { 240 {
241 if ( ncv <= axismap->blend_points[j] ) 241 if ( ncv <= axismap->blend_points[j] )
242 return INT_TO_FIXED( axismap->design_points[j - 1] ) + 242 return INT_TO_FIXED( axismap->design_points[j - 1] ) +
243 ( axismap->design_points[j] - axismap->design_points[j - 1] ) * 243 ( axismap->design_points[j] - axismap->design_points[j - 1] ) *
244 FT_DivFix( ncv - axismap->blend_points[j - 1], 244 FT_DivFix( ncv - axismap->blend_points[j - 1],
245 axismap->blend_points[j] - 245 axismap->blend_points[j] -
246 axismap->blend_points[j - 1] ); 246 axismap->blend_points[j - 1] );
247 } 247 }
248 248
249 return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); 249 return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
250 } 250 }
251 251
252 252
253 /*************************************************************************/ 253 /*************************************************************************/
254 /* */ 254 /* */
255 /* Given a vector of weights, one for each design, figure out the */ 255 /* Given a vector of weights, one for each design, figure out the */
256 /* normalized axis coordinates which gave rise to those weights. */ 256 /* normalized axis coordinates which gave rise to those weights. */
257 /* */ 257 /* */
258 FT_LOCAL_DEF( void ) 258 static void
259 mm_weights_unmap( FT_Fixed* weights, 259 mm_weights_unmap( FT_Fixed* weights,
260 FT_Fixed* axiscoords, 260 FT_Fixed* axiscoords,
261 FT_UInt axis_count ) 261 FT_UInt axis_count )
262 { 262 {
263 FT_ASSERT( axis_count <= T1_MAX_MM_AXIS ); 263 FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
264 264
265 if ( axis_count == 1 ) 265 if ( axis_count == 1 )
266 axiscoords[0] = weights[1]; 266 axiscoords[0] = weights[1];
267 267
268 else if ( axis_count == 2 ) 268 else if ( axis_count == 2 )
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 return error; 361 return error;
362 } 362 }
363 363
364 364
365 FT_LOCAL_DEF( FT_Error ) 365 FT_LOCAL_DEF( FT_Error )
366 T1_Set_MM_Blend( T1_Face face, 366 T1_Set_MM_Blend( T1_Face face,
367 FT_UInt num_coords, 367 FT_UInt num_coords,
368 FT_Fixed* coords ) 368 FT_Fixed* coords )
369 { 369 {
370 PS_Blend blend = face->blend; 370 PS_Blend blend = face->blend;
371 FT_Error error;
372 FT_UInt n, m; 371 FT_UInt n, m;
373 372
374 373
375 error = FT_ERR( Invalid_Argument ); 374 if ( !blend )
375 return FT_THROW( Invalid_Argument );
376 376
377 if ( blend && blend->num_axis == num_coords ) 377 if ( num_coords > blend->num_axis )
378 num_coords = blend->num_axis;
379
380 /* recompute the weight vector from the blend coordinates */
381 for ( n = 0; n < blend->num_designs; n++ )
378 { 382 {
379 /* recompute the weight vector from the blend coordinates */ 383 FT_Fixed result = 0x10000L; /* 1.0 fixed */
380 for ( n = 0; n < blend->num_designs; n++ )
381 {
382 FT_Fixed result = 0x10000L; /* 1.0 fixed */
383 384
384 385
385 for ( m = 0; m < blend->num_axis; m++ ) 386 for ( m = 0; m < blend->num_axis; m++ )
386 { 387 {
387 FT_Fixed factor; 388 FT_Fixed factor;
388 389
389 390
390 /* get current blend axis position */ 391 /* get current blend axis position; */
391 factor = coords[m]; 392 /* use a default value if we don't have a coordinate */
392 if ( factor < 0 ) 393 factor = m < num_coords ? coords[m] : 0x8000;
393 factor = 0; 394 if ( factor < 0 )
394 if ( factor > 0x10000L ) 395 factor = 0;
395 factor = 0x10000L; 396 if ( factor > 0x10000L )
397 factor = 0x10000L;
396 398
397 if ( ( n & ( 1 << m ) ) == 0 ) 399 if ( ( n & ( 1 << m ) ) == 0 )
398 factor = 0x10000L - factor; 400 factor = 0x10000L - factor;
399 401
400 result = FT_MulFix( result, factor ); 402 result = FT_MulFix( result, factor );
401 }
402 blend->weight_vector[n] = result;
403 } 403 }
404 404 blend->weight_vector[n] = result;
405 error = FT_Err_Ok;
406 } 405 }
407 406
408 return error; 407 return FT_Err_Ok;
409 } 408 }
410 409
411 410
412 FT_LOCAL_DEF( FT_Error ) 411 FT_LOCAL_DEF( FT_Error )
413 T1_Set_MM_Design( T1_Face face, 412 T1_Set_MM_Design( T1_Face face,
414 FT_UInt num_coords, 413 FT_UInt num_coords,
415 FT_Long* coords ) 414 FT_Long* coords )
416 { 415 {
417 PS_Blend blend = face->blend; 416 PS_Blend blend = face->blend;
418 FT_Error error;
419 FT_UInt n, p; 417 FT_UInt n, p;
418 FT_Fixed final_blends[T1_MAX_MM_DESIGNS];
420 419
421 420
422 error = FT_ERR( Invalid_Argument ); 421 if ( !blend )
423 if ( blend && blend->num_axis == num_coords ) 422 return FT_THROW( Invalid_Argument );
423
424 if ( num_coords > blend->num_axis )
425 num_coords = blend->num_axis;
426
427 /* compute the blend coordinates through the blend design map */
428
429 for ( n = 0; n < blend->num_axis; n++ )
424 { 430 {
425 /* compute the blend coordinates through the blend design map */ 431 FT_Long design;
426 FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; 432 FT_Fixed the_blend;
433 PS_DesignMap map = blend->design_map + n;
434 FT_Long* designs = map->design_points;
435 FT_Fixed* blends = map->blend_points;
436 FT_Int before = -1, after = -1;
427 437
428 438
429 for ( n = 0; n < blend->num_axis; n++ ) 439 /* use a default value if we don't have a coordinate */
440 if ( n < num_coords )
441 design = coords[n];
442 else
443 design = ( designs[map->num_points - 1] - designs[0] ) / 2;
444
445 for ( p = 0; p < (FT_UInt)map->num_points; p++ )
430 { 446 {
431 FT_Long design = coords[n]; 447 FT_Long p_design = designs[p];
432 FT_Fixed the_blend;
433 PS_DesignMap map = blend->design_map + n;
434 FT_Long* designs = map->design_points;
435 FT_Fixed* blends = map->blend_points;
436 FT_Int before = -1, after = -1;
437 448
438 449
439 for ( p = 0; p < (FT_UInt)map->num_points; p++ ) 450 /* exact match? */
451 if ( design == p_design )
440 { 452 {
441 FT_Long p_design = designs[p]; 453 the_blend = blends[p];
442 454 goto Found;
443
444 /* exact match? */
445 if ( design == p_design )
446 {
447 the_blend = blends[p];
448 goto Found;
449 }
450
451 if ( design < p_design )
452 {
453 after = p;
454 break;
455 }
456
457 before = p;
458 } 455 }
459 456
460 /* now interpolate if necessary */ 457 if ( design < p_design )
461 if ( before < 0 ) 458 {
462 the_blend = blends[0]; 459 after = (FT_Int)p;
460 break;
461 }
463 462
464 else if ( after < 0 ) 463 before = (FT_Int)p;
465 the_blend = blends[map->num_points - 1];
466
467 else
468 the_blend = FT_MulDiv( design - designs[before],
469 blends [after] - blends [before],
470 designs[after] - designs[before] );
471
472 Found:
473 final_blends[n] = the_blend;
474 } 464 }
475 465
476 error = T1_Set_MM_Blend( face, num_coords, final_blends ); 466 /* now interpolate if necessary */
467 if ( before < 0 )
468 the_blend = blends[0];
469
470 else if ( after < 0 )
471 the_blend = blends[map->num_points - 1];
472
473 else
474 the_blend = FT_MulDiv( design - designs[before],
475 blends [after] - blends [before],
476 designs[after] - designs[before] );
477
478 Found:
479 final_blends[n] = the_blend;
477 } 480 }
478 481
479 return error; 482 return T1_Set_MM_Blend( face, blend->num_axis, final_blends );
480 } 483 }
481 484
482 485
483 /*************************************************************************/ 486 /*************************************************************************/
484 /* */ 487 /* */
485 /* Just a wrapper around T1_Set_MM_Design to support the different */ 488 /* Just a wrapper around T1_Set_MM_Design to support the different */
486 /* arguments needed by the GX var distortable fonts. */ 489 /* arguments needed by the GX var distortable fonts. */
487 /* */ 490 /* */
488 FT_LOCAL_DEF( FT_Error ) 491 FT_LOCAL_DEF( FT_Error )
489 T1_Set_Var_Design( T1_Face face, 492 T1_Set_Var_Design( T1_Face face,
490 FT_UInt num_coords, 493 FT_UInt num_coords,
491 FT_Fixed* coords ) 494 FT_Fixed* coords )
492 { 495 {
493 FT_Long lcoords[4]; /* maximum axis count is 4 */ 496 FT_Long lcoords[T1_MAX_MM_AXIS];
494 FT_UInt i; 497 FT_UInt i;
495 FT_Error error;
496 498
497 499
498 error = FT_ERR( Invalid_Argument ); 500 if ( num_coords > T1_MAX_MM_AXIS )
499 if ( num_coords <= 4 && num_coords > 0 ) 501 num_coords = T1_MAX_MM_AXIS;
500 {
501 for ( i = 0; i < num_coords; ++i )
502 lcoords[i] = FIXED_TO_INT( coords[i] );
503 error = T1_Set_MM_Design( face, num_coords, lcoords );
504 }
505 502
506 return error; 503 for ( i = 0; i < num_coords; ++i )
504 lcoords[i] = FIXED_TO_INT( coords[i] );
505
506 return T1_Set_MM_Design( face, num_coords, lcoords );
507 } 507 }
508 508
509 509
510 FT_LOCAL_DEF( void ) 510 FT_LOCAL_DEF( void )
511 T1_Done_Blend( T1_Face face ) 511 T1_Done_Blend( T1_Face face )
512 { 512 {
513 FT_Memory memory = face->root.memory; 513 FT_Memory memory = face->root.memory;
514 PS_Blend blend = face->blend; 514 PS_Blend blend = face->blend;
515 515
516 516
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); 592 error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
593 if ( error ) 593 if ( error )
594 goto Exit; 594 goto Exit;
595 595
596 blend = face->blend; 596 blend = face->blend;
597 memory = face->root.memory; 597 memory = face->root.memory;
598 598
599 /* each token is an immediate containing the name of the axis */ 599 /* each token is an immediate containing the name of the axis */
600 for ( n = 0; n < num_axis; n++ ) 600 for ( n = 0; n < num_axis; n++ )
601 { 601 {
602 T1_Token token = axis_tokens + n; 602 T1_Token token = axis_tokens + n;
603 FT_Byte* name; 603 FT_Byte* name;
604 FT_PtrDist len; 604 FT_UInt len;
605 605
606 606
607 /* skip first slash, if any */ 607 /* skip first slash, if any */
608 if ( token->start[0] == '/' ) 608 if ( token->start[0] == '/' )
609 token->start++; 609 token->start++;
610 610
611 len = token->limit - token->start; 611 len = (FT_UInt)( token->limit - token->start );
612 if ( len == 0 ) 612 if ( len == 0 )
613 { 613 {
614 error = FT_THROW( Invalid_File_Format ); 614 error = FT_THROW( Invalid_File_Format );
615 goto Exit; 615 goto Exit;
616 } 616 }
617 617
618 if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) ) 618 name = (FT_Byte*)blend->axis_names[n];
619 if ( name )
620 {
621 FT_TRACE0(( "parse_blend_axis_types:"
622 " overwriting axis name `%s' with `%*.s'\n",
623 name, len, token->start ));
624 FT_FREE( name );
625 }
626
627 if ( FT_ALLOC( blend->axis_names[n], len + 1 ) )
619 goto Exit; 628 goto Exit;
620 629
621 name = (FT_Byte*)blend->axis_names[n]; 630 name = (FT_Byte*)blend->axis_names[n];
622 FT_MEM_COPY( name, token->start, len ); 631 FT_MEM_COPY( name, token->start, len );
623 name[len] = '\0'; 632 name[len] = '\0';
624 } 633 }
625 634
626 Exit: 635 Exit:
627 loader->parser.root.error = error; 636 loader->parser.root.error = error;
628 } 637 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS ) 694 if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
686 { 695 {
687 FT_ERROR(( "parse_blend_design_positions:" 696 FT_ERROR(( "parse_blend_design_positions:"
688 " invalid number of axes: %d\n", 697 " invalid number of axes: %d\n",
689 n_axis )); 698 n_axis ));
690 error = FT_THROW( Invalid_File_Format ); 699 error = FT_THROW( Invalid_File_Format );
691 goto Exit; 700 goto Exit;
692 } 701 }
693 702
694 num_axis = n_axis; 703 num_axis = n_axis;
695 error = t1_allocate_blend( face, num_designs, num_axis ); 704 error = t1_allocate_blend( face,
705 (FT_UInt)num_designs,
706 (FT_UInt)num_axis );
696 if ( error ) 707 if ( error )
697 goto Exit; 708 goto Exit;
698 blend = face->blend; 709 blend = face->blend;
699 } 710 }
700 else if ( n_axis != num_axis ) 711 else if ( n_axis != num_axis )
701 { 712 {
702 FT_ERROR(( "parse_blend_design_positions: incorrect table\n" )); 713 FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
703 error = FT_THROW( Invalid_File_Format ); 714 error = FT_THROW( Invalid_File_Format );
704 goto Exit; 715 goto Exit;
705 } 716 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 { 761 {
751 FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", 762 FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
752 num_axis )); 763 num_axis ));
753 error = FT_THROW( Invalid_File_Format ); 764 error = FT_THROW( Invalid_File_Format );
754 goto Exit; 765 goto Exit;
755 } 766 }
756 767
757 old_cursor = parser->root.cursor; 768 old_cursor = parser->root.cursor;
758 old_limit = parser->root.limit; 769 old_limit = parser->root.limit;
759 770
760 error = t1_allocate_blend( face, 0, num_axis ); 771 error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
761 if ( error ) 772 if ( error )
762 goto Exit; 773 goto Exit;
763 blend = face->blend; 774 blend = face->blend;
764 775
765 /* now read each axis design map */ 776 /* now read each axis design map */
766 for ( n = 0; n < num_axis; n++ ) 777 for ( n = 0; n < num_axis; n++ )
767 { 778 {
768 PS_DesignMap map = blend->design_map + n; 779 PS_DesignMap map = blend->design_map + n;
769 T1_Token axis_token; 780 T1_Token axis_token;
770 T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; 781 T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS];
771 FT_Int p, num_points; 782 FT_Int p, num_points;
772 783
773 784
774 axis_token = axis_tokens + n; 785 axis_token = axis_tokens + n;
775 786
776 parser->root.cursor = axis_token->start; 787 parser->root.cursor = axis_token->start;
777 parser->root.limit = axis_token->limit; 788 parser->root.limit = axis_token->limit;
778 T1_ToTokenArray( parser, point_tokens, 789 T1_ToTokenArray( parser, point_tokens,
779 T1_MAX_MM_MAP_POINTS, &num_points ); 790 T1_MAX_MM_MAP_POINTS, &num_points );
780 791
781 if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) 792 if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
782 { 793 {
783 FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); 794 FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
784 error = FT_THROW( Invalid_File_Format ); 795 error = FT_THROW( Invalid_File_Format );
785 goto Exit; 796 goto Exit;
786 } 797 }
787 798
799 if ( map->design_points )
800 {
801 FT_ERROR(( "parse_blend_design_map: duplicate table\n" ));
802 error = FT_THROW( Invalid_File_Format );
803 goto Exit;
804 }
805
788 /* allocate design map data */ 806 /* allocate design map data */
789 if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) ) 807 if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
790 goto Exit; 808 goto Exit;
791 map->blend_points = map->design_points + num_points; 809 map->blend_points = map->design_points + num_points;
792 map->num_points = (FT_Byte)num_points; 810 map->num_points = (FT_Byte)num_points;
793 811
794 for ( p = 0; p < num_points; p++ ) 812 for ( p = 0; p < num_points; p++ )
795 { 813 {
796 T1_Token point_token; 814 T1_Token point_token;
797 815
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 { 859 {
842 FT_ERROR(( "parse_weight_vector:" 860 FT_ERROR(( "parse_weight_vector:"
843 " incorrect number of designs: %d\n", 861 " incorrect number of designs: %d\n",
844 num_designs )); 862 num_designs ));
845 error = FT_THROW( Invalid_File_Format ); 863 error = FT_THROW( Invalid_File_Format );
846 goto Exit; 864 goto Exit;
847 } 865 }
848 866
849 if ( !blend || !blend->num_designs ) 867 if ( !blend || !blend->num_designs )
850 { 868 {
851 error = t1_allocate_blend( face, num_designs, 0 ); 869 error = t1_allocate_blend( face, (FT_UInt)num_designs, 0 );
852 if ( error ) 870 if ( error )
853 goto Exit; 871 goto Exit;
854 blend = face->blend; 872 blend = face->blend;
855 } 873 }
856 else if ( blend->num_designs != (FT_UInt)num_designs ) 874 else if ( blend->num_designs != (FT_UInt)num_designs )
857 { 875 {
858 FT_ERROR(( "parse_weight_vector:" 876 FT_ERROR(( "parse_weight_vector:"
859 " /BlendDesignPosition and /WeightVector have\n" 877 " /BlendDesignPosition and /WeightVector have\n"
860 " " 878 " "
861 " different number of elements\n" )); 879 " different number of elements\n" ));
(...skipping 21 matching lines...) Expand all
883 parser->root.error = error; 901 parser->root.error = error;
884 } 902 }
885 903
886 904
887 /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ 905 /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */
888 /* we're only interested in the number of array elements */ 906 /* we're only interested in the number of array elements */
889 static void 907 static void
890 parse_buildchar( T1_Face face, 908 parse_buildchar( T1_Face face,
891 T1_Loader loader ) 909 T1_Loader loader )
892 { 910 {
893 face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 ); 911 face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser,
894 912 0, NULL, 0 );
895 return; 913 return;
896 } 914 }
897 915
898 916
899 #endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ 917 #endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
900 918
901 919
902 920
903 921
904 /*************************************************************************/ 922 /*************************************************************************/
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 static void 1049 static void
1032 parse_private( T1_Face face, 1050 parse_private( T1_Face face,
1033 T1_Loader loader ) 1051 T1_Loader loader )
1034 { 1052 {
1035 FT_UNUSED( face ); 1053 FT_UNUSED( face );
1036 1054
1037 loader->keywords_encountered |= T1_PRIVATE; 1055 loader->keywords_encountered |= T1_PRIVATE;
1038 } 1056 }
1039 1057
1040 1058
1059 /* return 1 in case of success */
1060
1041 static int 1061 static int
1042 read_binary_data( T1_Parser parser, 1062 read_binary_data( T1_Parser parser,
1043 FT_Long* size, 1063 FT_ULong* size,
1044 FT_Byte** base, 1064 FT_Byte** base,
1045 FT_Bool incremental ) 1065 FT_Bool incremental )
1046 { 1066 {
1047 FT_Byte* cur; 1067 FT_Byte* cur;
1048 FT_Byte* limit = parser->root.limit; 1068 FT_Byte* limit = parser->root.limit;
1049 1069
1050 1070
1051 /* the binary data has one of the following formats */ 1071 /* the binary data has one of the following formats */
1052 /* */ 1072 /* */
1053 /* `size' [white*] RD white ....... ND */ 1073 /* `size' [white*] RD white ....... ND */
(...skipping 11 matching lines...) Expand all
1065 1085
1066 T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ 1086 T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */
1067 1087
1068 /* there is only one whitespace char after the */ 1088 /* there is only one whitespace char after the */
1069 /* `RD' or `-|' token */ 1089 /* `RD' or `-|' token */
1070 *base = parser->root.cursor + 1; 1090 *base = parser->root.cursor + 1;
1071 1091
1072 if ( s >= 0 && s < limit - *base ) 1092 if ( s >= 0 && s < limit - *base )
1073 { 1093 {
1074 parser->root.cursor += s + 1; 1094 parser->root.cursor += s + 1;
1075 *size = s; 1095 *size = (FT_ULong)s;
1076 return !parser->root.error; 1096 return !parser->root.error;
1077 } 1097 }
1078 } 1098 }
1079 1099
1080 if( !incremental ) 1100 if( !incremental )
1081 { 1101 {
1082 FT_ERROR(( "read_binary_data: invalid size field\n" )); 1102 FT_ERROR(( "read_binary_data: invalid size field\n" ));
1083 parser->root.error = FT_THROW( Invalid_File_Format ); 1103 parser->root.error = FT_THROW( Invalid_File_Format );
1084 } 1104 }
1085 1105
(...skipping 10 matching lines...) Expand all
1096 { 1116 {
1097 T1_Parser parser = &loader->parser; 1117 T1_Parser parser = &loader->parser;
1098 FT_Matrix* matrix = &face->type1.font_matrix; 1118 FT_Matrix* matrix = &face->type1.font_matrix;
1099 FT_Vector* offset = &face->type1.font_offset; 1119 FT_Vector* offset = &face->type1.font_offset;
1100 FT_Face root = (FT_Face)&face->root; 1120 FT_Face root = (FT_Face)&face->root;
1101 FT_Fixed temp[6]; 1121 FT_Fixed temp[6];
1102 FT_Fixed temp_scale; 1122 FT_Fixed temp_scale;
1103 FT_Int result; 1123 FT_Int result;
1104 1124
1105 1125
1126 /* input is scaled by 1000 to accommodate default FontMatrix */
1106 result = T1_ToFixedArray( parser, 6, temp, 3 ); 1127 result = T1_ToFixedArray( parser, 6, temp, 3 );
1107 1128
1108 if ( result < 6 ) 1129 if ( result < 6 )
1109 { 1130 {
1110 parser->root.error = FT_THROW( Invalid_File_Format ); 1131 parser->root.error = FT_THROW( Invalid_File_Format );
1111 return; 1132 return;
1112 } 1133 }
1113 1134
1114 temp_scale = FT_ABS( temp[3] ); 1135 temp_scale = FT_ABS( temp[3] );
1115 1136
1116 if ( temp_scale == 0 ) 1137 if ( temp_scale == 0 )
1117 { 1138 {
1118 FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" )); 1139 FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
1119 parser->root.error = FT_THROW( Invalid_File_Format ); 1140 parser->root.error = FT_THROW( Invalid_File_Format );
1120 return; 1141 return;
1121 } 1142 }
1122 1143
1123 /* Set Units per EM based on FontMatrix values. We set the value to */ 1144 /* atypical case */
1124 /* 1000 / temp_scale, because temp_scale was already multiplied by */
1125 /* 1000 (in t1_tofixed, from psobjs.c). */
1126
1127 root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
1128
1129 /* we need to scale the values by 1.0/temp_scale */
1130 if ( temp_scale != 0x10000L ) 1145 if ( temp_scale != 0x10000L )
1131 { 1146 {
1147 /* set units per EM based on FontMatrix values */
1148 root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
1149
1132 temp[0] = FT_DivFix( temp[0], temp_scale ); 1150 temp[0] = FT_DivFix( temp[0], temp_scale );
1133 temp[1] = FT_DivFix( temp[1], temp_scale ); 1151 temp[1] = FT_DivFix( temp[1], temp_scale );
1134 temp[2] = FT_DivFix( temp[2], temp_scale ); 1152 temp[2] = FT_DivFix( temp[2], temp_scale );
1135 temp[4] = FT_DivFix( temp[4], temp_scale ); 1153 temp[4] = FT_DivFix( temp[4], temp_scale );
1136 temp[5] = FT_DivFix( temp[5], temp_scale ); 1154 temp[5] = FT_DivFix( temp[5], temp_scale );
1137 temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; 1155 temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
1138 } 1156 }
1139 1157
1140 matrix->xx = temp[0]; 1158 matrix->xx = temp[0];
1141 matrix->yx = temp[1]; 1159 matrix->yx = temp[1];
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 /* read the number of entries in the encoding; should be 256 */ 1201 /* read the number of entries in the encoding; should be 256 */
1184 if ( *cur == '[' ) 1202 if ( *cur == '[' )
1185 { 1203 {
1186 count = 256; 1204 count = 256;
1187 only_immediates = 1; 1205 only_immediates = 1;
1188 parser->root.cursor++; 1206 parser->root.cursor++;
1189 } 1207 }
1190 else 1208 else
1191 count = (FT_Int)T1_ToInt( parser ); 1209 count = (FT_Int)T1_ToInt( parser );
1192 1210
1211 /* only composite fonts (which we don't support) */
1212 /* can have larger values */
1213 if ( count > 256 )
1214 {
1215 FT_ERROR(( "parse_encoding: invalid encoding array size\n" ));
1216 parser->root.error = FT_THROW( Invalid_File_Format );
1217 return;
1218 }
1219
1193 T1_Skip_Spaces( parser ); 1220 T1_Skip_Spaces( parser );
1194 if ( parser->root.cursor >= limit ) 1221 if ( parser->root.cursor >= limit )
1195 return; 1222 return;
1196 1223
1224 /* PostScript happily allows overwriting of encoding arrays */
1225 if ( encode->char_index )
1226 {
1227 FT_FREE( encode->char_index );
1228 FT_FREE( encode->char_name );
1229 T1_Release_Table( char_table );
1230 }
1231
1197 /* we use a T1_Table to store our charnames */ 1232 /* we use a T1_Table to store our charnames */
1198 loader->num_chars = encode->num_chars = count; 1233 loader->num_chars = encode->num_chars = count;
1199 if ( FT_NEW_ARRAY( encode->char_index, count ) || 1234 if ( FT_NEW_ARRAY( encode->char_index, count ) ||
1200 FT_NEW_ARRAY( encode->char_name, count ) || 1235 FT_NEW_ARRAY( encode->char_name, count ) ||
1201 FT_SET_ERROR( psaux->ps_table_funcs->init( 1236 FT_SET_ERROR( psaux->ps_table_funcs->init(
1202 char_table, count, memory ) ) ) 1237 char_table, count, memory ) ) )
1203 { 1238 {
1204 parser->root.error = error; 1239 parser->root.error = error;
1205 return; 1240 return;
1206 } 1241 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 { 1313 {
1279 parser->root.error = FT_THROW( Unknown_File_Format ); 1314 parser->root.error = FT_THROW( Unknown_File_Format );
1280 return; 1315 return;
1281 } 1316 }
1282 } 1317 }
1283 1318
1284 cur = parser->root.cursor; 1319 cur = parser->root.cursor;
1285 1320
1286 if ( cur + 2 < limit && *cur == '/' && n < count ) 1321 if ( cur + 2 < limit && *cur == '/' && n < count )
1287 { 1322 {
1288 FT_PtrDist len; 1323 FT_UInt len;
1289 1324
1290 1325
1291 cur++; 1326 cur++;
1292 1327
1293 parser->root.cursor = cur; 1328 parser->root.cursor = cur;
1294 T1_Skip_PS_Token( parser ); 1329 T1_Skip_PS_Token( parser );
1295 if ( parser->root.cursor >= limit ) 1330 if ( parser->root.cursor >= limit )
1296 return; 1331 return;
1297 if ( parser->root.error ) 1332 if ( parser->root.error )
1298 return; 1333 return;
1299 1334
1300 len = parser->root.cursor - cur; 1335 len = (FT_UInt)( parser->root.cursor - cur );
1301 1336
1302 parser->root.error = T1_Add_Table( char_table, charcode, 1337 parser->root.error = T1_Add_Table( char_table, charcode,
1303 cur, len + 1 ); 1338 cur, len + 1 );
1304 if ( parser->root.error ) 1339 if ( parser->root.error )
1305 return; 1340 return;
1306 char_table->elements[charcode][len] = '\0'; 1341 char_table->elements[charcode][len] = '\0';
1307 1342
1308 n++; 1343 n++;
1309 } 1344 }
1310 else if ( only_immediates ) 1345 else if ( only_immediates )
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 if ( error ) 1435 if ( error )
1401 goto Fail; 1436 goto Fail;
1402 } 1437 }
1403 1438
1404 /* the format is simple: */ 1439 /* the format is simple: */
1405 /* */ 1440 /* */
1406 /* `index' + binary data */ 1441 /* `index' + binary data */
1407 /* */ 1442 /* */
1408 for (;;) 1443 for (;;)
1409 { 1444 {
1410 FT_Long idx, size; 1445 FT_Long idx;
1446 FT_ULong size;
1411 FT_Byte* base; 1447 FT_Byte* base;
1412 1448
1413 1449
1414 /* If we are out of data, or if the next token isn't `dup', */ 1450 /* If we are out of data, or if the next token isn't `dup', */
1415 /* we are done. */ 1451 /* we are done. */
1416 if ( parser->root.cursor + 4 >= parser->root.limit || 1452 if ( parser->root.cursor + 4 >= parser->root.limit ||
1417 ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) 1453 ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
1418 break; 1454 break;
1419 1455
1420 T1_Skip_PS_Token( parser ); /* `dup' */ 1456 T1_Skip_PS_Token( parser ); /* `dup' */
(...skipping 29 matching lines...) Expand all
1450 /* thanks to Tom Kacvinsky for pointing this out */ 1486 /* thanks to Tom Kacvinsky for pointing this out */
1451 /* */ 1487 /* */
1452 if ( face->type1.private_dict.lenIV >= 0 ) 1488 if ( face->type1.private_dict.lenIV >= 0 )
1453 { 1489 {
1454 FT_Byte* temp; 1490 FT_Byte* temp;
1455 1491
1456 1492
1457 /* some fonts define empty subr records -- this is not totally */ 1493 /* some fonts define empty subr records -- this is not totally */
1458 /* compliant to the specification (which says they should at */ 1494 /* compliant to the specification (which says they should at */
1459 /* least contain a `return'), but we support them anyway */ 1495 /* least contain a `return'), but we support them anyway */
1460 if ( size < face->type1.private_dict.lenIV ) 1496 if ( size < (FT_ULong)face->type1.private_dict.lenIV )
1461 { 1497 {
1462 error = FT_THROW( Invalid_File_Format ); 1498 error = FT_THROW( Invalid_File_Format );
1463 goto Fail; 1499 goto Fail;
1464 } 1500 }
1465 1501
1466 /* t1_decrypt() shouldn't write to base -- make temporary copy */ 1502 /* t1_decrypt() shouldn't write to base -- make temporary copy */
1467 if ( FT_ALLOC( temp, size ) ) 1503 if ( FT_ALLOC( temp, size ) )
1468 goto Fail; 1504 goto Fail;
1469 FT_MEM_COPY( temp, base, size ); 1505 FT_MEM_COPY( temp, base, size );
1470 psaux->t1_decrypt( temp, size, 4330 ); 1506 psaux->t1_decrypt( temp, size, 4330 );
1471 size -= face->type1.private_dict.lenIV; 1507 size -= (FT_ULong)face->type1.private_dict.lenIV;
1472 error = T1_Add_Table( table, (FT_Int)idx, 1508 error = T1_Add_Table( table, (FT_Int)idx,
1473 temp + face->type1.private_dict.lenIV, size ); 1509 temp + face->type1.private_dict.lenIV, size );
1474 FT_FREE( temp ); 1510 FT_FREE( temp );
1475 } 1511 }
1476 else 1512 else
1477 error = T1_Add_Table( table, (FT_Int)idx, base, size ); 1513 error = T1_Add_Table( table, (FT_Int)idx, base, size );
1478 if ( error ) 1514 if ( error )
1479 goto Fail; 1515 goto Fail;
1480 } 1516 }
1481 1517
(...skipping 16 matching lines...) Expand all
1498 { 1534 {
1499 T1_Parser parser = &loader->parser; 1535 T1_Parser parser = &loader->parser;
1500 PS_Table code_table = &loader->charstrings; 1536 PS_Table code_table = &loader->charstrings;
1501 PS_Table name_table = &loader->glyph_names; 1537 PS_Table name_table = &loader->glyph_names;
1502 PS_Table swap_table = &loader->swap_table; 1538 PS_Table swap_table = &loader->swap_table;
1503 FT_Memory memory = parser->root.memory; 1539 FT_Memory memory = parser->root.memory;
1504 FT_Error error; 1540 FT_Error error;
1505 1541
1506 PSAux_Service psaux = (PSAux_Service)face->psaux; 1542 PSAux_Service psaux = (PSAux_Service)face->psaux;
1507 1543
1508 FT_Byte* cur; 1544 FT_Byte* cur = parser->root.cursor;
1509 FT_Byte* limit = parser->root.limit; 1545 FT_Byte* limit = parser->root.limit;
1510 FT_Int n, num_glyphs; 1546 FT_Int n, num_glyphs;
1511 FT_UInt notdef_index = 0; 1547 FT_Int notdef_index = 0;
1512 FT_Byte notdef_found = 0; 1548 FT_Byte notdef_found = 0;
1513 1549
1514 1550
1515 num_glyphs = (FT_Int)T1_ToInt( parser ); 1551 num_glyphs = (FT_Int)T1_ToInt( parser );
1516 if ( num_glyphs < 0 ) 1552 if ( num_glyphs < 0 )
1517 { 1553 {
1518 error = FT_THROW( Invalid_File_Format ); 1554 error = FT_THROW( Invalid_File_Format );
1519 goto Fail; 1555 goto Fail;
1520 } 1556 }
1521 1557
1558 /* we certainly need more than 8 bytes per glyph */
1559 if ( num_glyphs > ( limit - cur ) >> 3 )
1560 {
1561 FT_TRACE0(( "parse_charstrings: adjusting number of glyphs"
1562 " (from %d to %d)\n",
1563 num_glyphs, ( limit - cur ) >> 3 ));
1564 num_glyphs = ( limit - cur ) >> 3;
1565 }
1566
1522 /* some fonts like Optima-Oblique not only define the /CharStrings */ 1567 /* some fonts like Optima-Oblique not only define the /CharStrings */
1523 /* array but access it also */ 1568 /* array but access it also */
1524 if ( num_glyphs == 0 || parser->root.error ) 1569 if ( num_glyphs == 0 || parser->root.error )
1525 return; 1570 return;
1526 1571
1527 /* initialize tables, leaving space for addition of .notdef, */ 1572 /* initialize tables, leaving space for addition of .notdef, */
1528 /* if necessary, and a few other glyphs to handle buggy */ 1573 /* if necessary, and a few other glyphs to handle buggy */
1529 /* fonts which have more glyphs than specified. */ 1574 /* fonts which have more glyphs than specified. */
1530 1575
1531 /* for some non-standard fonts like `Optima' which provides */ 1576 /* for some non-standard fonts like `Optima' which provides */
(...skipping 16 matching lines...) Expand all
1548 1593
1549 error = psaux->ps_table_funcs->init( swap_table, 4, memory ); 1594 error = psaux->ps_table_funcs->init( swap_table, 4, memory );
1550 if ( error ) 1595 if ( error )
1551 goto Fail; 1596 goto Fail;
1552 } 1597 }
1553 1598
1554 n = 0; 1599 n = 0;
1555 1600
1556 for (;;) 1601 for (;;)
1557 { 1602 {
1558 FT_Long size; 1603 FT_ULong size;
1559 FT_Byte* base; 1604 FT_Byte* base;
1560 1605
1561 1606
1562 /* the format is simple: */ 1607 /* the format is simple: */
1563 /* `/glyphname' + binary data */ 1608 /* `/glyphname' + binary data */
1564 1609
1565 T1_Skip_Spaces( parser ); 1610 T1_Skip_Spaces( parser );
1566 1611
1567 cur = parser->root.cursor; 1612 cur = parser->root.cursor;
1568 if ( cur >= limit ) 1613 if ( cur >= limit )
(...skipping 30 matching lines...) Expand all
1599 if ( parser->root.cursor >= limit ) 1644 if ( parser->root.cursor >= limit )
1600 { 1645 {
1601 error = FT_THROW( Invalid_File_Format ); 1646 error = FT_THROW( Invalid_File_Format );
1602 goto Fail; 1647 goto Fail;
1603 } 1648 }
1604 if ( parser->root.error ) 1649 if ( parser->root.error )
1605 return; 1650 return;
1606 1651
1607 if ( *cur == '/' ) 1652 if ( *cur == '/' )
1608 { 1653 {
1609 FT_PtrDist len; 1654 FT_UInt len;
1610 1655
1611 1656
1612 if ( cur + 2 >= limit ) 1657 if ( cur + 2 >= limit )
1613 { 1658 {
1614 error = FT_THROW( Invalid_File_Format ); 1659 error = FT_THROW( Invalid_File_Format );
1615 goto Fail; 1660 goto Fail;
1616 } 1661 }
1617 1662
1618 cur++; /* skip `/' */ 1663 cur++; /* skip `/' */
1619 len = parser->root.cursor - cur; 1664 len = (FT_UInt)( parser->root.cursor - cur );
1620 1665
1621 if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) ) 1666 if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
1622 return; 1667 return;
1623 1668
1624 /* for some non-standard fonts like `Optima' which provides */ 1669 /* for some non-standard fonts like `Optima' which provides */
1625 /* different outlines depending on the resolution it is */ 1670 /* different outlines depending on the resolution it is */
1626 /* possible to get here twice */ 1671 /* possible to get here twice */
1627 if ( loader->num_glyphs ) 1672 if ( loader->num_glyphs )
1628 continue; 1673 continue;
1629 1674
(...skipping 12 matching lines...) Expand all
1642 notdef_index = n; 1687 notdef_index = n;
1643 notdef_found = 1; 1688 notdef_found = 1;
1644 } 1689 }
1645 1690
1646 if ( face->type1.private_dict.lenIV >= 0 && 1691 if ( face->type1.private_dict.lenIV >= 0 &&
1647 n < num_glyphs + TABLE_EXTEND ) 1692 n < num_glyphs + TABLE_EXTEND )
1648 { 1693 {
1649 FT_Byte* temp; 1694 FT_Byte* temp;
1650 1695
1651 1696
1652 if ( size <= face->type1.private_dict.lenIV ) 1697 if ( size <= (FT_ULong)face->type1.private_dict.lenIV )
1653 { 1698 {
1654 error = FT_THROW( Invalid_File_Format ); 1699 error = FT_THROW( Invalid_File_Format );
1655 goto Fail; 1700 goto Fail;
1656 } 1701 }
1657 1702
1658 /* t1_decrypt() shouldn't write to base -- make temporary copy */ 1703 /* t1_decrypt() shouldn't write to base -- make temporary copy */
1659 if ( FT_ALLOC( temp, size ) ) 1704 if ( FT_ALLOC( temp, size ) )
1660 goto Fail; 1705 goto Fail;
1661 FT_MEM_COPY( temp, base, size ); 1706 FT_MEM_COPY( temp, base, size );
1662 psaux->t1_decrypt( temp, size, 4330 ); 1707 psaux->t1_decrypt( temp, size, 4330 );
1663 size -= face->type1.private_dict.lenIV; 1708 size -= (FT_ULong)face->type1.private_dict.lenIV;
1664 error = T1_Add_Table( code_table, n, 1709 error = T1_Add_Table( code_table, n,
1665 temp + face->type1.private_dict.lenIV, size ); 1710 temp + face->type1.private_dict.lenIV, size );
1666 FT_FREE( temp ); 1711 FT_FREE( temp );
1667 } 1712 }
1668 else 1713 else
1669 error = T1_Add_Table( code_table, n, base, size ); 1714 error = T1_Add_Table( code_table, n, base, size );
1670 if ( error ) 1715 if ( error )
1671 goto Fail; 1716 goto Fail;
1672 1717
1673 n++; 1718 n++;
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1831 T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, 1876 T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector,
1832 T1_FIELD_DICT_FONTDICT ) 1877 T1_FIELD_DICT_FONTDICT )
1833 T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, 1878 T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar,
1834 T1_FIELD_DICT_PRIVATE ) 1879 T1_FIELD_DICT_PRIVATE )
1835 #endif 1880 #endif
1836 1881
1837 { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } 1882 { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
1838 }; 1883 };
1839 1884
1840 1885
1841 #define T1_FIELD_COUNT \
1842 ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
1843
1844
1845 static FT_Error 1886 static FT_Error
1846 parse_dict( T1_Face face, 1887 parse_dict( T1_Face face,
1847 T1_Loader loader, 1888 T1_Loader loader,
1848 FT_Byte* base, 1889 FT_Byte* base,
1849 FT_Long size ) 1890 FT_ULong size )
1850 { 1891 {
1851 T1_Parser parser = &loader->parser; 1892 T1_Parser parser = &loader->parser;
1852 FT_Byte *limit, *start_binary = NULL; 1893 FT_Byte *limit, *start_binary = NULL;
1853 FT_Bool have_integer = 0; 1894 FT_Bool have_integer = 0;
1854 1895
1855 1896
1856 parser->root.cursor = base; 1897 parser->root.cursor = base;
1857 parser->root.limit = base + size; 1898 parser->root.limit = base + size;
1858 parser->root.error = FT_Err_Ok; 1899 parser->root.error = FT_Err_Ok;
1859 1900
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 goto Exit; 1936 goto Exit;
1896 have_integer = 1; 1937 have_integer = 1;
1897 } 1938 }
1898 1939
1899 /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ 1940 /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
1900 /* since those tokens are handled by parse_subrs and */ 1941 /* since those tokens are handled by parse_subrs and */
1901 /* parse_charstrings */ 1942 /* parse_charstrings */
1902 else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && 1943 else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
1903 have_integer ) 1944 have_integer )
1904 { 1945 {
1905 FT_Long s; 1946 FT_ULong s;
1906 FT_Byte* b; 1947 FT_Byte* b;
1907 1948
1908 1949
1909 parser->root.cursor = start_binary; 1950 parser->root.cursor = start_binary;
1910 if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) 1951 if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
1911 return FT_THROW( Invalid_File_Format ); 1952 return FT_THROW( Invalid_File_Format );
1912 have_integer = 0; 1953 have_integer = 0;
1913 } 1954 }
1914 1955
1915 else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && 1956 else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
1916 have_integer ) 1957 have_integer )
1917 { 1958 {
1918 FT_Long s; 1959 FT_ULong s;
1919 FT_Byte* b; 1960 FT_Byte* b;
1920 1961
1921 1962
1922 parser->root.cursor = start_binary; 1963 parser->root.cursor = start_binary;
1923 if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) 1964 if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
1924 return FT_THROW( Invalid_File_Format ); 1965 return FT_THROW( Invalid_File_Format );
1925 have_integer = 0; 1966 have_integer = 0;
1926 } 1967 }
1927 1968
1928 /* look for immediates */ 1969 /* look for immediates */
1929 else if ( *cur == '/' && cur + 2 < limit ) 1970 else if ( *cur == '/' && cur + 2 < limit )
1930 { 1971 {
1931 FT_PtrDist len; 1972 FT_UInt len;
1932 1973
1933 1974
1934 cur++; 1975 cur++;
1935 1976
1936 parser->root.cursor = cur; 1977 parser->root.cursor = cur;
1937 T1_Skip_PS_Token( parser ); 1978 T1_Skip_PS_Token( parser );
1938 if ( parser->root.error ) 1979 if ( parser->root.error )
1939 goto Exit; 1980 goto Exit;
1940 1981
1941 len = parser->root.cursor - cur; 1982 len = (FT_UInt)( parser->root.cursor - cur );
1942 1983
1943 if ( len > 0 && len < 22 && parser->root.cursor < limit ) 1984 if ( len > 0 && len < 22 && parser->root.cursor < limit )
1944 { 1985 {
1945 /* now compare the immediate name to the keyword table */ 1986 /* now compare the immediate name to the keyword table */
1946 T1_Field keyword = (T1_Field)t1_keywords; 1987 T1_Field keyword = (T1_Field)t1_keywords;
1947 1988
1948 1989
1949 for (;;) 1990 for (;;)
1950 { 1991 {
1951 FT_Byte* name; 1992 FT_Byte* name;
1952 1993
1953 1994
1954 name = (FT_Byte*)keyword->ident; 1995 name = (FT_Byte*)keyword->ident;
1955 if ( !name ) 1996 if ( !name )
1956 break; 1997 break;
1957 1998
1958 if ( cur[0] == name[0] && 1999 if ( cur[0] == name[0] &&
1959 len == (FT_PtrDist)ft_strlen( (const char *)name ) && 2000 len == ft_strlen( (const char *)name ) &&
1960 ft_memcmp( cur, name, len ) == 0 ) 2001 ft_memcmp( cur, name, len ) == 0 )
1961 { 2002 {
1962 /* We found it -- run the parsing callback! */ 2003 /* We found it -- run the parsing callback! */
1963 /* We record every instance of every field */ 2004 /* We record every instance of every field */
1964 /* (until we reach the base font of a */ 2005 /* (until we reach the base font of a */
1965 /* synthetic font) to deal adequately with */ 2006 /* synthetic font) to deal adequately with */
1966 /* multiple master fonts; this is also */ 2007 /* multiple master fonts; this is also */
1967 /* necessary because later PostScript */ 2008 /* necessary because later PostScript */
1968 /* definitions override earlier ones. */ 2009 /* definitions override earlier ones. */
1969 2010
1970 /* Once we encounter `FontDirectory' after */ 2011 /* Once we encounter `FontDirectory' after */
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
2205 2246
2206 loader.charstrings.init = 0; 2247 loader.charstrings.init = 0;
2207 type1->charstrings_block = loader.charstrings.block; 2248 type1->charstrings_block = loader.charstrings.block;
2208 type1->charstrings = loader.charstrings.elements; 2249 type1->charstrings = loader.charstrings.elements;
2209 type1->charstrings_len = loader.charstrings.lengths; 2250 type1->charstrings_len = loader.charstrings.lengths;
2210 2251
2211 /* we copy the glyph names `block' and `elements' fields; */ 2252 /* we copy the glyph names `block' and `elements' fields; */
2212 /* the `lengths' field must be released later */ 2253 /* the `lengths' field must be released later */
2213 type1->glyph_names_block = loader.glyph_names.block; 2254 type1->glyph_names_block = loader.glyph_names.block;
2214 type1->glyph_names = (FT_String**)loader.glyph_names.elements; 2255 type1->glyph_names = (FT_String**)loader.glyph_names.elements;
2215 loader.glyph_names.block = 0; 2256 loader.glyph_names.block = NULL;
2216 loader.glyph_names.elements = 0; 2257 loader.glyph_names.elements = NULL;
2217 2258
2218 /* we must now build type1.encoding when we have a custom array */ 2259 /* we must now build type1.encoding when we have a custom array */
2219 if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) 2260 if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
2220 { 2261 {
2221 FT_Int charcode, idx, min_char, max_char; 2262 FT_Int charcode, idx, min_char, max_char;
2222 FT_Byte* glyph_name; 2263 FT_Byte* glyph_name;
2223 2264
2224 2265
2225 /* OK, we do the following: for each element in the encoding */ 2266 /* OK, we do the following: for each element in the encoding */
2226 /* table, look up the index of the glyph having the same name */ 2267 /* table, look up the index of the glyph having the same name */
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2270 type1->encoding.num_chars = loader.num_chars; 2311 type1->encoding.num_chars = loader.num_chars;
2271 } 2312 }
2272 2313
2273 Exit: 2314 Exit:
2274 t1_done_loader( &loader ); 2315 t1_done_loader( &loader );
2275 return error; 2316 return error;
2276 } 2317 }
2277 2318
2278 2319
2279 /* END */ 2320 /* END */
OLDNEW
« no previous file with comments | « third_party/freetype/src/type1/t1load.h ('k') | third_party/freetype/src/type1/t1objs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698