diff --git a/ChangeLog b/ChangeLog index 5d1407dde..e96f5acb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,39 @@ +2002-02-21 David Turner + + * include/freetype/internal/ftdebug.h, src/base/ftdebug.c: modified + the debug sub-system initialization. trace levels can now be specified + within the "FT2_DEBUG" environment variable. See the comments within + "ftdebug.c" for more details + + * include/freetype/internal/fttrace.h: new file to define the trace + levels used for debugging. it is used both to define enums and + toggle names for FT2_DEBUG + + * src/base/ftobjs.c, src/base/ftstream.c: FT_Assert renamed to + FT_ASSERT + + * include/freetype/internal/ftextend.h, src/base/ftextend.c, + src/base/Jamfile, src/base/rules.mk: removing "ftextend" from the + library, since it is now completely obsolete.. + + * include/freetype/fterrors.h: adding "#undef FT_ERR_CAT" to avoid + warnings with certain compilers (like LCC) + + * src/pshinter/pshalgo2.c: renaming 'print_zone' to 'psh2_print_zone' + to avoid errors during compilation of debug library + + +2002-02-20 David Turner + + * README: adding "devel@freetype.org" address for bug reports.. + + 2002-02-20 Werner Lemberg * builds/unix/install.mk (check): New dummy target. (.PHONY): Add it. + 2002-02-19 Werner Lemberg * builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first. diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h index 506663b2e..d16367722 100644 --- a/include/freetype/config/ftoption.h +++ b/include/freetype/config/ftoption.h @@ -250,7 +250,7 @@ FT_BEGIN_HEADER /* Don't define any of these macros to compile in `release' mode! */ /* */ #undef FT_DEBUG_LEVEL_ERROR -#undef FT_DEBUG_LEVEL_TRACE +#define FT_DEBUG_LEVEL_TRACE /*************************************************************************/ diff --git a/include/freetype/fterrors.h b/include/freetype/fterrors.h index 89e0cf32a..85dd658ca 100644 --- a/include/freetype/fterrors.h +++ b/include/freetype/fterrors.h @@ -105,6 +105,10 @@ #undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + #define FT_ERR_XCAT( x, y ) x ## y #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) @@ -192,6 +196,11 @@ "invalid argument" ) FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + /* glyph/character errors */ diff --git a/include/freetype/internal/ftdebug.h b/include/freetype/internal/ftdebug.h index e18acbba6..b13aa78ce 100644 --- a/include/freetype/internal/ftdebug.h +++ b/include/freetype/internal/ftdebug.h @@ -27,99 +27,48 @@ FT_BEGIN_HEADER +/* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ +/* is already defined.. this simplifies the following #ifdefs.. */ +/* */ +#ifdef FT_DEBUG_LEVEL_TRACE +# undef FT_DEBUG_LEVEL_ERROR +# define FT_DEBUG_LEVEL_ERROR +#endif + + + /*************************************************************************/ + /* */ + /* Define the trace enums as well as the trace levels array when */ + /* they're needed */ + /* */ + /*************************************************************************/ + #ifdef FT_DEBUG_LEVEL_TRACE +# define FT_TRACE_DEF(x) trace_ ## x , - /* note that not all levels are used currently */ - - typedef enum FT_Trace_ + /* defining the enums */ + typedef enum { - /* the first level must always be `trace_any' */ - trace_any = 0, - - /* base components */ - trace_aaraster, /* anti-aliasing raster (ftgrays.c) */ - trace_calc, /* calculations (ftcalc.c) */ - trace_extend, /* extension manager (ftextend.c) */ - trace_glyph, /* glyph manager (ftglyph.c) */ - trace_io, /* i/o monitoring (ftsystem.c) */ - trace_init, /* initialization (ftinit.c) */ - trace_list, /* list manager (ftlist.c) */ - trace_memory, /* memory manager (ftobjs.c) */ - trace_mm, /* MM interface (ftmm.c) */ - trace_objs, /* base objects (ftobjs.c) */ - trace_outline, /* outline management (ftoutln.c) */ - trace_raster, /* rasterizer (ftraster.c) */ - trace_stream, /* stream manager (ftstream.c) */ - - /* Cache sub-system */ - trace_cache, - - /* SFNT driver components */ - trace_sfobjs, /* SFNT object handler (sfobjs.c) */ - trace_ttcmap, /* charmap handler (ttcmap.c) */ - trace_ttload, /* basic TrueType tables (ttload.c) */ - trace_ttpost, /* PS table processing (ttpost.c) */ - trace_ttsbit, /* TrueType sbit handling (ttsbit.c) */ - - /* TrueType driver components */ - trace_ttdriver, /* TT font driver (ttdriver.c) */ - trace_ttgload, /* TT glyph loader (ttgload.c) */ - trace_ttinterp, /* bytecode interpreter (ttinterp.c) */ - trace_ttobjs, /* TT objects manager (ttobjs.c) */ - trace_ttpload, /* TT data/program loader (ttpload.c) */ - - /* Type 1 driver components */ - trace_t1driver, - trace_t1gload, - trace_t1hint, - trace_t1load, - trace_t1objs, - trace_t1parse, - - /* PostScript helper module `psaux' */ - trace_t1decode, - trace_psobjs, - - /* PostScript hinting module `pshinter' */ - trace_pshrec, - trace_pshalgo1, - trace_pshalgo2, - - /* Type 2 driver components */ - trace_cffdriver, - trace_cffgload, - trace_cffload, - trace_cffobjs, - trace_cffparse, - - /* CID driver components */ - trace_cidafm, - trace_ciddriver, - trace_cidgload, - trace_cidload, - trace_cidobjs, - trace_cidparse, - - /* Windows fonts component */ - trace_winfnt, - - /* PCF fonts component */ - trace_pcfdriver, - trace_pcfread, - - /* the last level must always be `trace_max' */ - trace_max +# include FT_INTERNAL_TRACE_H + trace_count, } FT_Trace; - /* declared in ftdebug.c */ - extern char ft_trace_levels[trace_max]; + /* defining the array of trace levels, provided by 'src/base/ftdebug.c' */ + extern int ft_trace_levels [ trace_count ]; + +# undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + /*************************************************************************/ /* */ + /* Define the FT_TRACE macro */ + /* */ /* IMPORTANT! */ /* */ /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ @@ -127,90 +76,20 @@ FT_BEGIN_HEADER /* */ /*************************************************************************/ +#ifdef FT_DEBUG_LEVEL_TRACE -#define FT_TRACE( level, varformat ) \ +# define FT_TRACE( level, varformat ) \ do \ { \ if ( ft_trace_levels[FT_COMPONENT] >= level ) \ FT_Message varformat; \ } while ( 0 ) +#else /* !FT_DEBUG_LEVEL_TRACE */ - /*************************************************************************/ - /* */ - /* */ - /* FT_SetTraceLevel */ - /* */ - /* */ - /* Sets the trace level for debugging. */ - /* */ - /* */ - /* component :: The component which should be traced. See above for */ - /* a complete list. If set to `trace_any', all */ - /* components will be traced. */ - /* */ - /* level :: The tracing level. */ - /* */ - FT_EXPORT( void ) - FT_SetTraceLevel( FT_Trace component, - char level ); - - -#elif defined( FT_DEBUG_LEVEL_ERROR ) - - -#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ - - -#else /* release mode */ - - -#define FT_Assert( condition ) do ; while ( 0 ) /* nothing */ - -#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ -#define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ - - -#endif /* FT_DEBUG_LEVEL_TRACE, FT_DEBUG_LEVEL_ERROR */ - - - /*************************************************************************/ - /* */ - /* Define macros and functions that are common to the debug and trace */ - /* modes. */ - /* */ - /* You need vprintf() to be able to compile ftdebug.c. */ - /* */ - /*************************************************************************/ - - -#if defined( FT_DEBUG_LEVEL_TRACE ) || defined( FT_DEBUG_LEVEL_ERROR ) - - -#include "stdio.h" /* for vprintf() */ - - -#define FT_Assert( condition ) \ - do \ - { \ - if ( !( condition ) ) \ - FT_Panic( "assertion failed on line %d of file %s\n", \ - __LINE__, __FILE__ ); \ - } while ( 0 ) - - /* print a message */ - FT_EXPORT( void ) - FT_Message( const char* fmt, ... ); - - /* print a message and exit */ - FT_EXPORT( void ) - FT_Panic( const char* fmt, ... ); - -#define FT_ERROR( varformat ) FT_Message varformat - - -#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */ +# define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ +#endif /* !FT_DEBUG_LEVEL_TRACE */ /*************************************************************************/ /* */ @@ -230,6 +109,72 @@ FT_BEGIN_HEADER #define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + /*************************************************************************/ + /* */ + /* Define the FT_ERROR macro */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +# define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +# define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define the FT_ASSERT macro */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +# define FT_ASSERT( condition ) do ; while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define 'FT_Message' and 'FT_Panic' when needed */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vprintf() */ + + /* print a message */ + FT_EXPORT( void ) + FT_Message( const char* fmt, ... ); + + /* print a message and exit */ + FT_EXPORT( void ) + FT_Panic( const char* fmt, ... ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + + FT_BASE( void ) ft_debug_init( void ); + + #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ /* we disable the warning `conditional expression is constant' here */ diff --git a/include/freetype/internal/ftextend.h b/include/freetype/internal/ftextend.h deleted file mode 100644 index 8257a2a3b..000000000 --- a/include/freetype/internal/ftextend.h +++ /dev/null @@ -1,211 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftextend.h */ -/* */ -/* FreeType extensions implementation (specification). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTEXTEND_H__ -#define __FTEXTEND_H__ - - -#include -#include FT_INTERNAL_OBJECTS_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* The extensions don't need to be integrated at compile time into the */ - /* engine, only at link time. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Extension_Initializer */ - /* */ - /* */ - /* Each new face object can have several extensions associated with */ - /* it at creation time. This function is used to initialize given */ - /* extension data for a given face. */ - /* */ - /* */ - /* ext :: A typeless pointer to the extension data. */ - /* */ - /* face :: A handle to the source face object the extension is */ - /* associated with. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* In case of error, the initializer should not destroy the extension */ - /* data, as the finalizer will get called later by the function's */ - /* caller. */ - /* */ - typedef FT_Error - (*FT_Extension_Initializer)( void* ext, - FT_Face face ); - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Extension_Finalizer */ - /* */ - /* */ - /* Each new face object can have several extensions associated with */ - /* it at creation time. This function is used to finalize given */ - /* extension data for a given face; it occurs before the face object */ - /* itself is finalized. */ - /* */ - /* */ - /* ext :: A typeless pointer to the extension data. */ - /* */ - /* face :: A handle to the source face object the extension is */ - /* associated with. */ - /* */ - typedef void - (*FT_Extension_Finalizer)( void* ext, - FT_Face face ); - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Extension_Class */ - /* */ - /* */ - /* A simple structure used to describe a given extension to the */ - /* FreeType base layer. An FT_Extension_Class is used as a parameter */ - /* for FT_Register_Extension(). */ - /* */ - /* */ - /* id :: The extension's ID. This is a normal C string that */ - /* is used to uniquely reference the extension's */ - /* interface. */ - /* */ - /* size :: The size in bytes of the extension data that must be */ - /* associated with each face object. */ - /* */ - /* init :: A pointer to the extension data's initializer. */ - /* */ - /* finalize :: A pointer to the extension data's finalizer. */ - /* */ - /* interface :: This pointer can be anything, but should usually */ - /* point to a table of function pointers which implement */ - /* the extension's interface. */ - /* */ - /* offset :: This field is set and used within the base layer and */ - /* should be set to 0 when registering an extension */ - /* through FT_Register_Extension(). It contains an */ - /* offset within the face's extension block for the */ - /* current extension's data. */ - /* */ - typedef struct FT_Extension_Class_ - { - const char* id; - FT_ULong size; - FT_Extension_Initializer init; - FT_Extension_Finalizer finalize; - void* interface; - - FT_ULong offset; - - } FT_Extension_Class; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Register_Extension */ - /* */ - /* */ - /* Registers a new extension. */ - /* */ - /* */ - /* driver :: A handle to the driver object. */ - /* */ - /* class :: A pointer to a class describing the extension. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Register_Extension( FT_Driver driver, - FT_Extension_Class* clazz ); - - -#ifdef FT_CONFIG_OPTION_EXTEND_ENGINE - - - /* Initialize the extension component */ - FT_LOCAL FT_Error - FT_Init_Extensions( FT_Library library ); - - /* Finalize the extension component */ - FT_LOCAL FT_Error - FT_Done_Extensions( FT_Library library ); - - /* Create an extension within a face object. Called by the */ - /* face object constructor. */ - FT_LOCAL FT_Error - FT_Create_Extensions( FT_Face face ); - - /* Destroy all extensions within a face object. Called by the */ - /* face object destructor. */ - FT_LOCAL FT_Error - FT_Destroy_Extensions( FT_Face face ); - - -#endif - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Get_Extension */ - /* */ - /* */ - /* Queries an extension block by an extension ID string. */ - /* */ - /* */ - /* face :: A handle to the face object. */ - /* extension_id :: An ID string identifying the extension. */ - /* */ - /* */ - /* extension_interface :: A generic pointer, usually pointing to a */ - /* table of functions implementing the */ - /* extension interface. */ - /* */ - /* */ - /* A generic pointer to the extension block. */ - /* */ - FT_EXPORT( void* ) - FT_Get_Extension( FT_Face face, - const char* extension_id, - void** extension_interface ); - - -FT_END_HEADER - -#endif /* __FTEXTEND_H__ */ - - -/* END */ diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h index 755faf810..43a44d0c7 100644 --- a/include/freetype/internal/ftobjs.h +++ b/include/freetype/internal/ftobjs.h @@ -26,7 +26,7 @@ #ifndef __FTOBJS_H__ #define __FTOBJS_H__ - +#include #include #include FT_RENDER_H #include FT_SIZES_H @@ -445,6 +445,171 @@ FT_BEGIN_HEADER FT_GlyphLoader* source ); + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T O R ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FT_ValidatorRec_* FT_Validator; + +/********************************************************************* + * + * there are three distinct validation levels here: + * + * DEFAULT :: + * used to perform normal checks. A table validated with this setting + * is sufficiently correct to be used reliably by FreeType + * + * TIGHT :: + * this is more strict than default. A table validated with this setting + * is sufficiently correct to be used reliablity by FreeType and to not + * contain invalid data (that will not crash FreeType or produce bogus + * warnings). This is used to spot font converter/generation tool + * bugs.. + * + * for example, a CharMap table could map a given character code to + * a glyph index that is larger than the number of available glyphs + * in the font. Such a table would not pass the "TIGHT" validation + * even though it can be used safely with FreeType (which will later + * report errors when trying to load the glyph, for example..) + * + * + * PARANOID :: + * in this mode, everything is checked to the maximum, and according + * to the specification(s) defining the tables being checked. Really + * useful for font fascists and to spot really weird font artefacts. + * + * Beware that most fonts will simply not pass this validation level + * though !! + */ + typedef enum + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + +/********************************************************************** + * + * to use it, you need something like: + * + * valid->error = 0; + * + * if ( setjmp( valid->jump_buffer ) == 0 ) + * validate_table( table_data, .... ); + * + * return valid->error; + * + */ + typedef struct FT_ValidatorRec_ + { + FT_Byte* base; /* address of table in memory */ + FT_Byte* limit; /* base + size of table in bytes */ + + FT_Error error; /* error code. 0 in case of success */ + FT_ValidationLevel level; /* validation level.. */ + FT_UInt num_glyphs; /* if level >= FT_VALIDATE_TIGHT only */ + + jmp_buf jump_buffer; + + } FT_ValidatorRec; + + + /* call this function when an error is detected during validation. this */ + /* will set the error and call 'longjmp' to return to the top-level */ + /* caller of the validation routine.. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + /* this macro assumes that the local variable 'valid' points to the */ + /* current validator structure.. */ +#define FT_INVALID(e) ft_validator_error( valid, e ) + + /* a few "common" errors in font tables */ +#define FT_INVALID_TOO_SHORT FT_INVALID( FT_Err_Invalid_Table ) +#define FT_INVALID_OFFSET FT_INVALID( FT_Err_Invalid_Offset ) +#define FT_INVALID_GLYPH_ID FT_INVALID( FT_Err_Invalid_Table ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + + /* internal charmap object structure, sub-class of 'FT_CharMapRec' */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + FT_Pointer data; /* passed to validate/index/next methods */ + + } FT_CMapRec; + + /* useful macros */ +#define FT_CMAP(x) ((FT_CMap)(x)) +#define FT_CMAP_FACE(x) (FT_CMAP(x)->charmap.face) +#define FT_CMAP_PLATFORM_ID(x) (FT_CMAP(x)->charmap.platform_id) +#define FT_CMAP_ENCODING_ID(x) (FT_CMAP(x)->charmap.encoding_id) +#define FT_CMAP_ENCODING(x) (FT_CMAP(x)->charmap.encoding) + + + /* charmap initializer */ + typedef FT_Error (*FT_CMap_InitFunc)( FT_CMap cmap ); + + /* charmap finalizer */ + typedef void (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + /* charmap validation routine */ + typedef FT_Error (*FT_CMap_ValidateFunc)( FT_Pointer cmap_data, + FT_Validator valid ); + + /* charmap charcode to glyph index mapping function */ + typedef FT_UInt (*FT_CMap_CharIndexFunc)( FT_Pointer cmap_data, + FT_ULong char_code ); + + /* charmap charcode increment function */ + typedef FT_ULong (*FT_CMap_CharNextFunc)( FT_Pointer cmap_data, + FT_ULong char_code, + FT_UInt *agindex ); + + /* charmap class */ + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; /* size in bytes */ + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_ValidateFunc validate; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + } FT_CMap_ClassRec; + + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h new file mode 100644 index 000000000..f1e9d6eb9 --- /dev/null +++ b/include/freetype/internal/fttrace.h @@ -0,0 +1,75 @@ +/* definitions of trace levels for FreeType 2 */ + +/* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + +/* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ + +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ + +/* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc..) */ + +/* SFNT driver components */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ + +/* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ + +/* Type 1 driver components */ +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1hint ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + +/* PostScript helper module `psaux' */ +FT_TRACE_DEF( t1decode ) +FT_TRACE_DEF( psobjs ) + +/* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshrec ) +FT_TRACE_DEF( pshalgo1 ) +FT_TRACE_DEF( pshalgo2 ) + +/* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + +/* CID driver components */ +FT_TRACE_DEF( cidafm ) +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + +/* Windows fonts component */ +FT_TRACE_DEF( winfnt ) + +/* PCF fonts component */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) diff --git a/include/freetype/internal/internal.h b/include/freetype/internal/internal.h index cad39bbf8..32a06f9d1 100644 --- a/include/freetype/internal/internal.h +++ b/include/freetype/internal/internal.h @@ -32,6 +32,7 @@ #define FT_INTERNAL_CALC_H #define FT_INTERNAL_DRIVER_H #define FT_INTERNAL_EXTEND_H +#define FT_INTERNAL_TRACE_H #define FT_INTERNAL_SFNT_H diff --git a/src/base/Jamfile b/src/base/Jamfile index a31091432..5c2f5a6ad 100644 --- a/src/base/Jamfile +++ b/src/base/Jamfile @@ -10,7 +10,7 @@ SubDirHdrs [ FT2_SubDir src base ] ; if $(FT2_MULTI) { - _sources = ftcalc ftextend ftlist ftobjs ftstream ftoutln ftnames fttrigon + _sources = ftcalc ftlist ftobjs ftstream ftoutln ftnames fttrigon ftdbgmem ; } else diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c index 6a3fc498f..ea4033ab0 100644 --- a/src/base/ftdebug.c +++ b/src/base/ftdebug.c @@ -45,12 +45,7 @@ #include FT_INTERNAL_DEBUG_H -#ifdef FT_DEBUG_LEVEL_TRACE - char ft_trace_levels[trace_max]; -#endif - - -#if defined( FT_DEBUG_LEVEL_ERROR ) || defined( FT_DEBUG_LEVEL_TRACE ) +#if defined( FT_DEBUG_LEVEL_ERROR ) #include @@ -83,36 +78,123 @@ exit( EXIT_FAILURE ); } +#endif /* FT_DEBUG_LEVEL_ERROR */ + + #ifdef FT_DEBUG_LEVEL_TRACE - FT_EXPORT_DEF( void ) - FT_SetTraceLevel( FT_Trace component, - char level ) + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[ trace_count ]; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF(x) #x , + + static const char* ft_trace_toggles[ trace_count+1 ] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + + /************************************************************************ + * + * initialize the tracing sub-system, this is done by retrieving the + * value of the "FT2_DEBUG" environment variable. It must be a list of + * toggles, separated by spaces, ';' or ':' for example: + * + * "any=3 memory=6 stream=5" + * + * will request that all levels be set to 3, except the trace level for + * the memory and stream components which are respectively set to 6 and 5 + * + * see the file for details of the available + * toggle names. + * + * the level is between 0 and 6, where 0 is quiet (except in important + * runtime errors), and 6 is _very_ verbose + */ + + FT_BASE_DEF( void ) + ft_debug_init( void ) { - if ( component >= trace_max ) - return; - - /* if component is `trace_any', change _all_ levels at once */ - if ( component == trace_any ) + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + if ( ft2_debug ) { - int n; - - - for ( n = trace_any; n < trace_max; n++ ) - ft_trace_levels[n] = level; + const char* p = ft2_debug; + const char* q; + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ':' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by '=' */ + q = p; + while ( *p && *p != '=' ) + p++; + + if ( *p == '=' && p > q ) + { + int n, i, len = p - q; + int level = -1, found = -1; + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 6 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for "any" */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[ found ] = level; + } + } + } } - else /* otherwise, only change individual component */ - ft_trace_levels[component] = level; } -#endif /* FT_DEBUG_LEVEL_TRACE */ +#else /* !FT_DEBUG_LEVEL_TRACE */ -#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */ + FT_BASE_DEF( void ) + ft_debut_init( void ) + { + /* nothing */ + } - - /* ANSI C doesn't allow empty files, so we insert a dummy symbol */ - extern const int ft_debug_dummy; +#endif /* !FT_DEBUG_LEVEL_TRACE */ /* END */ diff --git a/src/base/ftextend.c b/src/base/ftextend.c deleted file mode 100644 index cafb2844a..000000000 --- a/src/base/ftextend.c +++ /dev/null @@ -1,302 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftextend.c */ -/* */ -/* FreeType extensions implementation (body). */ -/* */ -/* Copyright 1996-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* This is an updated version of the extension component, now located */ - /* in the main library's source directory. It allows the dynamic */ - /* registration/use of various face object extensions through a simple */ - /* API. */ - /* */ - /*************************************************************************/ - - -#include -#include FT_INTERNAL_EXTEND_H -#include FT_INTERNAL_DEBUG_H - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_extend - - - typedef struct FT_Extension_Registry_ - { - FT_Int num_extensions; - FT_Long cur_offset; - FT_Extension_Class classes[FT_MAX_EXTENSIONS]; - - } FT_Extension_Registry; - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Init_Extensions */ - /* */ - /* */ - /* Initializes the extension component. */ - /* */ - /* */ - /* driver :: A handle to the driver object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF FT_Error - FT_Init_Extensions( FT_Driver driver ) - { - FT_Error error; - FT_Memory memory; - FT_Extension_Registry* registry; - - - memory = driver->root.library->memory; - if ( ALLOC( registry, sizeof ( *registry ) ) ) - return error; - - registry->num_extensions = 0; - registry->cur_offset = 0; - driver->extensions = registry; - - FT_TRACE2(( "FT_Init_Extensions: success\n" )); - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Done_Extensions */ - /* */ - /* */ - /* Finalizes the extension component. */ - /* */ - /* */ - /* driver :: A handle to the driver object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF FT_Error - FT_Done_Extensions( FT_Driver driver ) - { - FT_Memory memory = driver->root.memory; - - - FREE( driver->extensions ); - return FT_Err_Ok; - } - - - /* documentation is in ftextend.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Register_Extension( FT_Driver driver, - FT_Extension_Class* clazz ) - { - FT_Extension_Registry* registry; - - - if ( !driver ) - return FT_Err_Invalid_Driver_Handle; - - if ( !clazz ) - return FT_Err_Invalid_Argument; - - registry = (FT_Extension_Registry*)driver->extensions; - if ( registry ) - { - FT_Int n = registry->num_extensions; - FT_Extension_Class* cur = registry->classes + n; - - - if ( n >= FT_MAX_EXTENSIONS ) - return FT_Err_Too_Many_Extensions; - - *cur = *clazz; - - cur->offset = registry->cur_offset; - - registry->num_extensions++; - registry->cur_offset += - ( cur->size + FT_ALIGNMENT - 1 ) & -FT_ALIGNMENT; - - FT_TRACE1(( "FT_Register_Extension: `%s' successfully registered\n", - cur->id )); - } - - return FT_Err_Ok; - } - - - /* documentation is in ftextend.h */ - - FT_EXPORT_DEF( void* ) - FT_Get_Extension( FT_Face face, - const char* extension_id, - void** extension_interface ) - { - FT_Extension_Registry* registry; - - - if ( !face || !extension_id || !extension_interface ) - return 0; - - registry = (FT_Extension_Registry*)face->driver->extensions; - if ( registry && face->extensions ) - { - FT_Extension_Class* cur = registry->classes; - FT_Extension_Class* limit = cur + registry->num_extensions; - - - for ( ; cur < limit; cur++ ) - if ( strcmp( cur->id, extension_id ) == 0 ) - { - *extension_interface = cur->interface; - - FT_TRACE1(( "FT_Get_Extension: got `%s'\n", extension_id )); - - return (void*)((char*)face->extensions + cur->offset); - } - } - - /* could not find the extension id */ - - FT_ERROR(( "FT_Get_Extension: couldn't find `%s'\n", extension_id )); - - *extension_interface = 0; - - return 0; - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Destroy_Extensions */ - /* */ - /* */ - /* Destroys all extensions within a face object. */ - /* */ - /* */ - /* face :: A handle to the face object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Called by the face object destructor. */ - /* */ - FT_LOCAL_DEF FT_Error - FT_Destroy_Extensions( FT_Face face ) - { - FT_Extension_Registry* registry; - FT_Memory memory; - - - registry = (FT_Extension_Registry*)face->driver->extensions; - if ( registry && face->extensions ) - { - FT_Extension_Class* cur = registry->classes; - FT_Extension_Class* limit = cur + registry->num_extensions; - - - for ( ; cur < limit; cur++ ) - { - char* ext = (char*)face->extensions + cur->offset; - - if ( cur->finalize ) - cur->finalize( ext, face ); - } - - memory = face->driver->root.memory; - FREE( face->extensions ); - } - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* */ - /* FT_Create_Extensions */ - /* */ - /* */ - /* Creates an extension object within a face object for all */ - /* registered extensions. */ - /* */ - /* */ - /* face :: A handle to the face object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* Called by the face object constructor. */ - /* */ - FT_LOCAL_DEF FT_Error - FT_Create_Extensions( FT_Face face ) - { - FT_Extension_Registry* registry; - FT_Memory memory; - FT_Error error; - - - face->extensions = 0; - - /* load extensions registry; exit successfully if none is there */ - - registry = (FT_Extension_Registry*)face->driver->extensions; - if ( !registry ) - return FT_Err_Ok; - - memory = face->driver->root.memory; - if ( ALLOC( face->extensions, registry->cur_offset ) ) - return error; - - { - FT_Extension_Class* cur = registry->classes; - FT_Extension_Class* limit = cur + registry->num_extensions; - - - for ( ; cur < limit; cur++ ) - { - char* ext = (char*)face->extensions + cur->offset; - - if ( cur->init ) - { - error = cur->init( ext, face ); - if ( error ) - break; - } - } - } - - return error; - } - - -/* END */ diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 21a6be0f5..1b78c9d41 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -57,7 +57,7 @@ FT_Long size, void* *P ) { - FT_Assert( P != 0 ); + FT_ASSERT( P != 0 ); if ( size > 0 ) { @@ -94,7 +94,7 @@ void* Q; - FT_Assert( P != 0 ); + FT_ASSERT( P != 0 ); /* if the original pointer is NULL, call FT_Alloc() */ if ( !*P ) diff --git a/src/base/ftstream.c b/src/base/ftstream.c index 96683a2d9..3fc40f9f7 100644 --- a/src/base/ftstream.c +++ b/src/base/ftstream.c @@ -201,7 +201,7 @@ /* check for nested frame access */ - FT_Assert( stream && stream->cursor == 0 ); + FT_ASSERT( stream && stream->cursor == 0 ); if ( stream->read ) { @@ -265,7 +265,7 @@ /* gracefully; however, stream.cursor is really set to 0 by the */ /* FT_Access_Frame() call, and this is not an error. */ /* */ - FT_Assert( stream ); + FT_ASSERT( stream ); if ( stream->read ) { @@ -285,7 +285,7 @@ FT_Char result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; if ( stream->cursor < stream->limit ) @@ -302,7 +302,7 @@ FT_Short result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; p = stream->cursor; @@ -321,7 +321,7 @@ FT_Short result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; p = stream->cursor; @@ -340,7 +340,7 @@ FT_Long result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; p = stream->cursor; @@ -358,7 +358,7 @@ FT_Long result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; p = stream->cursor; @@ -376,7 +376,7 @@ FT_Long result; - FT_Assert( stream && stream->cursor ); + FT_ASSERT( stream && stream->cursor ); result = 0; p = stream->cursor; @@ -394,7 +394,7 @@ FT_Byte result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; @@ -433,7 +433,7 @@ FT_Short result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; @@ -480,7 +480,7 @@ FT_Short result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; @@ -527,7 +527,7 @@ FT_Long result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; @@ -574,7 +574,7 @@ FT_Long result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; @@ -621,7 +621,7 @@ FT_Long result = 0; - FT_Assert( stream ); + FT_ASSERT( stream ); *error = FT_Err_Ok; diff --git a/src/base/rules.mk b/src/base/rules.mk index 8c3bbd4e9..2c6df87b0 100644 --- a/src/base/rules.mk +++ b/src/base/rules.mk @@ -34,7 +34,6 @@ BASE_COMPILE := $(FT_COMPILE) $I$(SRC_)base # BASE_SRC := $(BASE_)ftcalc.c \ $(BASE_)fttrigon.c \ - $(BASE_)ftextend.c \ $(BASE_)ftlist.c \ $(BASE_)ftobjs.c \ $(BASE_)ftstream.c \ diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c index a1d874cae..bbc526584 100644 --- a/src/pshinter/pshalgo2.c +++ b/src/pshinter/pshalgo2.c @@ -523,7 +523,7 @@ #include static void - print_zone( PSH2_Zone zone ) + psh2_print_zone( PSH2_Zone zone ) { printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", zone->scale/65536.0, @@ -534,7 +534,7 @@ #else -#define print_zone( x ) do { } while ( 0 ) +#define psh2_print_zone( x ) do { } while ( 0 ) #endif @@ -576,7 +576,7 @@ zone->min = PSH2_ZONE_MIN; zone->max = hint->org_pos; - print_zone( zone ); + psh2_print_zone( zone ); zone++; @@ -597,7 +597,7 @@ zone->max = hint->org_pos + hint->org_len; zone->delta = hint->cur_pos - FT_MulFix( zone->min, scale2 ); - print_zone( zone ); + psh2_print_zone( zone ); zone++; } @@ -620,7 +620,7 @@ zone->delta = hint->cur_pos + hint->cur_len - FT_MulFix( zone->min, scale2 ); - print_zone( zone ); + psh2_print_zone( zone ); zone++; @@ -634,7 +634,7 @@ zone->delta = hint->cur_pos + hint->cur_len - FT_MulFix( zone->min, scale ); - print_zone( zone ); + psh2_print_zone( zone ); zone++; diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index e6d361b81..cc47c18f6 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -96,7 +96,7 @@ /* messages during execution. */ /* */ #undef FT_COMPONENT -#define FT_COMPONENT trace_aaraster +#define FT_COMPONENT trace_smooth #define ErrRaster_MemoryOverflow -4