#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freetype.h"
#include "tttypes.h"
#include "ttdebug.h"
#include "ttobjs.h"
#ifdef UNIX
#ifndef HAVE_POSIX_TERMIOS
#include <sys/ioctl.h>
#include <termio.h>
#else
#ifndef HAVE_TCGETATTR
#define HAVE_TCGETATTR
#endif
#ifndef HAVE_TCSETATTR
#define HAVE_TCSETATTR
#endif
#include <termios.h>
#endif
#endif
extern
int debug_coderange;
#define Font_Buff_Size 256000
TT_Engine engine;
TT_Face face;
TT_Instance instance;
TT_Glyph glyph;
TT_Error error;
TT_Face_Properties properties;
int num_glyphs;
int ptsize;
Int Fail;
Int Num;
int mode = 2;
unsigned char autorun;
static
void Usage( const char* execname )
{
TT_Message( "fdebug: a simple TrueType bytecode debugger - part of the FreeType project\n" );
TT_Message( "--------------------------------------------------------------------------\n\n");
TT_Message( "Usage: %s glyphnum ppem fontname[.ttf]\n", execname );
TT_Message( " or %s --cvt ppem fontname[.ttf]\n", execname );
TT_Message( " or %s --font fontname[.ttf]\n\n", execname );
exit( EXIT_FAILURE );
}
#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);
#ifndef HAVE_TCSETATTR
ioctl( 0, TCSETS, &termio );
#else
tcsetattr( 0, TCSANOW, &termio );
#endif
}
static
void Reset_Keyboard( voi )
{
#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( voi )
{
}
#endif
static
void Print_Banner( void )
{
TT_Message( "fdebug - a simple TrueType bytecode debugger for FreeType\n" );
TT_Message( "------------------------------------------------------------\n" );
TT_Message( "type '?' for help - copyright 1996-1999 the FreeType Project\n\n" );
}
static
void Error( const char* message,
const char* filename )
{
static char tempstr[256];
sprintf( tempstr, "ERROR (%s): %s\n", filename, message );
TT_Message( tempstr );
sprintf( tempstr, " code = 0x%04lx\n", error );
TT_Message( tempstr );
Reset_Keyboard();
exit( EXIT_FAILURE );
}
static
void Init_Face( const char* filename )
{
error = TT_Init_FreeType(&engine);
if (error) Error( "could not initialise FreeType", filename );
error = TT_Open_Face( engine, filename, &face );
if (error) Error( "could not find or open file", filename );
TT_Get_Face_Properties( face, &properties );
num_glyphs = properties.num_Glyphs;
error = TT_New_Instance( face, &instance );
if (error) Error( "could not create instance", filename );
error = TT_New_Glyph( face, &glyph );
if (error) Error( "could not create glyph container", filename );
TT_Set_Instance_Resolutions( instance, 96, 96 );
error = TT_Set_Instance_CharSize( instance, ptsize << 6 );
if (error) Error( "could not set text size", filename );
}
int main( int argc, char** argv )
{
int i;
char filename[128+4];
char* execname;
execname = argv[0];
if ( argc < 2 )
Usage( execname );
if ( strcmp( argv[1], "--font" ) == 0 )
{
debug_coderange = TT_CodeRange_Font;
mode = 0;
argc--;
argv++;
}
else if ( strcmp( argv[1], "--cvt" ) == 0 )
{
debug_coderange = TT_CodeRange_Cvt;
argv++;
argc--;
mode = 1;
}
else if ( sscanf( argv[1], "%d", &Num ) == 1 )
{
mode = 2;
argv++;
argc--;
}
else
Usage( execname );
if (mode > 0)
{
if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
Usage( execname );
argc--;
argv++;
}
if ( argc != 2 )
Usage(execname);
i = strlen( argv[1] );
while ( i > 0 && argv[1][i] != '\\' )
{
if ( argv[1][i] == '.' )
i = 0;
i--;
}
filename[128] = 0;
strncpy( filename, argv[1], 128 );
if ( i >= 0 )
strncpy( filename + strlen(filename), ".ttf", 4 );
Init_Keyboard();
if (mode == 2)
{
Init_Face( filename );
Print_Banner();
error = TT_Load_Glyph( instance, glyph, Num, TTLOAD_DEFAULT );
if (error) Error( "Error during bytecode execution", filename );
}
else
{
Print_Banner();
Init_Face( filename );
}
TT_Done_FreeType(engine);
Reset_Keyboard();
exit( EXIT_SUCCESS );
return 0;
}