From c91cfe1100d6de610e01176e4d96909026604d12 Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 12 May 2000 15:51:42 +0000 Subject: [PATCH] small update to the memory tester --- demos/Makefile | 5 +- demos/src/ftstring.c | 6 +- demos/src/memtest.c | 192 ++++++++++++++++++++++++++++++++++++++----- 3 files changed, 178 insertions(+), 25 deletions(-) diff --git a/demos/Makefile b/demos/Makefile index c1d47b1ac..041436a47 100644 --- a/demos/Makefile +++ b/demos/Makefile @@ -160,7 +160,7 @@ else # # The list of demonstration programs to build. # - EXES := ftlint ftview fttimer compos ftstring + EXES := ftlint ftview fttimer compos ftstring memtest ifneq ($(findstring $(PLATFORM),os2 unix win32),) EXES += ttdebug @@ -262,6 +262,9 @@ else $(BIN_)ftlint$E: $(OBJ_)ftlint.$O $(FTLIB) $(COMMON_OBJ) $(COMMON_LINK) + $(BIN_)memtest$E: $(OBJ_)memtest.$O $(FTLIB) $(COMMON_OBJ) + $(COMMON_LINK) + $(BIN_)compos$E: $(OBJ_)compos.$O $(FTLIB) $(COMMON_OBJ) $(COMMON_LINK) diff --git a/demos/src/ftstring.c b/demos/src/ftstring.c index 2888c6adc..859fcfec7 100644 --- a/demos/src/ftstring.c +++ b/demos/src/ftstring.c @@ -36,7 +36,7 @@ static char Header[128]; static char* new_header = 0; - static unsigned char* Text = "The quick brown fox jumps over the lazy dog"; + static char* Text = "The quick brown fox jumps over the lazy dog"; static FT_Library library; /* the FreeType library */ static FT_Face face; /* the font face */ @@ -382,7 +382,7 @@ * XXX: For now, we perform a trivial conversion * */ - static void prepare_text( const char* string ) + static void prepare_text( const unsigned char* string ) { const unsigned char* p = (const unsigned char*)string; PGlyph glyph = glyphs; @@ -710,7 +710,7 @@ if (error) goto Display_Font; /* prepare the text to be rendered */ - prepare_text( Text ); + prepare_text( (unsigned char*)Text ); file_loaded++; diff --git a/demos/src/memtest.c b/demos/src/memtest.c index edf4189d5..1cb92795f 100644 --- a/demos/src/memtest.c +++ b/demos/src/memtest.c @@ -1,20 +1,35 @@ /* memtest.c */ -#include -#include +#include +#include #include #include + FT_Error error; - EXPORT_DEF - void FT_Default_Drivers( FT_Library library ); + FT_Library library; + FT_Face face; + FT_Size size; + FT_GlyphSlot slot; + unsigned int num_glyphs; + int ptsize; + + int Fail; + int Num; + + + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ /* Our own memory allocator. To check that a single block isn't freed */ /* several time, we simply do not call "free".. */ - -#define MAX_RECORDED_BLOCKS 4096 +#define MAX_RECORDED_BLOCKS 1638400 #define CHECK_DUPLICATES typedef struct MyBlock @@ -140,34 +155,169 @@ struct FT_MemoryRec_ my_memory = my_realloc }; - -int main( void ) +static void dump_mem( void ) { - FT_Library library; - FT_Face face; - int glyphIndex; - int result; + MyBlock* block = my_blocks + num_my_blocks-1; + int bad = 0; + + printf( "total allocated blocks = %d\n", num_my_blocks ); + + /* we scan in reverse, because transient blocks are always located */ + /* at the end of the table.. (it supposedly faster then..) */ + for ( ; block >= my_blocks; block-- ) + { + if (block->size > 0) + { + fprintf( stderr, "%08lx (%6ld bytes) leaked !!\n", (long)block->base, (long)block->size ); + bad = 1; + } + } + if (!bad) + fprintf( stderr, "no leaked memory block, congratulations ;-)" ); +} + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + + + static void Usage( char* name ) + { + printf( "memtest: simple memory tester -- part of the FreeType project\n" ); + printf( "-------------------------------------------------------------\n" ); + printf( "\n" ); + printf( "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n", name ); + printf( "\n" ); + + exit( 1 ); + } + + + static void Panic( const char* message ) + { + fprintf( stderr, "%s\n error code = 0x%04x\n", message, error ); + exit(1); + } + + +int main( int argc, char** argv ) +{ + int i, file_index; + unsigned int id; + char filename[128 + 4]; + char alt_filename[128 + 4]; + char* execname; + char* fname; + + execname = argv[0]; + + if ( argc < 3 ) + Usage( execname ); + + if ( sscanf( argv[1], "%d", &ptsize ) != 1 ) + Usage( execname ); /* Create a new library with our own memory manager */ - result = FT_New_Library( &my_memory, &library ); + error = FT_New_Library( &my_memory, &library ); + if (error) Panic( "Could not create library object" ); /* the new library has no drivers in it, add the default ones */ /* (implemented in ftinit.c).. */ FT_Default_Drivers(library); - result = FT_New_Face( library, "d:/ttf/arial.ttf", 0, &face ); - result = FT_Set_Char_Size( face, 0, 16*64, 96, 96 ); - glyphIndex = FT_Get_Char_Index( face, (int)'A' ); + /* Now check all files */ + for ( file_index = 2; file_index < argc; file_index++ ) + { + fname = argv[file_index]; + i = strlen( fname ); + while ( i > 0 && fname[i] != '\\' && fname[i] != '/' ) + { + if ( fname[i] == '.' ) + i = 0; + i--; + } - /* memory error occurs in FT_DoneFreeType() if FT_Load_Glyph() is called */ - result = FT_Load_Glyph(face, glyphIndex, FT_LOAD_DEFAULT ); + filename[128] = '\0'; + alt_filename[128] = '\0'; - result = FT_Done_Face( face ); + strncpy( filename, fname, 128 ); + strncpy( alt_filename, fname, 128 ); - result = FT_Done_FreeType( library ); +#ifndef macintosh + if ( i >= 0 ) + { + strncpy( filename + strlen( filename ), ".ttf", 4 ); + strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 ); + } +#endif + i = strlen( filename ); + fname = filename; - return 0; + while ( i >= 0 ) +#ifndef macintosh + if ( filename[i] == '/' || filename[i] == '\\' ) +#else + if ( filename[i] == ':' ) +#endif + { + fname = filename + i + 1; + i = -1; + } + else + i--; + + printf( "%s: ", fname ); + + /* Load face */ + error = FT_New_Face( library, filename, 0, &face ); + if (error) + { + if (error == FT_Err_Invalid_File_Format) + printf( "unknown format\n" ); + else + printf( "could not find/open file (error: %d)\n", error ); + continue; + } + if (error) Panic( "Could not open file" ); + + num_glyphs = face->num_glyphs; + + error = FT_Set_Char_Size( face, ptsize << 6, ptsize << 6, 72, 72 ); + if (error) Panic( "Could not set character size" ); + + Fail = 0; + { + for ( id = 0; id < num_glyphs; id++ ) + { + error = FT_Load_Glyph( face, id, FT_LOAD_DEFAULT ); + if (error) + { + if ( Fail < 10 ) + printf( "glyph %4u: 0x%04x\n" , id, error ); + Fail++; + } + } + } + + if ( Fail == 0 ) + printf( "OK.\n" ); + else + if ( Fail == 1 ) + printf( "1 fail.\n" ); + else + printf( "%d fails.\n", Fail ); + + FT_Done_Face( face ); + } + + FT_Done_FreeType(library); + + dump_mem(); + + exit( 0 ); /* for safety reasons */ + return 0; /* never reached */ }