📄 ttdebug.c
字号:
"LT", "LTEQ", "GT", "GTEQ", "EQ", "NEQ", "ODD", "EVEN", "IF", "EIF", "AND", "OR", "NOT", "DeltaP1", "SDB", "SDS", "ADD", "SUB", "DIV", "MUL", "ABS", "NEG", "FLOOR", "CEILING", "ROUND[G]", "ROUND[B]", "ROUND[W]", "ROUND[?]", "NROUND[G]", "NROUND[B]", "NROUND[W]", "NROUND[?]", "WCvtF", "DeltaP2", "DeltaP3", "DeltaC1", "DeltaC2", "DeltaC3", "SROUND", "S45Round", "JROT", "JROF", "ROFF", "INS_$7B", "RUTG", "RDTG", "SANGW", "AA", "FlipPT", "FlipRgON", "FlipRgOFF", "INS_$83", "INS_$84", "ScanCTRL", "SDPVTL[0]", "SDPVTL[1]", "GetINFO", "IDEF", "ROLL", "MAX", "MIN", "ScanTYPE", "IntCTRL", "INS_$8F", "INS_$90", "INS_$91", "INS_$92", "INS_$93", "INS_$94", "INS_$95", "INS_$96", "INS_$97", "INS_$98", "INS_$99", "INS_$9A", "INS_$9B", "INS_$9C", "INS_$9D", "INS_$9E", "INS_$9F", "INS_$A0", "INS_$A1", "INS_$A2", "INS_$A3", "INS_$A4", "INS_$A5", "INS_$A6", "INS_$A7", "INS_$A8", "INS_$A9", "INS_$AA", "INS_$AB", "INS_$AC", "INS_$AD", "INS_$AE", "INS_$AF", "PushB[0]", "PushB[1]", "PushB[2]", "PushB[3]", "PushB[4]", "PushB[5]", "PushB[6]", "PushB[7]", "PushW[0]", "PushW[1]", "PushW[2]", "PushW[3]", "PushW[4]", "PushW[5]", "PushW[6]", "PushW[7]", "MDRP[G]", "MDRP[B]", "MDRP[W]", "MDRP[?]", "MDRP[rG]", "MDRP[rB]", "MDRP[rW]", "MDRP[r?]", "MDRP[mG]", "MDRP[mB]", "MDRP[mW]", "MDRP[m?]", "MDRP[mrG]", "MDRP[mrB]", "MDRP[mrW]", "MDRP[mr?]", "MDRP[pG]", "MDRP[pB]", "MDRP[pW]", "MDRP[p?]", "MDRP[prG]", "MDRP[prB]", "MDRP[prW]", "MDRP[pr?]", "MDRP[pmG]", "MDRP[pmB]", "MDRP[pmW]", "MDRP[pm?]", "MDRP[pmrG]", "MDRP[pmrB]", "MDRP[pmrW]", "MDRP[pmr?]", "MIRP[G]", "MIRP[B]", "MIRP[W]", "MIRP[?]", "MIRP[rG]", "MIRP[rB]", "MIRP[rW]", "MIRP[r?]", "MIRP[mG]", "MIRP[mB]", "MIRP[mW]", "MIRP[m?]", "MIRP[mrG]", "MIRP[mrB]", "MIRP[mrW]", "MIRP[mr?]", "MIRP[pG]", "MIRP[pB]", "MIRP[pW]", "MIRP[p?]", "MIRP[prG]", "MIRP[prB]", "MIRP[prW]", "MIRP[pr?]", "MIRP[pmG]", "MIRP[pmB]", "MIRP[pmW]", "MIRP[pm?]", "MIRP[pmrG]", "MIRP[pmrB]", "MIRP[pmrW]", "MIRP[pmr?]" };/********************************************************************* * * Init_Keyboard : set the input file descriptor to char-by-char * mode on Unix.. * *********************************************************************/#ifdef UNIX struct termios old_termio; static void Init_Keyboard( void ) { struct termios termio;#ifndef HAVE_TCGETATTR ioctl( 0, TCGETS, &old_termio );#else tcgetattr( 0, &old_termio );#endif termio = old_termio;/* termio.c_lflag &= ~(ICANON+ECHO+ECHOE+ECHOK+ECHONL+ECHOKE); */ termio.c_lflag &= ~(ICANON+ECHO+ECHOE+ECHOK+ECHONL);#ifndef HAVE_TCSETATTR ioctl( 0, TCSETS, &termio );#else tcsetattr( 0, TCSANOW, &termio );#endif } static void Reset_Keyboard( void ) {#ifndef HAVE_TCSETATTR ioctl( 0, TCSETS, &old_termio );#else tcsetattr( 0, TCSANOW, &old_termio );#endif }#else static void Init_Keyboard( void ) { } static void Reset_Keyboard( void ) { }#endif void Panic( const char* message ) { fprintf( stderr, "%s\n error code = 0x%04x\n", message, error ); Reset_Keyboard(); exit(1); }/****************************************************************** * * Function : Calc_Length * * Description : Computes the length in bytes of current opcode. * *****************************************************************/#define CUR (*exc) static void Calc_Length( TT_ExecContext exc ) { CUR.opcode = CUR.code[CUR.IP]; switch ( CUR.opcode ) { case 0x40: if ( CUR.IP + 1 >= CUR.codeSize ) Panic( "code range overflow !!" ); CUR.length = CUR.code[CUR.IP + 1] + 2; break; case 0x41: if ( CUR.IP + 1 >= CUR.codeSize ) Panic( "code range overflow !!" ); CUR.length = CUR.code[CUR.IP + 1] * 2 + 2; break; case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: CUR.length = CUR.opcode - 0xB0 + 2; break; case 0xB8: case 0xB9: case 0xBA: case 0xBB: case 0xBC: case 0xBD: case 0xBE: case 0xBF: CUR.length = (CUR.opcode - 0xB8) * 2 + 3; break; default: CUR.length = 1; break; } /* make sure result is in range */ if ( CUR.IP + CUR.length > CUR.codeSize ) Panic( "code range overflow !!" ); } /* Disassemble the current line */ /* */ const FT_String* Cur_U_Line( TT_ExecContext exec ) { FT_String s[32]; FT_Int op, i, n; op = exec->code[ exec->IP ]; sprintf( tempStr, "%04lx: %02hx %s", exec->IP, op, OpStr[op] ); if ( op == 0x40 ) { n = exec->code[ exec->IP+1 ]; sprintf( s, "(%d)", n ); strncat( tempStr, s, 8 ); if ( n > 20 ) n = 20; /* limit output */ for ( i = 0; i < n; i++ ) { sprintf( s, " $%02hx", exec->code[ exec->IP+i+2 ] ); strncat( tempStr, s, 8 ); } } else if ( op == 0x41 ) { n = exec->code[ exec->IP+1 ]; sprintf( s, "(%d)", n ); strncat( tempStr, s, 8 ); if (n > 20) n = 20; /* limit output */ for ( i = 0; i < n; i++ ) { sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+2 ], exec->code[ exec->IP+i*2+3 ] ); strncat( tempStr, s, 8 ); } } else if ( (op & 0xF8) == 0xB0 ) { n = op-0xB0; for ( i=0; i <= n; i++ ) { sprintf( s, " $%02hx", exec->code[ exec->IP+i+1 ] ); strncat( tempStr, s, 8 ); } } else if ( (op & 0xF8) == 0xB8 ) { n = op-0xB8; for ( i = 0; i <= n; i++ ) { sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+1 ], exec->code[ exec->IP+i*2+2 ] ); strncat( tempStr, s, 8 ); } } return (FT_String*)tempStr; } static int old_tag_to_new( int tag ) { int result = tag & 1; if (tag & FT_Curve_Tag_Touch_X) result |= 2; if (tag & FT_Curve_Tag_Touch_Y) result |= 4; return result; } static FT_Error RunIns( TT_ExecContext exc ) { FT_Int A, diff, key; FT_Long next_IP; FT_Char ch, oldch = '\0', *temp; FT_Error error = 0; TT_GlyphZoneRec save; TT_GlyphZoneRec pts; const FT_String* round_str[8] = { "to half-grid", "to grid", "to double grid", "down to grid", "up to grid", "off", "super",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -