shithub: freetype+ttf2subf

Download patch

ref: d46bada285fb47549c26783bcb93efab4867ebc7
parent: 34b1c897c109d853fcae123f11a4bc756a5eca2f
author: Priyesh Kumar <[email protected]>
date: Wed Aug 26 13:41:43 EDT 2020

[base] Add functions and variables to print logs to a file.

* include/freetype/internal/ftdebug.h: Added dlg's header files.
(FT_LOG): New macro to redirect trace logs to dlg's API's whenever
`FT_LOGGING' is defined.
(ft_logging_init, ft_logging_deinit): New functions to handle
initialization and uninitialization of logging related variables.
(ft_log_handler): New function to handle logs of FreeType.

* src/base/ftdebug.c: Add necessary logging related variables.
(ft_logging_init, ft_logging_deinit, ft_log_handler): Add function
definitions.

* src/base/ftinit.c (FT_Init_FreeType) [FT_LOGGING]: Call
`ft_logging_init`.
(FT_Done_FreeType) [FT_LOGGING]: Call `ft_logging_deinit`.

* src/base/ftobjs.c (FT_New_Library): Call `ft_debug_init` only if
`FT_LOGGING` is not defined.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
 2020-11-27  Priyesh Kumar  <[email protected]>
 
+	[base] Add functions and variables to print logs to a file.
+
+	* include/freetype/internal/ftdebug.h: Added dlg's header files.
+	(FT_LOG): New macro to redirect trace logs to dlg's API's whenever
+	`FT_LOGGING' is defined.
+	(ft_logging_init, ft_logging_deinit): New functions to handle
+	initialization and uninitialization of logging related variables.
+	(ft_log_handler): New function to handle logs of FreeType.
+
+	* src/base/ftdebug.c: Add necessary logging related variables. 
+	(ft_logging_init, ft_logging_deinit, ft_log_handler): Add function
+	definitions.
+
+	* src/base/ftinit.c (FT_Init_FreeType) [FT_LOGGING]: Call
+	`ft_logging_init`.
+	(FT_Done_FreeType) [FT_LOGGING]: Call `ft_logging_deinit`.
+
+	* src/base/ftobjs.c (FT_New_Library): Call `ft_debug_init` only if
+	`FT_LOGGING` is not defined.
+
+2020-11-27  Priyesh Kumar  <[email protected]>
+
 	[builds] Necessary changes to make 'dlg' compile.
 
 	* autogen.sh (copy_submodule_files): New script to copy all the
@@ -38,7 +60,7 @@
 
 	* src/cff/cffobjs.c (cff_iriver_init): Always default to Adobe engine.
 	* src/cid/cidobjs.c (cid_driver_init): Ditto.
-        * src/type1/t1objs.c (T1_Driver_Init): Ditto.
+	* src/type1/t1objs.c (T1_Driver_Init): Ditto.
 
 2020-11-09  Werner Lemberg  <[email protected]>
 
--- a/include/freetype/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -31,9 +31,21 @@
 
 #include "compiler-macros.h"
 
+#ifdef FT_LOGGING
+#include <../src/dlg/dlg/dlg.h>
+#include <../src/dlg/dlg/output.h>
+#endif
 
+
 FT_BEGIN_HEADER
 
+  /* force the definition of FT_DEBUG_LEVEL_TRACE if FT_LOGGING is */
+  /* already defined.                                              */
+  /*                                                               */
+#ifdef FT_LOGGING
+#undef  FT_DEBUG_LEVEL_TRACE
+#define FT_DEBUG_LEVEL_TRACE
+#endif
 
   /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
   /* is already defined; this simplifies the following #ifdefs            */
@@ -84,19 +96,43 @@
    *
    */
 
-#ifdef FT_DEBUG_LEVEL_TRACE
 
-  /* we need two macros here to make cpp expand `FT_COMPONENT' */
-#define FT_TRACE_COMP( x )   FT_TRACE_COMP_( x )
-#define FT_TRACE_COMP_( x )  trace_ ## x
+  /*************************************************************************
+   *
+   * If FT_LOGGING is enabled, tracing messages are sent to dlg's API.
+   * If FT_LOGGING is disabled, tracing messages are sent to `FT_Message`
+   * (defined in ftdebug.c).
+   *
+   */
+#ifdef FT_LOGGING
 
-#define FT_TRACE( level, varformat )                                       \
+#define FT_LOG( level, varformat )                                         \
           do                                                               \
           {                                                                \
             if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
+              dlg_trace varformat;                                         \
+          } while( 0 )
+
+#else /* !FT_LOGGING */
+
+#define FT_LOG( level, varformat )                                         \
+          do                                                               \
+          {                                                                \
+            if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
               FT_Message varformat;                                        \
           } while ( 0 )
 
+#endif /* !FT_LOGGING */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* we need two macros here to make cpp expand `FT_COMPONENT' */
+#define FT_TRACE_COMP( x )   FT_TRACE_COMP_( x )
+#define FT_TRACE_COMP_( x )  trace_ ## x
+
+#define FT_TRACE( level, varformat )  FT_LOG( level, varformat )
+
 #else /* !FT_DEBUG_LEVEL_TRACE */
 
 #define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
@@ -204,8 +240,28 @@
 
 #ifdef FT_DEBUG_LEVEL_ERROR
 
