nuclear@0: /***************************************************************************/ nuclear@0: /* */ nuclear@0: /* ftdebug.h */ nuclear@0: /* */ nuclear@0: /* Debugging and logging component (specification). */ nuclear@0: /* */ nuclear@0: /* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008, 2009 by */ nuclear@0: /* David Turner, Robert Wilhelm, and Werner Lemberg. */ nuclear@0: /* */ nuclear@0: /* This file is part of the FreeType project, and may only be used, */ nuclear@0: /* modified, and distributed under the terms of the FreeType project */ nuclear@0: /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ nuclear@0: /* this file you indicate that you have read the license and */ nuclear@0: /* understand and accept it fully. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* IMPORTANT: A description of FreeType's debugging support can be */ nuclear@0: /* found in `docs/DEBUG.TXT'. Read it if you need to use or */ nuclear@0: /* understand this code. */ nuclear@0: /* */ nuclear@0: /***************************************************************************/ nuclear@0: nuclear@0: nuclear@0: #ifndef __FTDEBUG_H__ nuclear@0: #define __FTDEBUG_H__ nuclear@0: nuclear@0: nuclear@0: #include nuclear@0: #include FT_CONFIG_CONFIG_H nuclear@0: #include FT_FREETYPE_H nuclear@0: nuclear@0: nuclear@0: FT_BEGIN_HEADER nuclear@0: nuclear@0: nuclear@0: /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ nuclear@0: /* is already defined; this simplifies the following #ifdefs */ nuclear@0: /* */ nuclear@0: #ifdef FT_DEBUG_LEVEL_TRACE nuclear@0: #undef FT_DEBUG_LEVEL_ERROR nuclear@0: #define FT_DEBUG_LEVEL_ERROR nuclear@0: #endif nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* Define the trace enums as well as the trace levels array when they */ nuclear@0: /* are needed. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #ifdef FT_DEBUG_LEVEL_TRACE nuclear@0: nuclear@0: #define FT_TRACE_DEF( x ) trace_ ## x , nuclear@0: nuclear@0: /* defining the enumeration */ nuclear@0: typedef enum FT_Trace_ nuclear@0: { nuclear@0: #include FT_INTERNAL_TRACE_H nuclear@0: trace_count nuclear@0: nuclear@0: } FT_Trace; nuclear@0: nuclear@0: nuclear@0: /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ nuclear@0: extern int ft_trace_levels[trace_count]; nuclear@0: nuclear@0: #undef FT_TRACE_DEF nuclear@0: nuclear@0: #endif /* FT_DEBUG_LEVEL_TRACE */ nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* Define the FT_TRACE macro */ nuclear@0: /* */ nuclear@0: /* IMPORTANT! */ nuclear@0: /* */ nuclear@0: /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ nuclear@0: /* value before using any TRACE macro. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #ifdef FT_DEBUG_LEVEL_TRACE nuclear@0: nuclear@0: #define FT_TRACE( level, varformat ) \ nuclear@0: do \ nuclear@0: { \ nuclear@0: if ( ft_trace_levels[FT_COMPONENT] >= level ) \ nuclear@0: FT_Message varformat; \ nuclear@0: } while ( 0 ) nuclear@0: nuclear@0: #else /* !FT_DEBUG_LEVEL_TRACE */ nuclear@0: nuclear@0: #define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ nuclear@0: nuclear@0: #endif /* !FT_DEBUG_LEVEL_TRACE */ nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* FT_Trace_Get_Count */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* Return the number of available trace components. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* The number of trace components. 0 if FreeType 2 is not built with */ nuclear@0: /* FT_DEBUG_LEVEL_TRACE definition. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* This function may be useful if you want to access elements of */ nuclear@0: /* the internal `ft_trace_levels' array by an index. */ nuclear@0: /* */ nuclear@0: FT_BASE( FT_Int ) nuclear@0: FT_Trace_Get_Count( void ); nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* FT_Trace_Get_Name */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* Return the name of a trace component. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* The index of the trace component. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* The name of the trace component. This is a statically allocated */ nuclear@0: /* C string, so do not free it after use. NULL if FreeType 2 is not */ nuclear@0: /* built with FT_DEBUG_LEVEL_TRACE definition. */ nuclear@0: /* */ nuclear@0: /* */ nuclear@0: /* Use @FT_Trace_Get_Count to get the number of available trace */ nuclear@0: /* components. */ nuclear@0: /* */ nuclear@0: /* This function may be useful if you want to control FreeType 2's */ nuclear@0: /* debug level in your application. */ nuclear@0: /* */ nuclear@0: FT_BASE( const char * ) nuclear@0: FT_Trace_Get_Name( FT_Int idx ); nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* You need two opening and closing parentheses! */ nuclear@0: /* */ nuclear@0: /* Example: FT_TRACE0(( "Value is %i", foo )) */ nuclear@0: /* */ nuclear@0: /* Output of the FT_TRACEX macros is sent to stderr. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) nuclear@0: #define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) nuclear@0: #define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) nuclear@0: #define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) nuclear@0: #define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) nuclear@0: #define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) nuclear@0: #define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) nuclear@0: #define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* Define the FT_ERROR macro. */ nuclear@0: /* */ nuclear@0: /* Output of this macro is sent to stderr. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #ifdef FT_DEBUG_LEVEL_ERROR nuclear@0: nuclear@0: #define FT_ERROR( varformat ) FT_Message varformat nuclear@0: nuclear@0: #else /* !FT_DEBUG_LEVEL_ERROR */ nuclear@0: nuclear@0: #define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ nuclear@0: nuclear@0: #endif /* !FT_DEBUG_LEVEL_ERROR */ nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* Define the FT_ASSERT macro. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #ifdef FT_DEBUG_LEVEL_ERROR nuclear@0: nuclear@0: #define FT_ASSERT( condition ) \ nuclear@0: do \ nuclear@0: { \ nuclear@0: if ( !( condition ) ) \ nuclear@0: FT_Panic( "assertion failed on line %d of file %s\n", \ nuclear@0: __LINE__, __FILE__ ); \ nuclear@0: } while ( 0 ) nuclear@0: nuclear@0: #else /* !FT_DEBUG_LEVEL_ERROR */ nuclear@0: nuclear@0: #define FT_ASSERT( condition ) do { } while ( 0 ) nuclear@0: nuclear@0: #endif /* !FT_DEBUG_LEVEL_ERROR */ nuclear@0: nuclear@0: nuclear@0: /*************************************************************************/ nuclear@0: /* */ nuclear@0: /* Define `FT_Message' and `FT_Panic' when needed. */ nuclear@0: /* */ nuclear@0: /*************************************************************************/ nuclear@0: nuclear@0: #ifdef FT_DEBUG_LEVEL_ERROR nuclear@0: nuclear@0: #include "stdio.h" /* for vfprintf() */ nuclear@0: nuclear@0: /* print a message */ nuclear@0: FT_BASE( void ) nuclear@0: FT_Message( const char* fmt, nuclear@0: ... ); nuclear@0: nuclear@0: /* print a message and exit */ nuclear@0: FT_BASE( void ) nuclear@0: FT_Panic( const char* fmt, nuclear@0: ... ); nuclear@0: nuclear@0: #endif /* FT_DEBUG_LEVEL_ERROR */ nuclear@0: nuclear@0: nuclear@0: FT_BASE( void ) nuclear@0: ft_debug_init( void ); nuclear@0: nuclear@0: nuclear@0: #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ nuclear@0: nuclear@0: /* We disable the warning `conditional expression is constant' here */ nuclear@0: /* in order to compile cleanly with the maximum level of warnings. */ nuclear@0: #pragma warning( disable : 4127 ) nuclear@0: nuclear@0: #endif /* _MSC_VER */ nuclear@0: nuclear@0: nuclear@0: FT_END_HEADER nuclear@0: nuclear@0: #endif /* __FTDEBUG_H__ */ nuclear@0: nuclear@0: nuclear@0: /* END */