|  | Debugging within the FreeType sources | 
|  | ===================================== | 
|  |  | 
|  | I. Configuration macros | 
|  | ----------------------- | 
|  |  | 
|  | There  are several ways  to enable  debugging features  in a  FreeType 2 | 
|  | builds.   This is controlled  through the  definition of  special macros | 
|  | located in the file "ftoptions.h".  The macros are: | 
|  |  | 
|  |  | 
|  | FT_DEBUG_LEVEL_ERROR | 
|  |  | 
|  | #define this macro  if you want to compile  the FT_ERROR macro calls | 
|  | to  print error messages  during program  execution.  This  will not | 
|  | stop  the  program.   Very  useful  to  spot  invalid  fonts  during | 
|  | development and to code workarounds for them. | 
|  |  | 
|  | FT_DEBUG_LEVEL_TRACE | 
|  |  | 
|  | #define this macro  if you want to compile  both macros FT_ERROR and | 
|  | FT_TRACE.   This also  includes the  variants  FT_TRACE0, FT_TRACE1, | 
|  | FT_TRACE2, ..., FT_TRACE6. | 
|  |  | 
|  | The  trace  macros are  used  to  send  debugging messages  when  an | 
|  | appropriate  "debug  level" is  configured  at  runtime through  the | 
|  | FT2_DEBUG environment variable (more on this later). | 
|  |  | 
|  | FT_DEBUG_MEMORY | 
|  |  | 
|  | If  this macro is  #defined, the  FreeType engine  is linked  with a | 
|  | small  but  effective  debugging  memory  manager  that  tracks  all | 
|  | allocations and frees that are performed within the font engine. | 
|  |  | 
|  | When  the  FT2_DEBUG_MEMORY   environment  variable  is  defined  at | 
|  | runtime,  a call  to FT_Done_FreeType  will dump  memory statistics, | 
|  | including the list of leaked memory blocks with the source locations | 
|  | where these were allocated.  It is always a very good idea to define | 
|  | this in development builds.  This works with _any_ program linked to | 
|  | FreeType, but  requires a big  deal of memory (the  debugging memory | 
|  | manager never frees the blocks to the heap in order to detect double | 
|  | frees). | 
|  |  | 
|  | When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging memory | 
|  | manager is ignored, and performance is unaffected. | 
|  |  | 
|  |  | 
|  | II. Debugging macros | 
|  | -------------------- | 
|  |  | 
|  | Several macros can be used within the FreeType sources to help debugging | 
|  | its code: | 
|  |  | 
|  | 1. FT_ERROR(( ... )) | 
|  |  | 
|  | This macro is  used to send debug messages  that indicate relatively | 
|  | serious  errors (like  broken font  files),  but will  not stop  the | 
|  | execution of  the running program.   Its code is compiled  only when | 
|  | either FT_DEBUG_LEVEL_ERROR  or FT_DEBUG_LEVEL_TRACE are  defined in | 
|  | "ftoption.h". | 
|  |  | 
|  | Note that you  have to use a printf-like  signature, but with double | 
|  | parentheses, like in: | 
|  |  | 
|  | FT_ERROR(( "your %s is not %s\n", "foo", "bar" )); | 
|  |  | 
|  |  | 
|  | 2. FT_ASSERT( condition ) | 
|  |  | 
|  | This macro  is used to check  strong assertions at  runtime.  If its | 
|  | condition isn't TRUE,  the program will abort with  a panic message. | 
|  | Its   code   is  compiled   when   either  FT_DEBUG_LEVEL_ERROR   or | 
|  | FT_DEBUG_LEVEL_TRACE are defined.  You don't need double-parentheses | 
|  | here.  For example: | 
|  |  | 
|  | FT_ASSERT( ptr != NULL ); | 
|  |  | 
|  |  | 
|  | 3. FT_TRACE( level, (message...) ) | 
|  |  | 
|  | The  FT_TRACE  macro  is  used  to  send  general-purpose  debugging | 
|  | messages during  program execution.   This macro uses  an *implicit* | 
|  | macro named FT_COMPONENT used to name the current FreeType component | 
|  | being run. | 
|  |  | 
|  | The developer should always  define FT_COMPONENT as appropriate, for | 
|  | example as in: | 
|  |  | 
|  | #undef  FT_COMPONENT | 
|  | #define FT_COMPONENT  trace_io | 
|  |  | 
|  | The  value  of  the  FT_COMPONENT  macro  is  an  enumeration  named | 
|  | trace_XXXX where XXXX  is one of the component  names defined in the | 
|  | internal file <freetype/internal/fttrace.h>. | 
|  |  | 
|  | Each  such component  is assigned  a "debug  level", ranging  from 0 | 
|  | to 6,  through  the  use   of  the  FT2_DEBUG  environment  variable | 
|  | (described below) when a program linked with FreeType starts. | 
|  |  | 
|  | When FT_TRACE  is called, its  level is compared  to the one  of the | 
|  | corresponding component.   Messages with trace  levels *higher* than | 
|  | the corresponding component level are filtered and never printed. | 
|  |  | 
|  | This  means that  trace messages  with level  0 are  always printed, | 
|  | those with level 2 are only  printed when the component level is *at | 
|  | least* 2. | 
|  |  | 
|  | The  second  parameter  to  FT_TRACE must  contain  parentheses  and | 
|  | correspond to a printf-like call, as in: | 
|  |  | 
|  | FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) ) | 
|  |  | 
|  | The shortcut macros  FT_TRACE0, FT_TRACE1, FT_TRACE2_, ... FT_TRACE6 | 
|  | can be  used with  constant level indices,  and are much  cleaner to | 
|  | use, as in | 
|  |  | 
|  | FT_TRACE2(( "your %s is not %s\n", "foo", "bar" )); | 
|  |  | 
|  |  | 
|  | III. Environment variables | 
|  | -------------------------- | 
|  |  | 
|  | The  following  environment   variables  control  debugging  output  and | 
|  | behaviour of FreeType at runtime: | 
|  |  | 
|  | FT2_DEBUG | 
|  |  | 
|  | This   variable  is   only  used   when  FreeType   is   built  with | 
|  | FT_DEBUG_LEVEL_TRACE defined.  It contains a list of component level | 
|  | definitions, following this format: | 
|  |  | 
|  | component1:level1 component2:level2 component3:level3 ... | 
|  |  | 
|  | where "componentX" is the name of a tracing component, as defined in | 
|  | "fttrace.h",  but  without the  "trace_"  prefix.   "levelX" is  the | 
|  | corresponding level to use at runtime. | 
|  |  | 
|  | "any"  is a  special  component  name that  will  be interpreted  as | 
|  | "any/all components".  For example, the following definitions | 
|  |  | 
|  | set FT2_DEBUG=any:2 memory:5 io:4        (on Windows) | 
|  | export FT2_DEBUG="any:2 memory:5 io:4"   (on Linux with bash) | 
|  |  | 
|  | both stipulate that  all components should have level  2, except for | 
|  | the memory  and io components  which will be  set to trace  levels 5 | 
|  | and 4, respectively. | 
|  |  | 
|  | FT2_DEBUG_MEMORY | 
|  |  | 
|  | This  environment variable, when  defined, tells  FreeType to  use a | 
|  | debugging memory  manager that will  track leaking memory  blocks as | 
|  | well as other  common errors like double frees.   It is also capable | 
|  | of  reporting  _where_  the  leaking blocks  were  allocated,  which | 
|  | considerably saves time when debugging new additions to the library. | 
|  |  | 
|  | This  code  is  only  compiled  when  FreeType  is  built  with  the | 
|  | FT_DEBUG_MEMORY macro  #defined in  "ftoption.h" though, it  will be | 
|  | ignored in other builds. | 
|  |  | 
|  | FT2_ALLOC_TOTAL_MAX | 
|  |  | 
|  | This  variable is ignored  if FT2_DEBUG_MEMORY  is not  defined.  It | 
|  | allows you to specify a maximum heap size for all memory allocations | 
|  | performed by FreeType.   This is very useful to  test the robustness | 
|  | of  the  font  engine and  programs  that  use  it in  tight  memory | 
|  | conditions. | 
|  |  | 
|  | If it is  undefined, or if its value is  not strictly positive, then | 
|  | no allocation bounds are checked at runtime. | 
|  |  | 
|  | FT2_ALLOC_COUNT_MAX | 
|  |  | 
|  | This  variable is ignored  if FT2_DEBUG_MEMORY  is not  defined.  It | 
|  | allows  you  to  specify  a  maximum number  of  memory  allocations | 
|  | performed    by     FreeType    before    returning     the    error | 
|  | FT_Err_Out_Of_Memory.  This is useful  for debugging and testing the | 
|  | engine's robustness. | 
|  |  | 
|  | If it is  undefined, or if its value is  not strictly positive, then | 
|  | no allocation bounsd are checked at runtime. | 
|  |  | 
|  |  | 
|  | --- end of DEBUG --- |