-#define FT_ERROR( varformat )  FT_Message  varformat
+  /*************************************************************************
+   *
+   * If FT_LOGGING is enabled, error messages are sent to dlg's API.
+   * If FT_LOGGING is disabled, error messages are sent to `FT_Message`
+   * (defined in ftdebug.c).
+   *
+   */
+#ifdef FT_LOGGING
 
+#define FT_ERROR( varformat )    \
+          do                     \
+          {                      \
+            dlg_trace varformat; \
+          } while ( 0 )
+
+#else /* !FT_LOGGING */
+
+#define FT_ERROR( varformat )  FT_Message varformat
+
+#endif /* !FT_LOGGING */
+
+
 #else  /* !FT_DEBUG_LEVEL_ERROR */
 
 #define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */
@@ -276,6 +332,48 @@
 
   FT_BASE( void )
   ft_debug_init( void );
+
+
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * 'dlg' uses output handlers to control how and where log messages are
+   * printed.  Therefore we need to define a default output handler for
+   * FreeType.
+   */
+  FT_BASE( void )
+  ft_log_handler( const struct dlg_origin*  origin,
+                  const char*               string,
+                  void*                     data );
+
+
+  /**************************************************************************
+   *
+   * `ft_default_log_handler` stores the function pointer that is used
+   * internally by FreeType to print logs to a file.
+   *
+   * It is defined in `ftdebug.c`.
+   */
+  extern dlg_handler  ft_default_log_handler;
+
+
+  /**************************************************************************
+   *
+   * If FT_LOGGING macro is enabled, FreeType needs to initialize and
+   * un-initialize `FILE*`.
+   *
+   * These functions are defined in `ftdebug.c`.
+   *
+   */
+  FT_BASE( void )
+  ft_logging_init( void );
+
+  FT_BASE( void )
+  ft_logging_deinit( void );
+
+#endif /* FT_LOGGING */
+
 
 FT_END_HEADER
 
--- a/src/base/ftdebug.c
+++ b/src/base/ftdebug.c
@@ -45,6 +45,28 @@
 #include <freetype/internal/ftdebug.h>
 
 
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * Variables used to control logging.
+   *
+   * 1. `ft_default_trace_level` stores the value of trace levels, which are
+   *    provided to FreeType using the `FT2_DEBUG` environment variable.
+   *
+   * 2. `ft_fileptr` stores the `FILE*` handle.
+   *
+   * Use `static` to avoid 'unused variable' warnings.
+   *
+   */
+  static const char*  ft_default_trace_level = NULL;
+  static FILE*        ft_fileptr             = NULL;
+
+  dlg_handler  ft_default_log_handler = NULL;
+
+#endif /* FT_LOGGING*/
+
+
 #ifdef FT_DEBUG_LEVEL_ERROR
 
   /* documentation is in ftdebug.h */
@@ -106,7 +128,6 @@
 #endif /* FT_DEBUG_LEVEL_ERROR */
 
 
-
 #ifdef FT_DEBUG_LEVEL_TRACE
 
   /* array of trace levels, initialized to 0; */
@@ -313,6 +334,61 @@
 
 
 #endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * Initialize and de-initialize 'dlg' library.
+   *
+   */
+
+  FT_BASE_DEF( void )
+  ft_logging_init( void )
+  {
+    ft_default_log_handler = ft_log_handler;
+    ft_default_trace_level = ft_getenv( "FT2_DEBUG" );
+
+    if ( ft_getenv( "FT_LOGGING_FILE" ) )
+      ft_fileptr = ft_fopen( ft_getenv( "FT_LOGGING_FILE" ), "w" );
+    else
+      ft_fileptr = stderr;
+
+    ft_debug_init();
+
+    /* Set the default output handler for 'dlg'. */
+    dlg_set_handler( ft_default_log_handler, NULL );
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_logging_deinit( void )
+  {
+    ft_fclose( ft_fileptr );
+  }
+
+
+  /*************************************************************************
+   *
+   * An output log handler for FreeType.
+   *
+   */
+  FT_BASE_DEF( void )
+  ft_log_handler( const struct dlg_origin*  origin,
+                  const char*               string,
+                  void*                     data )
+  {
+    const char*  features = "%c";
+
+    FT_UNUSED( data );
+
+
+    dlg_generic_outputf_stream( ft_fileptr, features, origin, string,
+                                dlg_default_output_styles, true );
+  }
+
+#endif /* FT_LOGGING */
 
 
 /* END */
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -202,6 +202,10 @@
     FT_Memory  memory;
 
 
+#ifdef FT_LOGGING
+    ft_logging_init();
+#endif
+
     /* check of `alibrary' delayed to `FT_New_Library' */
 
     /* First of all, allocate a new system object -- this function is part */
@@ -247,6 +251,10 @@
 
     /* discard memory manager */
     FT_Done_Memory( memory );
+
+#ifdef FT_LOGGING
+    ft_logging_deinit();
+#endif
 
     return FT_Err_Ok;
   }
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -5292,10 +5292,12 @@
     if ( !memory || !alibrary )
       return FT_THROW( Invalid_Argument );
 
+#ifndef FT_LOGGING
 #ifdef FT_DEBUG_LEVEL_ERROR
     /* init debugging support */
     ft_debug_init();
-#endif
+#endif /* FT_DEBUG_LEVEL_ERROR */
+#endif /* !FT_LOGGING */
 
     /* first of all, allocate the library object */
     if ( FT_NEW( library ) )