forked from minhngoc25a/freetype2
Started adding the support of logging on windows
This commit is contained in:
parent
708d8098ec
commit
e854adc669
|
@ -1,3 +1,10 @@
|
|||
2020-07-15 Priyesh Kumar <priyeshkkumar@gmail.com>
|
||||
|
||||
* builds\compiler\gcc.mk: Added a flag -std=c99 for using dlg on windows
|
||||
|
||||
* builds\windows\ftdebug.c: Added support for using `FT_LOGGING` on
|
||||
windows.
|
||||
|
||||
2020-07-13 Priyesh Kumar <priyeshkkumar@gmail.com>
|
||||
|
||||
* include/freetype/ftlogging.h: Changed the definition of callback
|
||||
|
|
|
@ -61,7 +61,7 @@ T := -o$(space)
|
|||
# Use the ANSIFLAGS variable to define the compiler flags used to enfore
|
||||
# ANSI compliance.
|
||||
#
|
||||
CFLAGS ?= -c -g -O3 -Wall
|
||||
CFLAGS ?= -c -g -O3 -Wall -std=c99
|
||||
|
||||
# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
|
||||
#
|
||||
|
|
|
@ -44,6 +44,62 @@
|
|||
#include <freetype/freetype.h>
|
||||
#include <freetype/internal/ftdebug.h>
|
||||
|
||||
#ifdef FT_LOGGING
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Variable used when FT_LOGGING is enabled to control logging:
|
||||
*
|
||||
* 1. ft_default_trace_level: stores the value of trace levels which are
|
||||
* provided to FreeType using FT2_DEBUG environment variable.
|
||||
*
|
||||
* 2. ft_custom_trace_level: stores the value of custom trace level which
|
||||
* is provided by user at run-time.
|
||||
*
|
||||
* 3. ft_component: a string that holds the name of FT_COMPONENT
|
||||
*
|
||||
* 4. ft_fileptr: store the FILE*
|
||||
*
|
||||
* 5. ft_component_flag: a flag when is true, prints FT_COMPONENT along
|
||||
* with log message if `-v` is defined in FT2_DEBUG
|
||||
* 6. ft_timestamp_flag: a flag when is true, prints time in millisec along
|
||||
* with log message if `-t` is define in FT2_DEBUG
|
||||
* 7. ft_have_newline_char: It is used to differentiate between a log
|
||||
* message with '\n' char and log message without '\n' char
|
||||
*
|
||||
* Static Variables are defined here to remove [ -Wunused-variable ]
|
||||
* warning
|
||||
*
|
||||
*/
|
||||
static const char* ft_default_trace_level = NULL;
|
||||
static const char* ft_custom_trace_level = NULL;
|
||||
static const char* ft_component = NULL;
|
||||
static FILE* ft_fileptr = NULL;
|
||||
static bool ft_component_flag = false;
|
||||
static bool ft_timestamp_flag = false;
|
||||
static bool ft_have_newline_char = true;
|
||||
|
||||
ft_custom_log_handler custom_output_handler = NULL;
|
||||
dlg_handler ft_default_log_handler = NULL;
|
||||
|
||||
/* different types of dlg features to be used according to the flags */
|
||||
/* passed in FT2_DEBUG environment variable */
|
||||
|
||||
static unsigned int features_component = dlg_output_threadsafe
|
||||
| dlg_output_tags;
|
||||
static unsigned int features_timestamp = dlg_output_threadsafe
|
||||
| dlg_output_time
|
||||
| dlg_output_time_msecs;
|
||||
static unsigned int features_both = dlg_output_threadsafe
|
||||
| dlg_output_time_msecs
|
||||
|dlg_output_time
|
||||
| dlg_output_tags ;
|
||||
static unsigned int features_none = dlg_output_threadsafe;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef FT_DEBUG_LEVEL_ERROR
|
||||
|
||||
|
@ -207,7 +263,18 @@
|
|||
FT_BASE_DEF( void )
|
||||
ft_debug_init( void )
|
||||
{
|
||||
const char* ft2_debug = getenv( "FT2_DEBUG" );
|
||||
const char* ft2_debug = NULL;
|
||||
|
||||
#ifdef FT_LOGGING
|
||||
|
||||
if( ft_custom_trace_level != NULL )
|
||||
ft2_debug = ft_custom_trace_level;
|
||||
else
|
||||
ft2_debug = ft_default_trace_level;
|
||||
|
||||
#else
|
||||
ft2_debug = ft_getenv( "FT2_DEBUG" );
|
||||
#endif /* FT_LOGGIGN */
|
||||
|
||||
|
||||
if ( ft2_debug )
|
||||
|
@ -218,10 +285,40 @@
|
|||
|
||||
for ( ; *p; p++ )
|
||||
{
|
||||
|
||||
/* skip leading whitespace and separators */
|
||||
if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
|
||||
continue;
|
||||
|
||||
#ifdef FT_LOGGING
|
||||
/* check extra arguments for logging */
|
||||
if( *p == '-' )
|
||||
{
|
||||
const char* r = ++p;
|
||||
if( *r == 'v' )
|
||||
{
|
||||
ft_component_flag = true;
|
||||
const char* s = ++r;
|
||||
if( *s == 't' )
|
||||
{
|
||||
ft_timestamp_flag = true;
|
||||
p++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
else if( *r == 't' )
|
||||
{
|
||||
ft_timestamp_flag = true;
|
||||
const char* s = ++r;
|
||||
if( *s == 'v' )
|
||||
{
|
||||
ft_component_flag = true;
|
||||
p++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* read toggle name, followed by ':' */
|
||||
q = p;
|
||||
while ( *p && *p != ':' )
|
||||
|
@ -281,7 +378,6 @@
|
|||
ft_trace_levels = ft_trace_levels_enabled;
|
||||
}
|
||||
|
||||
|
||||
#else /* !FT_DEBUG_LEVEL_TRACE */
|
||||
|
||||
|
||||
|
@ -327,4 +423,147 @@
|
|||
#endif /* !FT_DEBUG_LEVEL_TRACE */
|
||||
|
||||
|
||||
#ifdef FT_LOGGING
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* If FT_LOGGING is enabled, FreeType needs to initialize all logging
|
||||
* variables to write logs.
|
||||
* Therefore it uses `ft_logging_init()` function to initialize a
|
||||
* loggging variables and `ft_logging_deinit()` to un-initialize the
|
||||
* logging variables.
|
||||
*
|
||||
*/
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_logging_init( void )
|
||||
{
|
||||
ft_default_log_handler = ft_log_handler;
|
||||
ft_default_trace_level = ft_getenv( "FT2_DEBUG" );
|
||||
ft_fileptr = fopen( "freetype2.log", "w" );
|
||||
|
||||
ft_debug_init();
|
||||
/* We need to set the default FreeType specific dlg's output handler */
|
||||
dlg_set_handler( ft_default_log_handler, NULL );
|
||||
|
||||
}
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_logging_deinit( void )
|
||||
{
|
||||
fclose( ft_fileptr );
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
* TODO:
|
||||
* 1. Add support for priniting FT_COMPONENT
|
||||
*
|
||||
*/
|
||||
FT_BASE_DEF( void )
|
||||
ft_log_handler( const struct dlg_origin* origin,
|
||||
const char* string, void* data )
|
||||
{
|
||||
static unsigned int features ;
|
||||
if( ft_timestamp_flag && ft_component_flag && ft_have_newline_char )
|
||||
features = features_both;
|
||||
else if( ft_component_flag && ft_have_newline_char)
|
||||
features = features_component;
|
||||
else if( ft_timestamp_flag && ft_have_newline_char )
|
||||
features = features_timestamp;
|
||||
else
|
||||
features = features_none;
|
||||
|
||||
|
||||
dlg_generic_output_stream( ft_fileptr, features, origin, string,
|
||||
dlg_default_output_styles );
|
||||
|
||||
if( strchr( string, '\n' ) )
|
||||
ft_have_newline_char = true;
|
||||
else
|
||||
ft_have_newline_char = false;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Functions to set trace levels at run-time
|
||||
* 1. FT_Trace_Set_Level() - Use this function to change the trace level
|
||||
* at run-time. e.g. FT_Trace_Set_Level( "any:6 io:2" );
|
||||
*
|
||||
* 2. FT_Trace_Set_Default_Level() - Use this function to set the default
|
||||
* value of trace levels which is provided by environment variable
|
||||
* FT2_DEBUG
|
||||
*
|
||||
*/
|
||||
|
||||
FT_EXPORT_DEF( void )
|
||||
FT_Trace_Set_Level( const char* level )
|
||||
{
|
||||
ft_custom_trace_level = level;
|
||||
ft_debug_init();
|
||||
}
|
||||
|
||||
FT_EXPORT_DEF( void )
|
||||
FT_Trace_Set_Default_Level( void )
|
||||
{
|
||||
ft_custom_trace_level = NULL ;
|
||||
ft_debug_init();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Functions to handle custom log handler:
|
||||
*
|
||||
*/
|
||||
|
||||
FT_EXPORT_DEF( void )
|
||||
FT_Set_Log_Handler( ft_custom_log_handler handler )
|
||||
{
|
||||
custom_output_handler = handler;
|
||||
}
|
||||
|
||||
FT_EXPORT_DEF( void )
|
||||
FT_Set_Default_Log_Handler()
|
||||
{
|
||||
custom_output_handler = NULL;
|
||||
}
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
FT_Callback( const char* fmt, ... )
|
||||
{
|
||||
va_list ap;
|
||||
va_start( ap, fmt );
|
||||
custom_output_handler( ft_component , fmt, ap );
|
||||
va_end( ap );
|
||||
}
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_add_tag( const char* tag )
|
||||
{
|
||||
ft_component = tag;
|
||||
dlg_add_tag( tag, NULL );
|
||||
}
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_remove_tag( const char* tag )
|
||||
{
|
||||
dlg_remove_tag( tag, NULL );
|
||||
}
|
||||
|
||||
#else /* ! FT_LOGGING */
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_add_tag( const char* tag )
|
||||
{
|
||||
/* nothing */
|
||||
}
|
||||
|
||||
FT_BASE_DEF( void )
|
||||
ft_remove_tag( const char* tag )
|
||||
{
|
||||
/* nothing */
|
||||
}
|
||||
|
||||
#endif /* FT_LOGGING*/
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -440,10 +440,15 @@ FT_BEGIN_HEADER
|
|||
* Enabling this macro will automatically force the `FT_DEBUG_LEVEL_ERROR`
|
||||
* and `FT_DEBUG_LEVEL_TRACE` macros and will allow FreeType to write
|
||||
* error and trace log messages to a file instead of `stderr`
|
||||
*
|
||||
* For writing logs to file FreeType uses an external library `dlg`
|
||||
* Source Code - `src/dlg`
|
||||
*
|
||||
* When on Windows platform, and using a static build of dlg to link
|
||||
* it with FreeType, Define the macro `DLG_STATIC` so that it gets
|
||||
* linked properly(see src/dlg/include/dlg.h:76)
|
||||
*/
|
||||
/* #define FT_LOGGING */
|
||||
|
||||
/* #define FT_LOGGING */
|
||||
/* #define DLG_STATIC */
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue