< prev index next >

src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c

Print this page




 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 );


< prev index next >