637 * that are pushed in result. 638 * 639 * Opcodes which have a varying number of parameters in the data stream 640 * (NPUSHB, NPUSHW) are handled specially; they have a negative value in 641 * the `opcode_length' table, and the value in `Pop_Push_Count' is set 642 * to zero. 643 * 644 */ 645 646 647 #undef PACK 648 #define PACK( x, y ) ( ( x << 4 ) | y ) 649 650 651 static 652 const FT_Byte Pop_Push_Count[256] = 653 { 654 /* opcodes are gathered in groups of 16 */ 655 /* please keep the spaces as they are */ 656 657 /* SVTCA y */ PACK( 0, 0 ), 658 /* SVTCA x */ PACK( 0, 0 ), 659 /* SPvTCA y */ PACK( 0, 0 ), 660 /* SPvTCA x */ PACK( 0, 0 ), 661 /* SFvTCA y */ PACK( 0, 0 ), 662 /* SFvTCA x */ PACK( 0, 0 ), 663 /* SPvTL // */ PACK( 2, 0 ), 664 /* SPvTL + */ PACK( 2, 0 ), 665 /* SFvTL // */ PACK( 2, 0 ), 666 /* SFvTL + */ PACK( 2, 0 ), 667 /* SPvFS */ PACK( 2, 0 ), 668 /* SFvFS */ PACK( 2, 0 ), 669 /* GPv */ PACK( 0, 2 ), 670 /* GFv */ PACK( 0, 2 ), 671 /* SFvTPv */ PACK( 0, 0 ), 672 /* ISECT */ PACK( 5, 0 ), 673 674 /* SRP0 */ PACK( 1, 0 ), 675 /* SRP1 */ PACK( 1, 0 ), 676 /* SRP2 */ PACK( 1, 0 ), 677 /* SZP0 */ PACK( 1, 0 ), 678 /* SZP1 */ PACK( 1, 0 ), 679 /* SZP2 */ PACK( 1, 0 ), 680 /* SZPS */ PACK( 1, 0 ), 681 /* SLOOP */ PACK( 1, 0 ), 682 /* RTG */ PACK( 0, 0 ), 683 /* RTHG */ PACK( 0, 0 ), 684 /* SMD */ PACK( 1, 0 ), 685 /* ELSE */ PACK( 0, 0 ), 686 /* JMPR */ PACK( 1, 0 ), 687 /* SCvTCi */ PACK( 1, 0 ), 688 /* SSwCi */ PACK( 1, 0 ), 689 /* SSW */ PACK( 1, 0 ), 690 691 /* DUP */ PACK( 1, 2 ), 692 /* POP */ PACK( 1, 0 ), 693 /* CLEAR */ PACK( 0, 0 ), 694 /* SWAP */ PACK( 2, 2 ), 695 /* DEPTH */ PACK( 0, 1 ), 696 /* CINDEX */ PACK( 1, 1 ), 697 /* MINDEX */ PACK( 1, 0 ), 698 /* AlignPTS */ PACK( 2, 0 ), 699 /* INS_$28 */ PACK( 0, 0 ), 700 /* UTP */ PACK( 1, 0 ), 701 /* LOOPCALL */ PACK( 2, 0 ), 702 /* CALL */ PACK( 1, 0 ), 703 /* FDEF */ PACK( 1, 0 ), 704 /* ENDF */ PACK( 0, 0 ), 705 /* MDAP[0] */ PACK( 1, 0 ), 706 /* MDAP[1] */ PACK( 1, 0 ), 707 708 /* IUP[0] */ PACK( 0, 0 ), 709 /* IUP[1] */ PACK( 0, 0 ), 710 /* SHP[0] */ PACK( 0, 0 ), /* loops */ 711 /* SHP[1] */ PACK( 0, 0 ), /* loops */ 712 /* SHC[0] */ PACK( 1, 0 ), 713 /* SHC[1] */ PACK( 1, 0 ), 714 /* SHZ[0] */ PACK( 1, 0 ), 715 /* SHZ[1] */ PACK( 1, 0 ), 716 /* SHPIX */ PACK( 1, 0 ), /* loops */ 717 /* IP */ PACK( 0, 0 ), /* loops */ 718 /* MSIRP[0] */ PACK( 2, 0 ), 719 /* MSIRP[1] */ PACK( 2, 0 ), 720 /* AlignRP */ PACK( 0, 0 ), /* loops */ 721 /* RTDG */ PACK( 0, 0 ), 722 /* MIAP[0] */ PACK( 2, 0 ), 723 /* MIAP[1] */ PACK( 2, 0 ), 724 725 /* NPushB */ PACK( 0, 0 ), 726 /* NPushW */ PACK( 0, 0 ), 727 /* WS */ PACK( 2, 0 ), 728 /* RS */ PACK( 1, 1 ), 729 /* WCvtP */ PACK( 2, 0 ), 730 /* RCvt */ PACK( 1, 1 ), 731 /* GC[0] */ PACK( 1, 1 ), 732 /* GC[1] */ PACK( 1, 1 ), 733 /* SCFS */ PACK( 2, 0 ), 734 /* MD[0] */ PACK( 2, 1 ), 735 /* MD[1] */ PACK( 2, 1 ), 736 /* MPPEM */ PACK( 0, 1 ), 737 /* MPS */ PACK( 0, 1 ), 738 /* FlipON */ PACK( 0, 0 ), 739 /* FlipOFF */ PACK( 0, 0 ), 740 /* DEBUG */ PACK( 1, 0 ), 741 742 /* LT */ PACK( 2, 1 ), 743 /* LTEQ */ PACK( 2, 1 ), 744 /* GT */ PACK( 2, 1 ), 745 /* GTEQ */ PACK( 2, 1 ), 746 /* EQ */ PACK( 2, 1 ), 747 /* NEQ */ PACK( 2, 1 ), 748 /* ODD */ PACK( 1, 1 ), 749 /* EVEN */ PACK( 1, 1 ), 750 /* IF */ PACK( 1, 0 ), 751 /* EIF */ PACK( 0, 0 ), 752 /* AND */ PACK( 2, 1 ), 753 /* OR */ PACK( 2, 1 ), 754 /* NOT */ PACK( 1, 1 ), 755 /* DeltaP1 */ PACK( 1, 0 ), 756 /* SDB */ PACK( 1, 0 ), 757 /* SDS */ PACK( 1, 0 ), 758 759 /* ADD */ PACK( 2, 1 ), 760 /* SUB */ PACK( 2, 1 ), 761 /* DIV */ PACK( 2, 1 ), 762 /* MUL */ PACK( 2, 1 ), 763 /* ABS */ PACK( 1, 1 ), 764 /* NEG */ PACK( 1, 1 ), 765 /* FLOOR */ PACK( 1, 1 ), 766 /* CEILING */ PACK( 1, 1 ), 767 /* ROUND[0] */ PACK( 1, 1 ), 768 /* ROUND[1] */ PACK( 1, 1 ), 769 /* ROUND[2] */ PACK( 1, 1 ), 770 /* ROUND[3] */ PACK( 1, 1 ), 771 /* NROUND[0] */ PACK( 1, 1 ), 772 /* NROUND[1] */ PACK( 1, 1 ), 773 /* NROUND[2] */ PACK( 1, 1 ), 774 /* NROUND[3] */ PACK( 1, 1 ), 775 776 /* WCvtF */ PACK( 2, 0 ), 777 /* DeltaP2 */ PACK( 1, 0 ), 778 /* DeltaP3 */ PACK( 1, 0 ), 779 /* DeltaCn[0] */ PACK( 1, 0 ), 780 /* DeltaCn[1] */ PACK( 1, 0 ), 781 /* DeltaCn[2] */ PACK( 1, 0 ), 782 /* SROUND */ PACK( 1, 0 ), 783 /* S45Round */ PACK( 1, 0 ), 784 /* JROT */ PACK( 2, 0 ), 785 /* JROF */ PACK( 2, 0 ), 786 /* ROFF */ PACK( 0, 0 ), 787 /* INS_$7B */ PACK( 0, 0 ), 788 /* RUTG */ PACK( 0, 0 ), 789 /* RDTG */ PACK( 0, 0 ), 790 /* SANGW */ PACK( 1, 0 ), 791 /* AA */ PACK( 1, 0 ), 792 793 /* FlipPT */ PACK( 0, 0 ), /* loops */ 794 /* FlipRgON */ PACK( 2, 0 ), 795 /* FlipRgOFF */ PACK( 2, 0 ), 796 /* INS_$83 */ PACK( 0, 0 ), 797 /* INS_$84 */ PACK( 0, 0 ), 798 /* ScanCTRL */ PACK( 1, 0 ), 799 /* SDPvTL[0] */ PACK( 2, 0 ), 800 /* SDPvTL[1] */ PACK( 2, 0 ), 801 /* GetINFO */ PACK( 1, 1 ), 802 /* IDEF */ PACK( 1, 0 ), 803 /* ROLL */ PACK( 3, 3 ), 804 /* MAX */ PACK( 2, 1 ), 805 /* MIN */ PACK( 2, 1 ), 806 /* ScanTYPE */ PACK( 1, 0 ), 807 /* InstCTRL */ PACK( 2, 0 ), 808 /* INS_$8F */ PACK( 0, 0 ), 809 810 /* INS_$90 */ PACK( 0, 0 ), 811 /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ 812 /* GETDATA */ PACK( 0, 1 ), 813 /* INS_$93 */ PACK( 0, 0 ), 814 /* INS_$94 */ PACK( 0, 0 ), 815 /* INS_$95 */ PACK( 0, 0 ), 816 /* INS_$96 */ PACK( 0, 0 ), 817 /* INS_$97 */ PACK( 0, 0 ), 818 /* INS_$98 */ PACK( 0, 0 ), 819 /* INS_$99 */ PACK( 0, 0 ), 820 /* INS_$9A */ PACK( 0, 0 ), 821 /* INS_$9B */ PACK( 0, 0 ), 822 /* INS_$9C */ PACK( 0, 0 ), 823 /* INS_$9D */ PACK( 0, 0 ), 824 /* INS_$9E */ PACK( 0, 0 ), 825 /* INS_$9F */ PACK( 0, 0 ), 826 827 /* INS_$A0 */ PACK( 0, 0 ), 828 /* INS_$A1 */ PACK( 0, 0 ), 829 /* INS_$A2 */ PACK( 0, 0 ), 830 /* INS_$A3 */ PACK( 0, 0 ), 831 /* INS_$A4 */ PACK( 0, 0 ), 832 /* INS_$A5 */ PACK( 0, 0 ), 833 /* INS_$A6 */ PACK( 0, 0 ), 834 /* INS_$A7 */ PACK( 0, 0 ), 835 /* INS_$A8 */ PACK( 0, 0 ), 836 /* INS_$A9 */ PACK( 0, 0 ), 837 /* INS_$AA */ PACK( 0, 0 ), 838 /* INS_$AB */ PACK( 0, 0 ), 839 /* INS_$AC */ PACK( 0, 0 ), 840 /* INS_$AD */ PACK( 0, 0 ), 841 /* INS_$AE */ PACK( 0, 0 ), 842 /* INS_$AF */ PACK( 0, 0 ), 843 844 /* PushB[0] */ PACK( 0, 1 ), 845 /* PushB[1] */ PACK( 0, 2 ), 846 /* PushB[2] */ PACK( 0, 3 ), 847 /* PushB[3] */ PACK( 0, 4 ), 848 /* PushB[4] */ PACK( 0, 5 ), 849 /* PushB[5] */ PACK( 0, 6 ), 850 /* PushB[6] */ PACK( 0, 7 ), 851 /* PushB[7] */ PACK( 0, 8 ), 852 /* PushW[0] */ PACK( 0, 1 ), 853 /* PushW[1] */ PACK( 0, 2 ), 854 /* PushW[2] */ PACK( 0, 3 ), 855 /* PushW[3] */ PACK( 0, 4 ), 856 /* PushW[4] */ PACK( 0, 5 ), 857 /* PushW[5] */ PACK( 0, 6 ), 858 /* PushW[6] */ PACK( 0, 7 ), 859 /* PushW[7] */ PACK( 0, 8 ), 860 861 /* MDRP[00] */ PACK( 1, 0 ), 862 /* MDRP[01] */ PACK( 1, 0 ), 863 /* MDRP[02] */ PACK( 1, 0 ), 864 /* MDRP[03] */ PACK( 1, 0 ), 865 /* MDRP[04] */ PACK( 1, 0 ), 866 /* MDRP[05] */ PACK( 1, 0 ), 867 /* MDRP[06] */ PACK( 1, 0 ), 868 /* MDRP[07] */ PACK( 1, 0 ), 869 /* MDRP[08] */ PACK( 1, 0 ), 870 /* MDRP[09] */ PACK( 1, 0 ), 871 /* MDRP[10] */ PACK( 1, 0 ), 872 /* MDRP[11] */ PACK( 1, 0 ), 873 /* MDRP[12] */ PACK( 1, 0 ), 874 /* MDRP[13] */ PACK( 1, 0 ), 875 /* MDRP[14] */ PACK( 1, 0 ), 876 /* MDRP[15] */ PACK( 1, 0 ), 877 878 /* MDRP[16] */ PACK( 1, 0 ), 879 /* MDRP[17] */ PACK( 1, 0 ), 880 /* MDRP[18] */ PACK( 1, 0 ), 881 /* MDRP[19] */ PACK( 1, 0 ), 882 /* MDRP[20] */ PACK( 1, 0 ), 883 /* MDRP[21] */ PACK( 1, 0 ), 884 /* MDRP[22] */ PACK( 1, 0 ), 885 /* MDRP[23] */ PACK( 1, 0 ), 886 /* MDRP[24] */ PACK( 1, 0 ), 887 /* MDRP[25] */ PACK( 1, 0 ), 888 /* MDRP[26] */ PACK( 1, 0 ), 889 /* MDRP[27] */ PACK( 1, 0 ), 890 /* MDRP[28] */ PACK( 1, 0 ), 891 /* MDRP[29] */ PACK( 1, 0 ), 892 /* MDRP[30] */ PACK( 1, 0 ), 893 /* MDRP[31] */ PACK( 1, 0 ), 894 895 /* MIRP[00] */ PACK( 2, 0 ), 896 /* MIRP[01] */ PACK( 2, 0 ), 897 /* MIRP[02] */ PACK( 2, 0 ), 898 /* MIRP[03] */ PACK( 2, 0 ), 899 /* MIRP[04] */ PACK( 2, 0 ), 900 /* MIRP[05] */ PACK( 2, 0 ), 901 /* MIRP[06] */ PACK( 2, 0 ), 902 /* MIRP[07] */ PACK( 2, 0 ), 903 /* MIRP[08] */ PACK( 2, 0 ), 904 /* MIRP[09] */ PACK( 2, 0 ), 905 /* MIRP[10] */ PACK( 2, 0 ), 906 /* MIRP[11] */ PACK( 2, 0 ), 907 /* MIRP[12] */ PACK( 2, 0 ), 908 /* MIRP[13] */ PACK( 2, 0 ), 909 /* MIRP[14] */ PACK( 2, 0 ), 910 /* MIRP[15] */ PACK( 2, 0 ), 911 912 /* MIRP[16] */ PACK( 2, 0 ), 913 /* MIRP[17] */ PACK( 2, 0 ), 914 /* MIRP[18] */ PACK( 2, 0 ), 915 /* MIRP[19] */ PACK( 2, 0 ), 916 /* MIRP[20] */ PACK( 2, 0 ), 917 /* MIRP[21] */ PACK( 2, 0 ), 918 /* MIRP[22] */ PACK( 2, 0 ), 919 /* MIRP[23] */ PACK( 2, 0 ), 920 /* MIRP[24] */ PACK( 2, 0 ), 921 /* MIRP[25] */ PACK( 2, 0 ), 922 /* MIRP[26] */ PACK( 2, 0 ), 923 /* MIRP[27] */ PACK( 2, 0 ), 924 /* MIRP[28] */ PACK( 2, 0 ), 925 /* MIRP[29] */ PACK( 2, 0 ), 926 /* MIRP[30] */ PACK( 2, 0 ), 927 /* MIRP[31] */ PACK( 2, 0 ) 928 }; 929 930 931 #ifdef FT_DEBUG_LEVEL_TRACE 932 933 /* the first hex digit gives the length of the opcode name; the space */ 934 /* after the digit is here just to increase readability of the source */ 935 /* code */ 936 937 static 938 const char* const opcode_name[256] = 939 { 940 "7 SVTCA y", 941 "7 SVTCA x", 942 "8 SPvTCA y", 943 "8 SPvTCA x", 944 "8 SFvTCA y", 945 "8 SFvTCA x", 946 "8 SPvTL ||", 947 "7 SPvTL +", 948 "8 SFvTL ||", 949 "7 SFvTL +", 950 "5 SPvFS", 951 "5 SFvFS", 952 "3 GPv", 953 "3 GFv", 954 "6 SFvTPv", 955 "5 ISECT", 956 957 "4 SRP0", 958 "4 SRP1", 959 "4 SRP2", 960 "4 SZP0", 961 "4 SZP1", 962 "4 SZP2", 963 "4 SZPS", 964 "5 SLOOP", 965 "3 RTG", 966 "4 RTHG", 967 "3 SMD", 968 "4 ELSE", 969 "4 JMPR", 970 "6 SCvTCi", 971 "5 SSwCi", 972 "3 SSW", 973 974 "3 DUP", 975 "3 POP", 976 "5 CLEAR", 977 "4 SWAP", 978 "5 DEPTH", 979 "6 CINDEX", 980 "6 MINDEX", 981 "8 AlignPTS", 982 "7 INS_$28", 983 "3 UTP", 984 "8 LOOPCALL", 985 "4 CALL", 986 "4 FDEF", 987 "4 ENDF", 988 "7 MDAP[0]", 989 "7 MDAP[1]", 990 991 "6 IUP[0]", 992 "6 IUP[1]", 993 "6 SHP[0]", 994 "6 SHP[1]", 995 "6 SHC[0]", 996 "6 SHC[1]", 997 "6 SHZ[0]", 998 "6 SHZ[1]", 999 "5 SHPIX", 1000 "2 IP", 1001 "8 MSIRP[0]", 1002 "8 MSIRP[1]", 1003 "7 AlignRP", 1004 "4 RTDG", 1005 "7 MIAP[0]", 1006 "7 MIAP[1]", 1007 1008 "6 NPushB", 1009 "6 NPushW", 1010 "2 WS", 1011 "2 RS", 1012 "5 WCvtP", 1013 "4 RCvt", 1014 "5 GC[0]", 1015 "5 GC[1]", 1016 "4 SCFS", 1017 "5 MD[0]", 1018 "5 MD[1]", 1019 "5 MPPEM", 1020 "3 MPS", 1021 "6 FlipON", 1022 "7 FlipOFF", 1023 "5 DEBUG", 1024 1025 "2 LT", 1026 "4 LTEQ", 1027 "2 GT", 1028 "4 GTEQ", 1029 "2 EQ", 1030 "3 NEQ", 1031 "3 ODD", 1032 "4 EVEN", 1033 "2 IF", 1034 "3 EIF", 1035 "3 AND", 1036 "2 OR", 1037 "3 NOT", 1038 "7 DeltaP1", 1039 "3 SDB", 1040 "3 SDS", 1041 1042 "3 ADD", 1043 "3 SUB", 1044 "3 DIV", 1045 "3 MUL", 1046 "3 ABS", 1047 "3 NEG", 1048 "5 FLOOR", 1049 "7 CEILING", 1050 "8 ROUND[0]", 1051 "8 ROUND[1]", 1052 "8 ROUND[2]", 1053 "8 ROUND[3]", 1054 "9 NROUND[0]", 1055 "9 NROUND[1]", 1056 "9 NROUND[2]", 1057 "9 NROUND[3]", 1058 1059 "5 WCvtF", 1060 "7 DeltaP2", 1061 "7 DeltaP3", 1062 "A DeltaCn[0]", 1063 "A DeltaCn[1]", 1064 "A DeltaCn[2]", 1065 "6 SROUND", 1066 "8 S45Round", 1067 "4 JROT", 1068 "4 JROF", 1069 "4 ROFF", 1070 "7 INS_$7B", 1071 "4 RUTG", 1072 "4 RDTG", 1073 "5 SANGW", 1074 "2 AA", 1075 1076 "6 FlipPT", 1077 "8 FlipRgON", 1078 "9 FlipRgOFF", 1079 "7 INS_$83", 1080 "7 INS_$84", 1081 "8 ScanCTRL", 1082 "9 SDPvTL[0]", 1083 "9 SDPvTL[1]", 1084 "7 GetINFO", 1085 "4 IDEF", 1086 "4 ROLL", 1087 "3 MAX", 1088 "3 MIN", 1089 "8 ScanTYPE", 1090 "8 InstCTRL", 1091 "7 INS_$8F", 1092 1093 "7 INS_$90", 1094 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 1095 "6 GETVAR", 1096 "7 GETDATA", 1097 #else 1098 "7 INS_$91", 1099 "7 INS_$92", 1100 #endif 1101 "7 INS_$93", 1102 "7 INS_$94", 1103 "7 INS_$95", 1104 "7 INS_$96", 1105 "7 INS_$97", 1106 "7 INS_$98", 1107 "7 INS_$99", 1108 "7 INS_$9A", 1109 "7 INS_$9B", 1110 "7 INS_$9C", 1111 "7 INS_$9D", 1112 "7 INS_$9E", 1113 "7 INS_$9F", 1114 1115 "7 INS_$A0", 1116 "7 INS_$A1", 1117 "7 INS_$A2", 1118 "7 INS_$A3", 1119 "7 INS_$A4", 1120 "7 INS_$A5", 1121 "7 INS_$A6", 1122 "7 INS_$A7", 1123 "7 INS_$A8", 1124 "7 INS_$A9", 1125 "7 INS_$AA", 1126 "7 INS_$AB", 1127 "7 INS_$AC", 1128 "7 INS_$AD", 1129 "7 INS_$AE", 1130 "7 INS_$AF", 1131 1132 "8 PushB[0]", 1133 "8 PushB[1]", 1134 "8 PushB[2]", 1135 "8 PushB[3]", 1136 "8 PushB[4]", 1137 "8 PushB[5]", 1138 "8 PushB[6]", 1139 "8 PushB[7]", 1140 "8 PushW[0]", 1141 "8 PushW[1]", 1142 "8 PushW[2]", 1143 "8 PushW[3]", 1144 "8 PushW[4]", 1145 "8 PushW[5]", 1146 "8 PushW[6]", 1147 "8 PushW[7]", 1148 1149 "7 MDRP[G]", 1150 "7 MDRP[B]", 1151 "7 MDRP[W]", 1152 "7 MDRP[?]", 1153 "8 MDRP[rG]", 1154 "8 MDRP[rB]", 1155 "8 MDRP[rW]", 1156 "8 MDRP[r?]", 1157 "8 MDRP[mG]", 1158 "8 MDRP[mB]", 1159 "8 MDRP[mW]", 1160 "8 MDRP[m?]", 1161 "9 MDRP[mrG]", 1162 "9 MDRP[mrB]", 1163 "9 MDRP[mrW]", 1164 "9 MDRP[mr?]", 1165 1166 "8 MDRP[pG]", 1167 "8 MDRP[pB]", 1168 "8 MDRP[pW]", 1169 "8 MDRP[p?]", 1170 "9 MDRP[prG]", 1171 "9 MDRP[prB]", 1172 "9 MDRP[prW]", 1173 "9 MDRP[pr?]", 1174 "9 MDRP[pmG]", 1175 "9 MDRP[pmB]", 1176 "9 MDRP[pmW]", 1177 "9 MDRP[pm?]", 1178 "A MDRP[pmrG]", 1179 "A MDRP[pmrB]", 1180 "A MDRP[pmrW]", 1181 "A MDRP[pmr?]", 1182 1183 "7 MIRP[G]", 1184 "7 MIRP[B]", 1185 "7 MIRP[W]", 1186 "7 MIRP[?]", 1187 "8 MIRP[rG]", 1188 "8 MIRP[rB]", 1189 "8 MIRP[rW]", 1190 "8 MIRP[r?]", 1191 "8 MIRP[mG]", 1192 "8 MIRP[mB]", 1193 "8 MIRP[mW]", 1194 "8 MIRP[m?]", 1195 "9 MIRP[mrG]", 1196 "9 MIRP[mrB]", 1197 "9 MIRP[mrW]", 1198 "9 MIRP[mr?]", 1199 1200 "8 MIRP[pG]", 1201 "8 MIRP[pB]", 1202 "8 MIRP[pW]", 1203 "8 MIRP[p?]", 1204 "9 MIRP[prG]", 1205 "9 MIRP[prB]", 1206 "9 MIRP[prW]", 1207 "9 MIRP[pr?]", 1208 "9 MIRP[pmG]", 1209 "9 MIRP[pmB]", 1210 "9 MIRP[pmW]", 1211 "9 MIRP[pm?]", 1212 "A MIRP[pmrG]", 1213 "A MIRP[pmrB]", 1214 "A MIRP[pmrW]", 1215 "A MIRP[pmr?]" 1216 }; 1217 1218 #endif /* FT_DEBUG_LEVEL_TRACE */ 1219 1220 1221 static 1222 const FT_Char opcode_length[256] = 1223 { 1224 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1225 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1226 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1227 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1228 1229 -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1230 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1231 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1232 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1233 1234 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1235 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1645 1646 /* NOTE: Because the last instruction of a program may be a CALL */ 1647 /* which will return to the first byte *after* the code */ 1648 /* range, we test for aIP <= Size, instead of aIP < Size. */ 1649 1650 if ( aIP > range->size ) 1651 { 1652 exc->error = FT_THROW( Code_Overflow ); 1653 return FAILURE; 1654 } 1655 1656 exc->code = range->base; 1657 exc->codeSize = range->size; 1658 exc->IP = aIP; 1659 exc->curRange = aRange; 1660 1661 return SUCCESS; 1662 } 1663 1664 1665 /************************************************************************** 1666 * 1667 * @Function: 1668 * Direct_Move 1669 * 1670 * @Description: 1671 * Moves a point by a given distance along the freedom vector. The 1672 * point will be `touched'. 1673 * 1674 * @Input: 1675 * point :: 1676 * The index of the point to move. 1677 * 1678 * distance :: 1679 * The distance to apply. 1680 * 1681 * @InOut: 1682 * zone :: 1683 * The affected glyph zone. 1684 * 1869 FT_UShort point, 1870 FT_F26Dot6 distance ) 1871 { 1872 FT_UNUSED( exc ); 1873 1874 zone->org[point].x = ADD_LONG( zone->org[point].x, distance ); 1875 } 1876 1877 1878 static void 1879 Direct_Move_Orig_Y( TT_ExecContext exc, 1880 TT_GlyphZone zone, 1881 FT_UShort point, 1882 FT_F26Dot6 distance ) 1883 { 1884 FT_UNUSED( exc ); 1885 1886 zone->org[point].y = ADD_LONG( zone->org[point].y, distance ); 1887 } 1888 1889 1890 /************************************************************************** 1891 * 1892 * @Function: 1893 * Round_None 1894 * 1895 * @Description: 1896 * Does not round, but adds engine compensation. 1897 * 1898 * @Input: 1899 * distance :: 1900 * The distance (not) to round. 1901 * 1902 * compensation :: 1903 * The engine compensation. 1904 * 1905 * @Return: 1906 * The compensated distance. 1907 * 1908 * @Note: 1909 * The TrueType specification says very few about the relationship 1910 * between rounding and engine compensation. However, it seems from 1911 * the description of super round that we should add the compensation 1912 * before rounding. 1913 */ 1914 static FT_F26Dot6 1915 Round_None( TT_ExecContext exc, 1916 FT_F26Dot6 distance, 1917 FT_F26Dot6 compensation ) 1918 { 1919 FT_F26Dot6 val; 1920 1921 FT_UNUSED( exc ); 1922 1923 1924 if ( distance >= 0 ) 1925 { 1926 val = ADD_LONG( distance, compensation ); 1927 if ( val < 0 ) 1928 val = 0; 1929 } 1930 else 1931 { 1932 val = SUB_LONG( distance, compensation ); | 637 * that are pushed in result. 638 * 639 * Opcodes which have a varying number of parameters in the data stream 640 * (NPUSHB, NPUSHW) are handled specially; they have a negative value in 641 * the `opcode_length' table, and the value in `Pop_Push_Count' is set 642 * to zero. 643 * 644 */ 645 646 647 #undef PACK 648 #define PACK( x, y ) ( ( x << 4 ) | y ) 649 650 651 static 652 const FT_Byte Pop_Push_Count[256] = 653 { 654 /* opcodes are gathered in groups of 16 */ 655 /* please keep the spaces as they are */ 656 657 /* 0x00 */ 658 /* SVTCA[0] */ PACK( 0, 0 ), 659 /* SVTCA[1] */ PACK( 0, 0 ), 660 /* SPVTCA[0] */ PACK( 0, 0 ), 661 /* SPVTCA[1] */ PACK( 0, 0 ), 662 /* SFVTCA[0] */ PACK( 0, 0 ), 663 /* SFVTCA[1] */ PACK( 0, 0 ), 664 /* SPVTL[0] */ PACK( 2, 0 ), 665 /* SPVTL[1] */ PACK( 2, 0 ), 666 /* SFVTL[0] */ PACK( 2, 0 ), 667 /* SFVTL[1] */ PACK( 2, 0 ), 668 /* SPVFS */ PACK( 2, 0 ), 669 /* SFVFS */ PACK( 2, 0 ), 670 /* GPV */ PACK( 0, 2 ), 671 /* GFV */ PACK( 0, 2 ), 672 /* SFVTPV */ PACK( 0, 0 ), 673 /* ISECT */ PACK( 5, 0 ), 674 675 /* 0x10 */ 676 /* SRP0 */ PACK( 1, 0 ), 677 /* SRP1 */ PACK( 1, 0 ), 678 /* SRP2 */ PACK( 1, 0 ), 679 /* SZP0 */ PACK( 1, 0 ), 680 /* SZP1 */ PACK( 1, 0 ), 681 /* SZP2 */ PACK( 1, 0 ), 682 /* SZPS */ PACK( 1, 0 ), 683 /* SLOOP */ PACK( 1, 0 ), 684 /* RTG */ PACK( 0, 0 ), 685 /* RTHG */ PACK( 0, 0 ), 686 /* SMD */ PACK( 1, 0 ), 687 /* ELSE */ PACK( 0, 0 ), 688 /* JMPR */ PACK( 1, 0 ), 689 /* SCVTCI */ PACK( 1, 0 ), 690 /* SSWCI */ PACK( 1, 0 ), 691 /* SSW */ PACK( 1, 0 ), 692 693 /* 0x20 */ 694 /* DUP */ PACK( 1, 2 ), 695 /* POP */ PACK( 1, 0 ), 696 /* CLEAR */ PACK( 0, 0 ), 697 /* SWAP */ PACK( 2, 2 ), 698 /* DEPTH */ PACK( 0, 1 ), 699 /* CINDEX */ PACK( 1, 1 ), 700 /* MINDEX */ PACK( 1, 0 ), 701 /* ALIGNPTS */ PACK( 2, 0 ), 702 /* INS_$28 */ PACK( 0, 0 ), 703 /* UTP */ PACK( 1, 0 ), 704 /* LOOPCALL */ PACK( 2, 0 ), 705 /* CALL */ PACK( 1, 0 ), 706 /* FDEF */ PACK( 1, 0 ), 707 /* ENDF */ PACK( 0, 0 ), 708 /* MDAP[0] */ PACK( 1, 0 ), 709 /* MDAP[1] */ PACK( 1, 0 ), 710 711 /* 0x30 */ 712 /* IUP[0] */ PACK( 0, 0 ), 713 /* IUP[1] */ PACK( 0, 0 ), 714 /* SHP[0] */ PACK( 0, 0 ), /* loops */ 715 /* SHP[1] */ PACK( 0, 0 ), /* loops */ 716 /* SHC[0] */ PACK( 1, 0 ), 717 /* SHC[1] */ PACK( 1, 0 ), 718 /* SHZ[0] */ PACK( 1, 0 ), 719 /* SHZ[1] */ PACK( 1, 0 ), 720 /* SHPIX */ PACK( 1, 0 ), /* loops */ 721 /* IP */ PACK( 0, 0 ), /* loops */ 722 /* MSIRP[0] */ PACK( 2, 0 ), 723 /* MSIRP[1] */ PACK( 2, 0 ), 724 /* ALIGNRP */ PACK( 0, 0 ), /* loops */ 725 /* RTDG */ PACK( 0, 0 ), 726 /* MIAP[0] */ PACK( 2, 0 ), 727 /* MIAP[1] */ PACK( 2, 0 ), 728 729 /* 0x40 */ 730 /* NPUSHB */ PACK( 0, 0 ), 731 /* NPUSHW */ PACK( 0, 0 ), 732 /* WS */ PACK( 2, 0 ), 733 /* RS */ PACK( 1, 1 ), 734 /* WCVTP */ PACK( 2, 0 ), 735 /* RCVT */ PACK( 1, 1 ), 736 /* GC[0] */ PACK( 1, 1 ), 737 /* GC[1] */ PACK( 1, 1 ), 738 /* SCFS */ PACK( 2, 0 ), 739 /* MD[0] */ PACK( 2, 1 ), 740 /* MD[1] */ PACK( 2, 1 ), 741 /* MPPEM */ PACK( 0, 1 ), 742 /* MPS */ PACK( 0, 1 ), 743 /* FLIPON */ PACK( 0, 0 ), 744 /* FLIPOFF */ PACK( 0, 0 ), 745 /* DEBUG */ PACK( 1, 0 ), 746 747 /* 0x50 */ 748 /* LT */ PACK( 2, 1 ), 749 /* LTEQ */ PACK( 2, 1 ), 750 /* GT */ PACK( 2, 1 ), 751 /* GTEQ */ PACK( 2, 1 ), 752 /* EQ */ PACK( 2, 1 ), 753 /* NEQ */ PACK( 2, 1 ), 754 /* ODD */ PACK( 1, 1 ), 755 /* EVEN */ PACK( 1, 1 ), 756 /* IF */ PACK( 1, 0 ), 757 /* EIF */ PACK( 0, 0 ), 758 /* AND */ PACK( 2, 1 ), 759 /* OR */ PACK( 2, 1 ), 760 /* NOT */ PACK( 1, 1 ), 761 /* DELTAP1 */ PACK( 1, 0 ), 762 /* SDB */ PACK( 1, 0 ), 763 /* SDS */ PACK( 1, 0 ), 764 765 /* 0x60 */ 766 /* ADD */ PACK( 2, 1 ), 767 /* SUB */ PACK( 2, 1 ), 768 /* DIV */ PACK( 2, 1 ), 769 /* MUL */ PACK( 2, 1 ), 770 /* ABS */ PACK( 1, 1 ), 771 /* NEG */ PACK( 1, 1 ), 772 /* FLOOR */ PACK( 1, 1 ), 773 /* CEILING */ PACK( 1, 1 ), 774 /* ROUND[0] */ PACK( 1, 1 ), 775 /* ROUND[1] */ PACK( 1, 1 ), 776 /* ROUND[2] */ PACK( 1, 1 ), 777 /* ROUND[3] */ PACK( 1, 1 ), 778 /* NROUND[0] */ PACK( 1, 1 ), 779 /* NROUND[1] */ PACK( 1, 1 ), 780 /* NROUND[2] */ PACK( 1, 1 ), 781 /* NROUND[3] */ PACK( 1, 1 ), 782 783 /* 0x70 */ 784 /* WCVTF */ PACK( 2, 0 ), 785 /* DELTAP2 */ PACK( 1, 0 ), 786 /* DELTAP3 */ PACK( 1, 0 ), 787 /* DELTAC1 */ PACK( 1, 0 ), 788 /* DELTAC2 */ PACK( 1, 0 ), 789 /* DELTAC3 */ PACK( 1, 0 ), 790 /* SROUND */ PACK( 1, 0 ), 791 /* S45ROUND */ PACK( 1, 0 ), 792 /* JROT */ PACK( 2, 0 ), 793 /* JROF */ PACK( 2, 0 ), 794 /* ROFF */ PACK( 0, 0 ), 795 /* INS_$7B */ PACK( 0, 0 ), 796 /* RUTG */ PACK( 0, 0 ), 797 /* RDTG */ PACK( 0, 0 ), 798 /* SANGW */ PACK( 1, 0 ), 799 /* AA */ PACK( 1, 0 ), 800 801 /* 0x80 */ 802 /* FLIPPT */ PACK( 0, 0 ), /* loops */ 803 /* FLIPRGON */ PACK( 2, 0 ), 804 /* FLIPRGOFF */ PACK( 2, 0 ), 805 /* INS_$83 */ PACK( 0, 0 ), 806 /* INS_$84 */ PACK( 0, 0 ), 807 /* SCANCTRL */ PACK( 1, 0 ), 808 /* SDPVTL[0] */ PACK( 2, 0 ), 809 /* SDPVTL[1] */ PACK( 2, 0 ), 810 /* GETINFO */ PACK( 1, 1 ), 811 /* IDEF */ PACK( 1, 0 ), 812 /* ROLL */ PACK( 3, 3 ), 813 /* MAX */ PACK( 2, 1 ), 814 /* MIN */ PACK( 2, 1 ), 815 /* SCANTYPE */ PACK( 1, 0 ), 816 /* INSTCTRL */ PACK( 2, 0 ), 817 /* INS_$8F */ PACK( 0, 0 ), 818 819 /* 0x90 */ 820 /* INS_$90 */ PACK( 0, 0 ), 821 /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ 822 /* GETDATA */ PACK( 0, 1 ), 823 /* INS_$93 */ PACK( 0, 0 ), 824 /* INS_$94 */ PACK( 0, 0 ), 825 /* INS_$95 */ PACK( 0, 0 ), 826 /* INS_$96 */ PACK( 0, 0 ), 827 /* INS_$97 */ PACK( 0, 0 ), 828 /* INS_$98 */ PACK( 0, 0 ), 829 /* INS_$99 */ PACK( 0, 0 ), 830 /* INS_$9A */ PACK( 0, 0 ), 831 /* INS_$9B */ PACK( 0, 0 ), 832 /* INS_$9C */ PACK( 0, 0 ), 833 /* INS_$9D */ PACK( 0, 0 ), 834 /* INS_$9E */ PACK( 0, 0 ), 835 /* INS_$9F */ PACK( 0, 0 ), 836 837 /* 0xA0 */ 838 /* INS_$A0 */ PACK( 0, 0 ), 839 /* INS_$A1 */ PACK( 0, 0 ), 840 /* INS_$A2 */ PACK( 0, 0 ), 841 /* INS_$A3 */ PACK( 0, 0 ), 842 /* INS_$A4 */ PACK( 0, 0 ), 843 /* INS_$A5 */ PACK( 0, 0 ), 844 /* INS_$A6 */ PACK( 0, 0 ), 845 /* INS_$A7 */ PACK( 0, 0 ), 846 /* INS_$A8 */ PACK( 0, 0 ), 847 /* INS_$A9 */ PACK( 0, 0 ), 848 /* INS_$AA */ PACK( 0, 0 ), 849 /* INS_$AB */ PACK( 0, 0 ), 850 /* INS_$AC */ PACK( 0, 0 ), 851 /* INS_$AD */ PACK( 0, 0 ), 852 /* INS_$AE */ PACK( 0, 0 ), 853 /* INS_$AF */ PACK( 0, 0 ), 854 855 /* 0xB0 */ 856 /* PUSHB[0] */ PACK( 0, 1 ), 857 /* PUSHB[1] */ PACK( 0, 2 ), 858 /* PUSHB[2] */ PACK( 0, 3 ), 859 /* PUSHB[3] */ PACK( 0, 4 ), 860 /* PUSHB[4] */ PACK( 0, 5 ), 861 /* PUSHB[5] */ PACK( 0, 6 ), 862 /* PUSHB[6] */ PACK( 0, 7 ), 863 /* PUSHB[7] */ PACK( 0, 8 ), 864 /* PUSHW[0] */ PACK( 0, 1 ), 865 /* PUSHW[1] */ PACK( 0, 2 ), 866 /* PUSHW[2] */ PACK( 0, 3 ), 867 /* PUSHW[3] */ PACK( 0, 4 ), 868 /* PUSHW[4] */ PACK( 0, 5 ), 869 /* PUSHW[5] */ PACK( 0, 6 ), 870 /* PUSHW[6] */ PACK( 0, 7 ), 871 /* PUSHW[7] */ PACK( 0, 8 ), 872 873 /* 0xC0 */ 874 /* MDRP[00] */ PACK( 1, 0 ), 875 /* MDRP[01] */ PACK( 1, 0 ), 876 /* MDRP[02] */ PACK( 1, 0 ), 877 /* MDRP[03] */ PACK( 1, 0 ), 878 /* MDRP[04] */ PACK( 1, 0 ), 879 /* MDRP[05] */ PACK( 1, 0 ), 880 /* MDRP[06] */ PACK( 1, 0 ), 881 /* MDRP[07] */ PACK( 1, 0 ), 882 /* MDRP[08] */ PACK( 1, 0 ), 883 /* MDRP[09] */ PACK( 1, 0 ), 884 /* MDRP[10] */ PACK( 1, 0 ), 885 /* MDRP[11] */ PACK( 1, 0 ), 886 /* MDRP[12] */ PACK( 1, 0 ), 887 /* MDRP[13] */ PACK( 1, 0 ), 888 /* MDRP[14] */ PACK( 1, 0 ), 889 /* MDRP[15] */ PACK( 1, 0 ), 890 891 /* 0xD0 */ 892 /* MDRP[16] */ PACK( 1, 0 ), 893 /* MDRP[17] */ PACK( 1, 0 ), 894 /* MDRP[18] */ PACK( 1, 0 ), 895 /* MDRP[19] */ PACK( 1, 0 ), 896 /* MDRP[20] */ PACK( 1, 0 ), 897 /* MDRP[21] */ PACK( 1, 0 ), 898 /* MDRP[22] */ PACK( 1, 0 ), 899 /* MDRP[23] */ PACK( 1, 0 ), 900 /* MDRP[24] */ PACK( 1, 0 ), 901 /* MDRP[25] */ PACK( 1, 0 ), 902 /* MDRP[26] */ PACK( 1, 0 ), 903 /* MDRP[27] */ PACK( 1, 0 ), 904 /* MDRP[28] */ PACK( 1, 0 ), 905 /* MDRP[29] */ PACK( 1, 0 ), 906 /* MDRP[30] */ PACK( 1, 0 ), 907 /* MDRP[31] */ PACK( 1, 0 ), 908 909 /* 0xE0 */ 910 /* MIRP[00] */ PACK( 2, 0 ), 911 /* MIRP[01] */ PACK( 2, 0 ), 912 /* MIRP[02] */ PACK( 2, 0 ), 913 /* MIRP[03] */ PACK( 2, 0 ), 914 /* MIRP[04] */ PACK( 2, 0 ), 915 /* MIRP[05] */ PACK( 2, 0 ), 916 /* MIRP[06] */ PACK( 2, 0 ), 917 /* MIRP[07] */ PACK( 2, 0 ), 918 /* MIRP[08] */ PACK( 2, 0 ), 919 /* MIRP[09] */ PACK( 2, 0 ), 920 /* MIRP[10] */ PACK( 2, 0 ), 921 /* MIRP[11] */ PACK( 2, 0 ), 922 /* MIRP[12] */ PACK( 2, 0 ), 923 /* MIRP[13] */ PACK( 2, 0 ), 924 /* MIRP[14] */ PACK( 2, 0 ), 925 /* MIRP[15] */ PACK( 2, 0 ), 926 927 /* 0xF0 */ 928 /* MIRP[16] */ PACK( 2, 0 ), 929 /* MIRP[17] */ PACK( 2, 0 ), 930 /* MIRP[18] */ PACK( 2, 0 ), 931 /* MIRP[19] */ PACK( 2, 0 ), 932 /* MIRP[20] */ PACK( 2, 0 ), 933 /* MIRP[21] */ PACK( 2, 0 ), 934 /* MIRP[22] */ PACK( 2, 0 ), 935 /* MIRP[23] */ PACK( 2, 0 ), 936 /* MIRP[24] */ PACK( 2, 0 ), 937 /* MIRP[25] */ PACK( 2, 0 ), 938 /* MIRP[26] */ PACK( 2, 0 ), 939 /* MIRP[27] */ PACK( 2, 0 ), 940 /* MIRP[28] */ PACK( 2, 0 ), 941 /* MIRP[29] */ PACK( 2, 0 ), 942 /* MIRP[30] */ PACK( 2, 0 ), 943 /* MIRP[31] */ PACK( 2, 0 ) 944 }; 945 946 947 #ifdef FT_DEBUG_LEVEL_TRACE 948 949 /* the first hex digit gives the length of the opcode name; the space */ 950 /* after the digit is here just to increase readability of the source */ 951 /* code */ 952 953 static 954 const char* const opcode_name[256] = 955 { 956 /* 0x00 */ 957 "8 SVTCA[y]", 958 "8 SVTCA[x]", 959 "9 SPVTCA[y]", 960 "9 SPVTCA[x]", 961 "9 SFVTCA[y]", 962 "9 SFVTCA[x]", 963 "9 SPVTL[||]", 964 "8 SPVTL[+]", 965 "9 SFVTL[||]", 966 "8 SFVTL[+]", 967 "5 SPVFS", 968 "5 SFVFS", 969 "3 GPV", 970 "3 GFV", 971 "6 SFVTPV", 972 "5 ISECT", 973 974 /* 0x10 */ 975 "4 SRP0", 976 "4 SRP1", 977 "4 SRP2", 978 "4 SZP0", 979 "4 SZP1", 980 "4 SZP2", 981 "4 SZPS", 982 "5 SLOOP", 983 "3 RTG", 984 "4 RTHG", 985 "3 SMD", 986 "4 ELSE", 987 "4 JMPR", 988 "6 SCVTCI", 989 "5 SSWCI", 990 "3 SSW", 991 992 /* 0x20 */ 993 "3 DUP", 994 "3 POP", 995 "5 CLEAR", 996 "4 SWAP", 997 "5 DEPTH", 998 "6 CINDEX", 999 "6 MINDEX", 1000 "8 ALIGNPTS", 1001 "7 INS_$28", 1002 "3 UTP", 1003 "8 LOOPCALL", 1004 "4 CALL", 1005 "4 FDEF", 1006 "4 ENDF", 1007 "6 MDAP[]", 1008 "9 MDAP[rnd]", 1009 1010 /* 0x30 */ 1011 "6 IUP[y]", 1012 "6 IUP[x]", 1013 "8 SHP[rp2]", 1014 "8 SHP[rp1]", 1015 "8 SHC[rp2]", 1016 "8 SHC[rp1]", 1017 "8 SHZ[rp2]", 1018 "8 SHZ[rp1]", 1019 "5 SHPIX", 1020 "2 IP", 1021 "7 MSIRP[]", 1022 "A MSIRP[rp0]", 1023 "7 ALIGNRP", 1024 "4 RTDG", 1025 "6 MIAP[]", 1026 "9 MIAP[rnd]", 1027 1028 /* 0x40 */ 1029 "6 NPUSHB", 1030 "6 NPUSHW", 1031 "2 WS", 1032 "2 RS", 1033 "5 WCVTP", 1034 "4 RCVT", 1035 "8 GC[curr]", 1036 "8 GC[orig]", 1037 "4 SCFS", 1038 "8 MD[curr]", 1039 "8 MD[orig]", 1040 "5 MPPEM", 1041 "3 MPS", 1042 "6 FLIPON", 1043 "7 FLIPOFF", 1044 "5 DEBUG", 1045 1046 /* 0x50 */ 1047 "2 LT", 1048 "4 LTEQ", 1049 "2 GT", 1050 "4 GTEQ", 1051 "2 EQ", 1052 "3 NEQ", 1053 "3 ODD", 1054 "4 EVEN", 1055 "2 IF", 1056 "3 EIF", 1057 "3 AND", 1058 "2 OR", 1059 "3 NOT", 1060 "7 DELTAP1", 1061 "3 SDB", 1062 "3 SDS", 1063 1064 /* 0x60 */ 1065 "3 ADD", 1066 "3 SUB", 1067 "3 DIV", 1068 "3 MUL", 1069 "3 ABS", 1070 "3 NEG", 1071 "5 FLOOR", 1072 "7 CEILING", 1073 "8 ROUND[G]", 1074 "8 ROUND[B]", 1075 "8 ROUND[W]", 1076 "7 ROUND[]", 1077 "9 NROUND[G]", 1078 "9 NROUND[B]", 1079 "9 NROUND[W]", 1080 "8 NROUND[]", 1081 1082 /* 0x70 */ 1083 "5 WCVTF", 1084 "7 DELTAP2", 1085 "7 DELTAP3", 1086 "7 DELTAC1", 1087 "7 DELTAC2", 1088 "7 DELTAC3", 1089 "6 SROUND", 1090 "8 S45ROUND", 1091 "4 JROT", 1092 "4 JROF", 1093 "4 ROFF", 1094 "7 INS_$7B", 1095 "4 RUTG", 1096 "4 RDTG", 1097 "5 SANGW", 1098 "2 AA", 1099 1100 /* 0x80 */ 1101 "6 FLIPPT", 1102 "8 FLIPRGON", 1103 "9 FLIPRGOFF", 1104 "7 INS_$83", 1105 "7 INS_$84", 1106 "8 SCANCTRL", 1107 "A SDPVTL[||]", 1108 "9 SDPVTL[+]", 1109 "7 GETINFO", 1110 "4 IDEF", 1111 "4 ROLL", 1112 "3 MAX", 1113 "3 MIN", 1114 "8 SCANTYPE", 1115 "8 INSTCTRL", 1116 "7 INS_$8F", 1117 1118 /* 0x90 */ 1119 "7 INS_$90", 1120 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 1121 "C GETVARIATION", 1122 "7 GETDATA", 1123 #else 1124 "7 INS_$91", 1125 "7 INS_$92", 1126 #endif 1127 "7 INS_$93", 1128 "7 INS_$94", 1129 "7 INS_$95", 1130 "7 INS_$96", 1131 "7 INS_$97", 1132 "7 INS_$98", 1133 "7 INS_$99", 1134 "7 INS_$9A", 1135 "7 INS_$9B", 1136 "7 INS_$9C", 1137 "7 INS_$9D", 1138 "7 INS_$9E", 1139 "7 INS_$9F", 1140 1141 /* 0xA0 */ 1142 "7 INS_$A0", 1143 "7 INS_$A1", 1144 "7 INS_$A2", 1145 "7 INS_$A3", 1146 "7 INS_$A4", 1147 "7 INS_$A5", 1148 "7 INS_$A6", 1149 "7 INS_$A7", 1150 "7 INS_$A8", 1151 "7 INS_$A9", 1152 "7 INS_$AA", 1153 "7 INS_$AB", 1154 "7 INS_$AC", 1155 "7 INS_$AD", 1156 "7 INS_$AE", 1157 "7 INS_$AF", 1158 1159 /* 0xB0 */ 1160 "8 PUSHB[0]", 1161 "8 PUSHB[1]", 1162 "8 PUSHB[2]", 1163 "8 PUSHB[3]", 1164 "8 PUSHB[4]", 1165 "8 PUSHB[5]", 1166 "8 PUSHB[6]", 1167 "8 PUSHB[7]", 1168 "8 PUSHW[0]", 1169 "8 PUSHW[1]", 1170 "8 PUSHW[2]", 1171 "8 PUSHW[3]", 1172 "8 PUSHW[4]", 1173 "8 PUSHW[5]", 1174 "8 PUSHW[6]", 1175 "8 PUSHW[7]", 1176 1177 /* 0xC0 */ 1178 "7 MDRP[G]", 1179 "7 MDRP[B]", 1180 "7 MDRP[W]", 1181 "6 MDRP[]", 1182 "8 MDRP[rG]", 1183 "8 MDRP[rB]", 1184 "8 MDRP[rW]", 1185 "7 MDRP[r]", 1186 "8 MDRP[mG]", 1187 "8 MDRP[mB]", 1188 "8 MDRP[mW]", 1189 "7 MDRP[m]", 1190 "9 MDRP[mrG]", 1191 "9 MDRP[mrB]", 1192 "9 MDRP[mrW]", 1193 "8 MDRP[mr]", 1194 1195 /* 0xD0 */ 1196 "8 MDRP[pG]", 1197 "8 MDRP[pB]", 1198 "8 MDRP[pW]", 1199 "7 MDRP[p]", 1200 "9 MDRP[prG]", 1201 "9 MDRP[prB]", 1202 "9 MDRP[prW]", 1203 "8 MDRP[pr]", 1204 "9 MDRP[pmG]", 1205 "9 MDRP[pmB]", 1206 "9 MDRP[pmW]", 1207 "8 MDRP[pm]", 1208 "A MDRP[pmrG]", 1209 "A MDRP[pmrB]", 1210 "A MDRP[pmrW]", 1211 "9 MDRP[pmr]", 1212 1213 /* 0xE0 */ 1214 "7 MIRP[G]", 1215 "7 MIRP[B]", 1216 "7 MIRP[W]", 1217 "6 MIRP[]", 1218 "8 MIRP[rG]", 1219 "8 MIRP[rB]", 1220 "8 MIRP[rW]", 1221 "7 MIRP[r]", 1222 "8 MIRP[mG]", 1223 "8 MIRP[mB]", 1224 "8 MIRP[mW]", 1225 "7 MIRP[m]", 1226 "9 MIRP[mrG]", 1227 "9 MIRP[mrB]", 1228 "9 MIRP[mrW]", 1229 "8 MIRP[mr]", 1230 1231 /* 0xF0 */ 1232 "8 MIRP[pG]", 1233 "8 MIRP[pB]", 1234 "8 MIRP[pW]", 1235 "7 MIRP[p]", 1236 "9 MIRP[prG]", 1237 "9 MIRP[prB]", 1238 "9 MIRP[prW]", 1239 "8 MIRP[pr]", 1240 "9 MIRP[pmG]", 1241 "9 MIRP[pmB]", 1242 "9 MIRP[pmW]", 1243 "8 MIRP[pm]", 1244 "A MIRP[pmrG]", 1245 "A MIRP[pmrB]", 1246 "A MIRP[pmrW]", 1247 "9 MIRP[pmr]" 1248 }; 1249 1250 #endif /* FT_DEBUG_LEVEL_TRACE */ 1251 1252 1253 static 1254 const FT_Char opcode_length[256] = 1255 { 1256 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1257 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1258 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1259 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1260 1261 -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1262 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1263 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1264 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1265 1266 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1267 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1677 1678 /* NOTE: Because the last instruction of a program may be a CALL */ 1679 /* which will return to the first byte *after* the code */ 1680 /* range, we test for aIP <= Size, instead of aIP < Size. */ 1681 1682 if ( aIP > range->size ) 1683 { 1684 exc->error = FT_THROW( Code_Overflow ); 1685 return FAILURE; 1686 } 1687 1688 exc->code = range->base; 1689 exc->codeSize = range->size; 1690 exc->IP = aIP; 1691 exc->curRange = aRange; 1692 1693 return SUCCESS; 1694 } 1695 1696 1697 /* 1698 * 1699 * Apple's TrueType specification at 1700 * 1701 * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM02/Chap2.html#order 1702 * 1703 * gives the following order of operations in instructions that move 1704 * points. 1705 * 1706 * - check single width cut-in (MIRP, MDRP) 1707 * 1708 * - check control value cut-in (MIRP, MIAP) 1709 * 1710 * - apply engine compensation (MIRP, MDRP) 1711 * 1712 * - round distance (MIRP, MDRP) or value (MIAP, MDAP) 1713 * 1714 * - check minimum distance (MIRP,MDRP) 1715 * 1716 * - move point (MIRP, MDRP, MIAP, MSIRP, MDAP) 1717 * 1718 * For rounding instructions, engine compensation happens before rounding. 1719 * 1720 */ 1721 1722 1723 /************************************************************************** 1724 * 1725 * @Function: 1726 * Direct_Move 1727 * 1728 * @Description: 1729 * Moves a point by a given distance along the freedom vector. The 1730 * point will be `touched'. 1731 * 1732 * @Input: 1733 * point :: 1734 * The index of the point to move. 1735 * 1736 * distance :: 1737 * The distance to apply. 1738 * 1739 * @InOut: 1740 * zone :: 1741 * The affected glyph zone. 1742 * 1927 FT_UShort point, 1928 FT_F26Dot6 distance ) 1929 { 1930 FT_UNUSED( exc ); 1931 1932 zone->org[point].x = ADD_LONG( zone->org[point].x, distance ); 1933 } 1934 1935 1936 static void 1937 Direct_Move_Orig_Y( TT_ExecContext exc, 1938 TT_GlyphZone zone, 1939 FT_UShort point, 1940 FT_F26Dot6 distance ) 1941 { 1942 FT_UNUSED( exc ); 1943 1944 zone->org[point].y = ADD_LONG( zone->org[point].y, distance ); 1945 } 1946 1947 /************************************************************************** 1948 * 1949 * @Function: 1950 * Round_None 1951 * 1952 * @Description: 1953 * Does not round, but adds engine compensation. 1954 * 1955 * @Input: 1956 * distance :: 1957 * The distance (not) to round. 1958 * 1959 * compensation :: 1960 * The engine compensation. 1961 * 1962 * @Return: 1963 * The compensated distance. 1964 */ 1965 static FT_F26Dot6 1966 Round_None( TT_ExecContext exc, 1967 FT_F26Dot6 distance, 1968 FT_F26Dot6 compensation ) 1969 { 1970 FT_F26Dot6 val; 1971 1972 FT_UNUSED( exc ); 1973 1974 1975 if ( distance >= 0 ) 1976 { 1977 val = ADD_LONG( distance, compensation ); 1978 if ( val < 0 ) 1979 val = 0; 1980 } 1981 else 1982 { 1983 val = SUB_LONG( distance, compensation ); |