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_TRACE7.

    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  7,  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_TRACE7
    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 bounds are checked at runtime.

------------------------------------------------------------------------

Copyright 2002, 2003, 2004, 2005 by
David Turner, Robert Wilhelm, and Werner Lemberg.

This  file is  part  of the  FreeType  project, and  may  only be  used,
modified,  and  distributed under  the  terms  of  the FreeType  project
license, LICENSE.TXT.  By continuing  to use, modify, or distribute this
file  you indicate that  you have  read the  license and  understand and
accept it fully.


--- end of DEBUG ---
