summaryrefslogtreecommitdiff
path: root/builds/windows/ftdebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'builds/windows/ftdebug.c')
-rw-r--r--builds/windows/ftdebug.c243
1 files changed, 241 insertions, 2 deletions
diff --git a/builds/windows/ftdebug.c b/builds/windows/ftdebug.c
index d58949003..eba7ca9e7 100644
--- a/builds/windows/ftdebug.c
+++ b/builds/windows/ftdebug.c
@@ -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 */