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

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

Issue 23555005: Update freetype to the latest version of Android external/freetype (Closed) Base URL: https://chromium.googlesource.com/chromium/src/third_party/freetype.git@master
Patch Set: Created 7 years, 3 months 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/cffparse.h ('k') | src/cff/cffpic.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 /* cffparse.c */ 3 /* cffparse.c */
4 /* */ 4 /* */
5 /* CFF token stream parser (body) */ 5 /* CFF token stream parser (body) */
6 /* */ 6 /* */
7 /* Copyright 1996-2004, 2007-2011 by */ 7 /* Copyright 1996-2004, 2007-2011 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, */
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 FT_Error error = CFF_Err_Stack_Underflow; 453 FT_Error error = CFF_Err_Stack_Underflow;
454 454
455 455
456 if ( parser->top >= parser->stack + 6 ) 456 if ( parser->top >= parser->stack + 6 )
457 { 457 {
458 FT_Long scaling; 458 FT_Long scaling;
459 459
460 460
461 error = CFF_Err_Ok; 461 error = CFF_Err_Ok;
462 462
463 dict->has_font_matrix = TRUE;
464
463 /* We expect a well-formed font matrix, this is, the matrix elements */ 465 /* We expect a well-formed font matrix, this is, the matrix elements */
464 /* `xx' and `yy' are of approximately the same magnitude. To avoid */ 466 /* `xx' and `yy' are of approximately the same magnitude. To avoid */
465 /* loss of precision, we use the magnitude of element `xx' to scale */ 467 /* loss of precision, we use the magnitude of element `xx' to scale */
466 /* all other elements. The scaling factor is then contained in the */ 468 /* all other elements. The scaling factor is then contained in the */
467 /* `units_per_em' value. */ 469 /* `units_per_em' value. */
468 470
469 matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); 471 matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
470 472
471 scaling = -scaling; 473 scaling = -scaling;
472 474
(...skipping 18 matching lines...) Expand all
491 } 493 }
492 494
493 matrix->yx = cff_parse_fixed_scaled( data++, scaling ); 495 matrix->yx = cff_parse_fixed_scaled( data++, scaling );
494 matrix->xy = cff_parse_fixed_scaled( data++, scaling ); 496 matrix->xy = cff_parse_fixed_scaled( data++, scaling );
495 matrix->yy = cff_parse_fixed_scaled( data++, scaling ); 497 matrix->yy = cff_parse_fixed_scaled( data++, scaling );
496 offset->x = cff_parse_fixed_scaled( data++, scaling ); 498 offset->x = cff_parse_fixed_scaled( data++, scaling );
497 offset->y = cff_parse_fixed_scaled( data, scaling ); 499 offset->y = cff_parse_fixed_scaled( data, scaling );
498 500
499 *upm = power_tens[scaling]; 501 *upm = power_tens[scaling];
500 502
501 FT_TRACE4(( " font matrix: [%f %f %f %f]\n", 503 FT_TRACE4(( " [%f %f %f %f %f %f]\n",
502 (double)matrix->xx / *upm / 65536, 504 (double)matrix->xx / *upm / 65536,
503 (double)matrix->xy / *upm / 65536, 505 (double)matrix->xy / *upm / 65536,
504 (double)matrix->yx / *upm / 65536, 506 (double)matrix->yx / *upm / 65536,
505 (double)matrix->yy / *upm / 65536 )); 507 (double)matrix->yy / *upm / 65536,
508 (double)offset->x / *upm / 65536,
509 (double)offset->y / *upm / 65536 ));
506 } 510 }
507 511
508 Exit: 512 Exit:
509 return error; 513 return error;
510 } 514 }
511 515
512 516
513 static FT_Error 517 static FT_Error
514 cff_parse_font_bbox( CFF_Parser parser ) 518 cff_parse_font_bbox( CFF_Parser parser )
515 { 519 {
516 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 520 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
517 FT_BBox* bbox = &dict->font_bbox; 521 FT_BBox* bbox = &dict->font_bbox;
518 FT_Byte** data = parser->stack; 522 FT_Byte** data = parser->stack;
519 FT_Error error; 523 FT_Error error;
520 524
521 525
522 error = CFF_Err_Stack_Underflow; 526 error = CFF_Err_Stack_Underflow;
523 527
524 if ( parser->top >= parser->stack + 4 ) 528 if ( parser->top >= parser->stack + 4 )
525 { 529 {
526 bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 530 bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
527 bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 531 bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
528 bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); 532 bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
529 bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); 533 bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) );
530 error = CFF_Err_Ok; 534 error = CFF_Err_Ok;
531 535
532 FT_TRACE4(( " bbox: [%d %d %d %d]\n", 536 FT_TRACE4(( " [%d %d %d %d]\n",
533 bbox->xMin / 65536, 537 bbox->xMin / 65536,
534 bbox->yMin / 65536, 538 bbox->yMin / 65536,
535 bbox->xMax / 65536, 539 bbox->xMax / 65536,
536 bbox->yMax / 65536 )); 540 bbox->yMax / 65536 ));
537 } 541 }
538 542
539 return error; 543 return error;
540 } 544 }
541 545
542 546
543 static FT_Error 547 static FT_Error
544 cff_parse_private_dict( CFF_Parser parser ) 548 cff_parse_private_dict( CFF_Parser parser )
545 { 549 {
546 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 550 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
547 FT_Byte** data = parser->stack; 551 FT_Byte** data = parser->stack;
548 FT_Error error; 552 FT_Error error;
549 553
550 554
551 error = CFF_Err_Stack_Underflow; 555 error = CFF_Err_Stack_Underflow;
552 556
553 if ( parser->top >= parser->stack + 2 ) 557 if ( parser->top >= parser->stack + 2 )
554 { 558 {
555 dict->private_size = cff_parse_num( data++ ); 559 dict->private_size = cff_parse_num( data++ );
556 dict->private_offset = cff_parse_num( data ); 560 dict->private_offset = cff_parse_num( data );
561 FT_TRACE4(( " %lu %lu\n",
562 dict->private_size, dict->private_offset ));
563
557 error = CFF_Err_Ok; 564 error = CFF_Err_Ok;
558 } 565 }
559 566
560 return error; 567 return error;
561 } 568 }
562 569
563 570
564 static FT_Error 571 static FT_Error
565 cff_parse_cid_ros( CFF_Parser parser ) 572 cff_parse_cid_ros( CFF_Parser parser )
566 { 573 {
567 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 574 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
568 FT_Byte** data = parser->stack; 575 FT_Byte** data = parser->stack;
569 FT_Error error; 576 FT_Error error;
570 577
571 578
572 error = CFF_Err_Stack_Underflow; 579 error = CFF_Err_Stack_Underflow;
573 580
574 if ( parser->top >= parser->stack + 3 ) 581 if ( parser->top >= parser->stack + 3 )
575 { 582 {
576 dict->cid_registry = (FT_UInt)cff_parse_num( data++ ); 583 dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
577 dict->cid_ordering = (FT_UInt)cff_parse_num( data++ ); 584 dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
578 if ( **data == 30 ) 585 if ( **data == 30 )
579 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); 586 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
580 dict->cid_supplement = cff_parse_num( data ); 587 dict->cid_supplement = cff_parse_num( data );
581 if ( dict->cid_supplement < 0 ) 588 if ( dict->cid_supplement < 0 )
582 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", 589 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
583 dict->cid_supplement )); 590 dict->cid_supplement ));
584 error = CFF_Err_Ok; 591 error = CFF_Err_Ok;
585 592
586 FT_TRACE4(( " ROS: registry sid %d, ordering sid %d, supplement %d\n", 593 FT_TRACE4(( " %d %d %d\n",
587 dict->cid_registry, 594 dict->cid_registry,
588 dict->cid_ordering, 595 dict->cid_ordering,
589 dict->cid_supplement )); 596 dict->cid_supplement ));
590 } 597 }
591 598
592 return error; 599 return error;
593 } 600 }
594 601
595 602
596 #define CFF_FIELD_NUM( code, name ) \ 603 #define CFF_FIELD_NUM( code, name, id ) \
597 CFF_FIELD( code, name, cff_kind_num ) 604 CFF_FIELD( code, name, id, cff_kind_num )
598 #define CFF_FIELD_FIXED( code, name ) \ 605 #define CFF_FIELD_FIXED( code, name, id ) \
599 CFF_FIELD( code, name, cff_kind_fixed ) 606 CFF_FIELD( code, name, id, cff_kind_fixed )
600 #define CFF_FIELD_FIXED_1000( code, name ) \ 607 #define CFF_FIELD_FIXED_1000( code, name, id ) \
601 CFF_FIELD( code, name, cff_kind_fixed_thousand ) 608 CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
602 #define CFF_FIELD_STRING( code, name ) \ 609 #define CFF_FIELD_STRING( code, name, id ) \
603 CFF_FIELD( code, name, cff_kind_string ) 610 CFF_FIELD( code, name, id, cff_kind_string )
604 #define CFF_FIELD_BOOL( code, name ) \ 611 #define CFF_FIELD_BOOL( code, name, id ) \
605 CFF_FIELD( code, name, cff_kind_bool ) 612 CFF_FIELD( code, name, id, cff_kind_bool )
606 #define CFF_FIELD_DELTA( code, name, max ) \
607 CFF_FIELD( code, name, cff_kind_delta )
608 613
609 #define CFFCODE_TOPDICT 0x1000 614 #define CFFCODE_TOPDICT 0x1000
610 #define CFFCODE_PRIVATE 0x2000 615 #define CFFCODE_PRIVATE 0x2000
611 616
617
612 #ifndef FT_CONFIG_OPTION_PIC 618 #ifndef FT_CONFIG_OPTION_PIC
613 619
614 #define CFF_FIELD_CALLBACK( code, name ) \ 620
615 { \ 621 #undef CFF_FIELD
616 cff_kind_callback, \ 622 #undef CFF_FIELD_DELTA
617 code | CFFCODE, \ 623
618 0, 0, \ 624
619 cff_parse_ ## name, \ 625 #ifndef FT_DEBUG_LEVEL_TRACE
620 0, 0 \ 626
627
628 #define CFF_FIELD_CALLBACK( code, name, id ) \
629 { \
630 cff_kind_callback, \
631 code | CFFCODE, \
632 0, 0, \
633 cff_parse_ ## name, \
634 0, 0 \
621 }, 635 },
622 636
623 #undef CFF_FIELD 637 #define CFF_FIELD( code, name, id, kind ) \
624 #define CFF_FIELD( code, name, kind ) \ 638 { \
625 { \ 639 kind, \
626 kind, \ 640 code | CFFCODE, \
627 code | CFFCODE, \ 641 FT_FIELD_OFFSET( name ), \
628 FT_FIELD_OFFSET( name ), \ 642 FT_FIELD_SIZE( name ), \
629 FT_FIELD_SIZE( name ), \ 643 0, 0, 0 \
630 0, 0, 0 \
631 }, 644 },
632 645
633 #undef CFF_FIELD_DELTA 646 #define CFF_FIELD_DELTA( code, name, max, id ) \
634 #define CFF_FIELD_DELTA( code, name, max ) \ 647 { \
635 { \ 648 cff_kind_delta, \
636 cff_kind_delta, \ 649 code | CFFCODE, \
637 code | CFFCODE, \ 650 FT_FIELD_OFFSET( name ), \
638 FT_FIELD_OFFSET( name ), \ 651 FT_FIELD_SIZE_DELTA( name ), \
639 FT_FIELD_SIZE_DELTA( name ), \ 652 0, \
640 0, \ 653 max, \
641 max, \ 654 FT_FIELD_OFFSET( num_ ## name ) \
642 FT_FIELD_OFFSET( num_ ## name ) \ 655 },
643 },
644 656
645 static const CFF_Field_Handler cff_field_handlers[] = 657 static const CFF_Field_Handler cff_field_handlers[] =
646 { 658 {
647 659
648 #include "cfftoken.h" 660 #include "cfftoken.h"
649 661
650 { 0, 0, 0, 0, 0, 0, 0 } 662 { 0, 0, 0, 0, 0, 0, 0 }
651 }; 663 };
652 664
653 665
666 #else /* FT_DEBUG_LEVEL_TRACE */
667
668
669
670 #define CFF_FIELD_CALLBACK( code, name, id ) \
671 { \
672 cff_kind_callback, \
673 code | CFFCODE, \
674 0, 0, \
675 cff_parse_ ## name, \
676 0, 0, \
677 id \
678 },
679
680 #define CFF_FIELD( code, name, id, kind ) \
681 { \
682 kind, \
683 code | CFFCODE, \
684 FT_FIELD_OFFSET( name ), \
685 FT_FIELD_SIZE( name ), \
686 0, 0, 0, \
687 id \
688 },
689
690 #define CFF_FIELD_DELTA( code, name, max, id ) \
691 { \
692 cff_kind_delta, \
693 code | CFFCODE, \
694 FT_FIELD_OFFSET( name ), \
695 FT_FIELD_SIZE_DELTA( name ), \
696 0, \
697 max, \
698 FT_FIELD_OFFSET( num_ ## name ), \
699 id \
700 },
701
702 static const CFF_Field_Handler cff_field_handlers[] =
703 {
704
705 #include "cfftoken.h"
706
707 { 0, 0, 0, 0, 0, 0, 0, 0 }
708 };
709
710
711 #endif /* FT_DEBUG_LEVEL_TRACE */
712
713
654 #else /* FT_CONFIG_OPTION_PIC */ 714 #else /* FT_CONFIG_OPTION_PIC */
655 715
656 void FT_Destroy_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler * clazz) 716
717 void
718 FT_Destroy_Class_cff_field_handlers( FT_Library library,
719 CFF_Field_Handler* clazz )
657 { 720 {
658 FT_Memory memory = library->memory; 721 FT_Memory memory = library->memory;
722
723
659 if ( clazz ) 724 if ( clazz )
660 FT_FREE( clazz ); 725 FT_FREE( clazz );
661 } 726 }
662 727
663 FT_Error FT_Create_Class_cff_field_handlers(FT_Library library, CFF_Field_Hand ler** output_class) 728
729 FT_Error
730 FT_Create_Class_cff_field_handlers( FT_Library library,
731 CFF_Field_Handler** output_class )
664 { 732 {
665 CFF_Field_Handler* clazz; 733 CFF_Field_Handler* clazz;
666 FT_Error error; 734 FT_Error error;
667 FT_Memory memory = library->memory; 735 FT_Memory memory = library->memory;
668 int i=0; 736
737 int i = 0;
738
669 739
670 #undef CFF_FIELD 740 #undef CFF_FIELD
741 #define CFF_FIELD( code, name, id, kind ) i++;
671 #undef CFF_FIELD_DELTA 742 #undef CFF_FIELD_DELTA
743 #define CFF_FIELD_DELTA( code, name, max, id ) i++;
672 #undef CFF_FIELD_CALLBACK 744 #undef CFF_FIELD_CALLBACK
673 #define CFF_FIELD_CALLBACK( code, name ) i++; 745 #define CFF_FIELD_CALLBACK( code, name, id ) i++;
674 #define CFF_FIELD( code, name, kind ) i++; 746
675 #define CFF_FIELD_DELTA( code, name, max ) i++; 747 #include "cfftoken.h"
676 748
677 #include "cfftoken.h" 749 i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
678 i++;/*{ 0, 0, 0, 0, 0, 0, 0 }*/ 750
679 751 if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
680 if ( FT_ALLOC( clazz, sizeof(CFF_Field_Handler)*i ) )
681 return error; 752 return error;
682 753
683 i=0; 754 i = 0;
684 #undef CFF_FIELD 755
685 #undef CFF_FIELD_DELTA 756
757 #ifndef FT_DEBUG_LEVEL_TRACE
758
759
686 #undef CFF_FIELD_CALLBACK 760 #undef CFF_FIELD_CALLBACK
687 761 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
688 #define CFF_FIELD_CALLBACK( code_, name_ ) \ 762 clazz[i].kind = cff_kind_callback; \
689 clazz[i].kind = cff_kind_callback; \ 763 clazz[i].code = code_ | CFFCODE; \
690 clazz[i].code = code_ | CFFCODE; \ 764 clazz[i].offset = 0; \
691 clazz[i].offset = 0; \ 765 clazz[i].size = 0; \
692 clazz[i].size = 0; \ 766 clazz[i].reader = cff_parse_ ## name_; \
693 clazz[i].reader = cff_parse_ ## name_; \ 767 clazz[i].array_max = 0; \
694 clazz[i].array_max = 0; \ 768 clazz[i].count_offset = 0; \
695 clazz[i].count_offset = 0; \ 769 i++;
696 i++;
697 770
698 #undef CFF_FIELD 771 #undef CFF_FIELD
699 #define CFF_FIELD( code_, name_, kind_ ) \ 772 #define CFF_FIELD( code_, name_, id_, kind_ ) \
700 clazz[i].kind = kind_; \ 773 clazz[i].kind = kind_; \
701 clazz[i].code = code_ | CFFCODE; \ 774 clazz[i].code = code_ | CFFCODE; \
702 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 775 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
703 clazz[i].size = FT_FIELD_SIZE( name_ ); \ 776 clazz[i].size = FT_FIELD_SIZE( name_ ); \
704 clazz[i].reader = 0; \ 777 clazz[i].reader = 0; \
705 clazz[i].array_max = 0; \ 778 clazz[i].array_max = 0; \
706 clazz[i].count_offset = 0; \ 779 clazz[i].count_offset = 0; \
707 i++; \ 780 i++; \
708 781
709 #undef CFF_FIELD_DELTA 782 #undef CFF_FIELD_DELTA
710 #define CFF_FIELD_DELTA( code_, name_, max_ ) \ 783 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
711 clazz[i].kind = cff_kind_delta; \ 784 clazz[i].kind = cff_kind_delta; \
712 clazz[i].code = code_ | CFFCODE; \ 785 clazz[i].code = code_ | CFFCODE; \
713 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ 786 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
714 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ 787 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
715 clazz[i].reader = 0; \ 788 clazz[i].reader = 0; \
716 clazz[i].array_max = max_; \ 789 clazz[i].array_max = max_; \
717 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ 790 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
718 i++; 791 i++;
719 792
720 #include "cfftoken.h" 793 #include "cfftoken.h"
721 794
722 clazz[i].kind = 0; 795 clazz[i].kind = 0;
723 clazz[i].code = 0; 796 clazz[i].code = 0;
724 clazz[i].offset = 0; 797 clazz[i].offset = 0;
725 clazz[i].size = 0; 798 clazz[i].size = 0;
726 clazz[i].reader = 0; 799 clazz[i].reader = 0;
727 clazz[i].array_max = 0; 800 clazz[i].array_max = 0;
728 clazz[i].count_offset = 0; 801 clazz[i].count_offset = 0;
729 802
803
804 #else /* FT_DEBUG_LEVEL_TRACE */
805
806
807 #undef CFF_FIELD_CALLBACK
808 #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
809 clazz[i].kind = cff_kind_callback; \
810 clazz[i].code = code_ | CFFCODE; \
811 clazz[i].offset = 0; \
812 clazz[i].size = 0; \
813 clazz[i].reader = cff_parse_ ## name_; \
814 clazz[i].array_max = 0; \
815 clazz[i].count_offset = 0; \
816 clazz[i].id = id_; \
817 i++;
818
819 #undef CFF_FIELD
820 #define CFF_FIELD( code_, name_, id_, kind_ ) \
821 clazz[i].kind = kind_; \
822 clazz[i].code = code_ | CFFCODE; \
823 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
824 clazz[i].size = FT_FIELD_SIZE( name_ ); \
825 clazz[i].reader = 0; \
826 clazz[i].array_max = 0; \
827 clazz[i].count_offset = 0; \
828 clazz[i].id = id_; \
829 i++; \
830
831 #undef CFF_FIELD_DELTA
832 #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
833 clazz[i].kind = cff_kind_delta; \
834 clazz[i].code = code_ | CFFCODE; \
835 clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
836 clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
837 clazz[i].reader = 0; \
838 clazz[i].array_max = max_; \
839 clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
840 clazz[i].id = id_; \
841 i++;
842
843 #include "cfftoken.h"
844
845 clazz[i].kind = 0;
846 clazz[i].code = 0;
847 clazz[i].offset = 0;
848 clazz[i].size = 0;
849 clazz[i].reader = 0;
850 clazz[i].array_max = 0;
851 clazz[i].count_offset = 0;
852 clazz[i].id = 0;
853
854
855 #endif /* FT_DEBUG_LEVEL_TRACE */
856
857
730 *output_class = clazz; 858 *output_class = clazz;
859
731 return CFF_Err_Ok; 860 return CFF_Err_Ok;
732 } 861 }
733 862
734 863
735 #endif /* FT_CONFIG_OPTION_PIC */ 864 #endif /* FT_CONFIG_OPTION_PIC */
736 865
737 866
738 FT_LOCAL_DEF( FT_Error ) 867 FT_LOCAL_DEF( FT_Error )
739 cff_parser_run( CFF_Parser parser, 868 cff_parser_run( CFF_Parser parser,
740 FT_Byte* start, 869 FT_Byte* start,
741 FT_Byte* limit ) 870 FT_Byte* limit )
742 { 871 {
743 FT_Byte* p = start; 872 FT_Byte* p = start;
744 FT_Error error = CFF_Err_Ok; 873 FT_Error error = CFF_Err_Ok;
745 FT_Library library = parser->library; 874 FT_Library library = parser->library;
746 FT_UNUSED(library); 875 FT_UNUSED( library );
747 876
748 877
749 parser->top = parser->stack; 878 parser->top = parser->stack;
750 parser->start = start; 879 parser->start = start;
751 parser->limit = limit; 880 parser->limit = limit;
752 parser->cursor = start; 881 parser->cursor = start;
753 882
754 while ( p < limit ) 883 while ( p < limit )
755 { 884 {
756 FT_UInt v = *p; 885 FT_UInt v = *p;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 946
818 for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) 947 for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ )
819 { 948 {
820 if ( field->code == (FT_Int)code ) 949 if ( field->code == (FT_Int)code )
821 { 950 {
822 /* we found our field's handler; read it */ 951 /* we found our field's handler; read it */
823 FT_Long val; 952 FT_Long val;
824 FT_Byte* q = (FT_Byte*)parser->object + field->offset; 953 FT_Byte* q = (FT_Byte*)parser->object + field->offset;
825 954
826 955
956 #ifdef FT_DEBUG_LEVEL_TRACE
957 FT_TRACE4(( " %s", field->id ));
958 #endif
959
827 /* check that we have enough arguments -- except for */ 960 /* check that we have enough arguments -- except for */
828 /* delta encoded arrays, which can be empty */ 961 /* delta encoded arrays, which can be empty */
829 if ( field->kind != cff_kind_delta && num_args < 1 ) 962 if ( field->kind != cff_kind_delta && num_args < 1 )
830 goto Stack_Underflow; 963 goto Stack_Underflow;
831 964
832 switch ( field->kind ) 965 switch ( field->kind )
833 { 966 {
834 case cff_kind_bool: 967 case cff_kind_bool:
835 case cff_kind_string: 968 case cff_kind_string:
836 case cff_kind_num: 969 case cff_kind_num:
(...skipping 18 matching lines...) Expand all
855 *(FT_Short*)q = (FT_Short)val; 988 *(FT_Short*)q = (FT_Short)val;
856 break; 989 break;
857 990
858 case (32 / FT_CHAR_BIT): 991 case (32 / FT_CHAR_BIT):
859 *(FT_Int32*)q = (FT_Int)val; 992 *(FT_Int32*)q = (FT_Int)val;
860 break; 993 break;
861 994
862 default: /* for 64-bit systems */ 995 default: /* for 64-bit systems */
863 *(FT_Long*)q = val; 996 *(FT_Long*)q = val;
864 } 997 }
998
999 #ifdef FT_DEBUG_LEVEL_TRACE
1000 switch ( field->kind )
1001 {
1002 case cff_kind_bool:
1003 FT_TRACE4(( " %s\n", val ? "true" : "false" ));
1004 break;
1005
1006 case cff_kind_string:
1007 FT_TRACE4(( " %ld (SID)\n", val ));
1008 break;
1009
1010 case cff_kind_num:
1011 FT_TRACE4(( " %ld\n", val ));
1012 break;
1013
1014 case cff_kind_fixed:
1015 FT_TRACE4(( " %f\n", (double)val / 65536 ));
1016 break;
1017
1018 case cff_kind_fixed_thousand:
1019 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
1020
1021 default:
1022 ; /* never reached */
1023 }
1024 #endif
1025
865 break; 1026 break;
866 1027
867 case cff_kind_delta: 1028 case cff_kind_delta:
868 { 1029 {
869 FT_Byte* qcount = (FT_Byte*)parser->object + 1030 FT_Byte* qcount = (FT_Byte*)parser->object +
870 field->count_offset; 1031 field->count_offset;
871 1032
872 FT_Byte** data = parser->stack; 1033 FT_Byte** data = parser->stack;
873 1034
874 1035
875 if ( num_args > field->array_max ) 1036 if ( num_args > field->array_max )
876 num_args = field->array_max; 1037 num_args = field->array_max;
877 1038
1039 FT_TRACE4(( " [" ));
1040
878 /* store count */ 1041 /* store count */
879 *qcount = (FT_Byte)num_args; 1042 *qcount = (FT_Byte)num_args;
880 1043
881 val = 0; 1044 val = 0;
882 while ( num_args > 0 ) 1045 while ( num_args > 0 )
883 { 1046 {
884 val += cff_parse_num( data++ ); 1047 val += cff_parse_num( data++ );
885 switch ( field->size ) 1048 switch ( field->size )
886 { 1049 {
887 case (8 / FT_CHAR_BIT): 1050 case (8 / FT_CHAR_BIT):
888 *(FT_Byte*)q = (FT_Byte)val; 1051 *(FT_Byte*)q = (FT_Byte)val;
889 break; 1052 break;
890 1053
891 case (16 / FT_CHAR_BIT): 1054 case (16 / FT_CHAR_BIT):
892 *(FT_Short*)q = (FT_Short)val; 1055 *(FT_Short*)q = (FT_Short)val;
893 break; 1056 break;
894 1057
895 case (32 / FT_CHAR_BIT): 1058 case (32 / FT_CHAR_BIT):
896 *(FT_Int32*)q = (FT_Int)val; 1059 *(FT_Int32*)q = (FT_Int)val;
897 break; 1060 break;
898 1061
899 default: /* for 64-bit systems */ 1062 default: /* for 64-bit systems */
900 *(FT_Long*)q = val; 1063 *(FT_Long*)q = val;
901 } 1064 }
902 1065
1066 FT_TRACE4(( " %ld", val ));
1067
903 q += field->size; 1068 q += field->size;
904 num_args--; 1069 num_args--;
905 } 1070 }
1071
1072 FT_TRACE4(( "]\n" ));
906 } 1073 }
907 break; 1074 break;
908 1075
909 default: /* callback */ 1076 default: /* callback */
910 error = field->reader( parser ); 1077 error = field->reader( parser );
911 if ( error ) 1078 if ( error )
912 goto Exit; 1079 goto Exit;
913 } 1080 }
914 goto Found; 1081 goto Found;
915 } 1082 }
(...skipping 20 matching lines...) Expand all
936 error = CFF_Err_Invalid_Argument; 1103 error = CFF_Err_Invalid_Argument;
937 goto Exit; 1104 goto Exit;
938 1105
939 Syntax_Error: 1106 Syntax_Error:
940 error = CFF_Err_Invalid_Argument; 1107 error = CFF_Err_Invalid_Argument;
941 goto Exit; 1108 goto Exit;
942 } 1109 }
943 1110
944 1111
945 /* END */ 1112 /* END */
OLDNEW
« no previous file with comments | « src/cff/cffparse.h ('k') | src/cff/cffpic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698