shithub: freetype+ttf2subf

Download patch

ref: ce12182cfc612a5de6b073197f3f3fa60ca98fa8
parent: f52165cc068e5abc27bd64d793358c258e1acd18
author: Graham Asher <[email protected]>
date: Thu Aug 1 11:29:17 EDT 2002

Modified incremental loading interface to be closer to David Turner's
preferences. The header freetype.h is not now affected, the interface is
specified via an FT_Parameter, the pointer to the interface is hidden in an
internal part of the face record, and all the definitions are in ftincrem.h.

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/config/ftheader.h
+++ b/include/freetype/config/ftheader.h
@@ -499,6 +499,8 @@
 
 #define FT_XFREE86_H               <freetype/ftxf86.h>
 
+#define FT_INCREMENTAL_H           <freetype/ftincrem.h>
+
   /* now include internal headers definitions from <freetype/internal/...> */
 
 #define  FT_INTERNAL_INTERNAL_H    <freetype/internal/internal.h>
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -199,38 +199,9 @@
   } FT_Glyph_Metrics;
 
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
-  /*    FT_Basic_Glyph_Metrics                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A small glyph metrics structure used to return information for     */
-  /*    incrementally defined fonts (see @FT_Incremental_Interface).       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    bearing_x :: Left side bearing in font units.                      */
-  /*                                                                       */
-  /*    bearing_y :: Top side bearing in font units.                       */
-  /*                                                                       */
-  /*    advance   :: Advance in font units.                                */
-  /*                                                                       */
-  typedef struct  FT_Basic_Glyph_Metrics_
-  {
-    FT_Long  bearing_x;
-    FT_Long  bearing_y;
-    FT_Long  advance;
-
-  } FT_Basic_Glyph_Metrics;
-
-#endif /* #ifdef FT_CONFIG_OPTION_INCREMENTAL */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
   /*    FT_Bitmap_Size                                                     */
   /*                                                                       */
   /* <Description>                                                         */
@@ -508,129 +479,9 @@
   } FT_CharMapRec;
 
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-  
   /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Get_Glyph_Data_Func                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A type definition for a function to get glyph data from a face     */
-  /*    that supplies glyph data incrementally, after the face object has  */
-  /*    been created.                                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    object :: A pointer to the user's data, specified by the `object'  */
-  /*              field in @FT_Incremental_Interface.                      */
-  /*                                                                       */
-  /*    index  :: The glyph index.                                         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    data   :: The position and length of the data.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  O means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_Get_Glyph_Data_Func)( void*     object,
-                             FT_UInt   index,
-                             FT_Data*  data );
-
-
   /*************************************************************************/
   /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Get_Glyph_Metrics_Func                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A type definition for a function to get glyph metrics from a face  */
-  /*    that supplies glyph metrics incrementally, after the face object   */
-  /*    has been created.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    object   :: A pointer to the user's data, specified by the         */
-  /*                `object' field in @FT_Incremental_Interface.           */
-  /*                                                                       */
-  /*    index    :: The glyph index.                                       */
-  /*                                                                       */
-  /*    vertical :: True for vertical layout, false for horizontal layout. */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    metrics  :: The glyph metrics in font units.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  O means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_Get_Glyph_Metrics_Func)( void*                    object,
-                                FT_UInt                  index,
-                                FT_Bool                  vertical,
-                                FT_Basic_Glyph_Metrics*  metrics,
-                                FT_Bool*                 found );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Incremental_Interface_Funcs                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A table of functions for accessing fonts that load data            */
-  /*    incrementally.  Used in @FT_Incremental_Interface.                 */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    get_glyph_data    :: The function to get glyph data.  Must not be  */
-  /*                         null.                                         */
-  /*                                                                       */
-  /*    get_glyph_metrics :: The function to get glyph metrics.  May be    */
-  /*                         null if the font does not provide             */
-  /*                         overriding glyph metrics.                     */
-  /*                                                                       */
-  typedef struct  FT_Incremental_Interface_Funcs_
-  {
-    FT_Get_Glyph_Data_Func     get_glyph_data;
-    FT_Get_Glyph_Metrics_Func  get_glyph_metrics;
-
-  } FT_Incremental_Interface_Funcs;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Incremental_Interface                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This interface structure is provided to @FT_Open_Face to allow     */
-  /*    incremental faces to be opened.                                    */
-  /*                                                                       */
-  /*    An incremental face supplies no glyph data when it is opened.      */
-  /*    Instead, the glyph data is supplied using a callback function.     */
-  /*    Optionally, metrics that override the metrics in the typeface data */
-  /*    can also be supplied using another callback function.              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*     funcs  :: The table of functions.                                 */
-  /*                                                                       */
-  /*     object :: The pointer passed to the functions.  Usually it points */
-  /*               to the object from which glyph and metric data is       */
-  /*               obtained.                                               */
-  /*                                                                       */
-  typedef struct  FT_Incremental_Interface_
-  {
-    const FT_Incremental_Interface_Funcs*  funcs;
-    void*                                  object;
-
-  } FT_Incremental_Interface;
-
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
   /*                 B A S E   O B J E C T   C L A S S E S                 */
   /*                                                                       */
   /*************************************************************************/
@@ -859,10 +710,6 @@
 
     FT_Face_Internal  internal;
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_Interface*  incremental_interface;
-#endif
-
     /*@private end */
 
   } FT_FaceRec;
@@ -1601,10 +1448,6 @@
   /*                                                                       */
   /*    ft_open_params      :: Use the `num_params' & `params' field.      */
   /*                                                                       */
-  /*    ft_open_incremental :: Use the 'incremental_interface' field.      */
-  /*                           (Available if @FT_CONFIG_OPTION_INCREMENTAL */
-  /*                           is defined.)                                */
-  /*                                                                       */
   /* <Note>                                                                */
   /*    The `ft_open_memory', `ft_open_stream', and `ft_open_pathname'     */
   /*    flags are mutually exclusive.                                      */
@@ -1616,9 +1459,6 @@
     ft_open_pathname = 4,
     ft_open_driver   = 8,
     ft_open_params   = 16
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    ,ft_open_incremental = 32
-#endif
 
   } FT_Open_Flags;
 
@@ -1680,11 +1520,6 @@
   /*    params      :: Extra parameters passed to the font driver when     */
   /*                   opening a new face.                                 */
   /*                                                                       */
-  /*    incremental_interface ::                                           */
-  /*                   If non-null, an interface used to implement         */
-  /*                   incremental font loading.  This field exists only   */
-  /*                   if @FT_CONFIG_OPTION_INCREMENTAL is defined.        */
-  /*                                                                       */
   /* <Note>                                                                */
   /*    The stream type is determined by the contents of `flags' which     */
   /*    are tested in the following order by @FT_Open_Face:                */
@@ -1705,10 +1540,6 @@
   /*    `num_params' and `params' will be used.  They are ignored          */
   /*    otherwise.                                                         */
   /*                                                                       */
-  /*    If the `ft_open_incremental' bit is set 'incremental_interface'    */
-  /*    will be used, else it is ignored.  This feature is available only  */
-  /*    if @FT_CONFIG_OPTION_INCREMENTAL is defined.                       */
-  /*                                                                       */
   typedef struct  FT_Open_Args_
   {
     FT_Open_Flags              flags;
@@ -1719,9 +1550,6 @@
     FT_Module                  driver;
     FT_Int                     num_params;
     FT_Parameter*              params;
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_Interface*  incremental_interface;
-#endif
 
   } FT_Open_Args;
 
--- a/include/freetype/ftincrem.h
+++ b/include/freetype/ftincrem.h
@@ -11,20 +11,20 @@
   * @type: FT_Incremental
   *
   * @description:
-  *   an opaque type describing a user-provided object used to implement
+  *   An opaque type describing a user-provided object used to implement
   *   "incremental" glyph loading within FreeType. This is used to support
   *   embedded fonts in certain environments (e.g. Postscript interpreters),
-  *   where the glyph data isn't in the font file, or must be over-ridden by
+  *   where the glyph data isn't in the font file, or must be overridden by
   *   different values.
   *
   * @note:
-  *   it's up to client applications to create and implement @FT_Incremental
+  *   It is up to client applications to create and implement @FT_Incremental
   *   objects, as long as they provide implementations for the methods
   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
   *   and @FT_Incremental_GetGlyphMetricsFunc
   *
-  *   see the description of @FT_Incremental_ServiceRec to understand how to
-  *   use incremental objects with FreeType.
+  *   see the description of @FT_Incremental_InterfaceRec to understand how
+  *   to use incremental objects with FreeType.
   */
   typedef struct FT_IncrementalRec_*    FT_Incremental;
 
@@ -34,17 +34,17 @@
   * @struct: FT_Incremental_Metrics
   *
   * @description:
-  *   a small structure used to model the basic glyph metrics returned
+  *   A small structure used to contain the basic glyph metrics returned
   *   by the @FT_Incremental_GetGlyphMetricsFunc method
   *
   * @fields:
-  *   bearing_x :: left-most bearing, in font units.
-  *   bearing_y :: top-most bearing, in font units.
+  *   bearing_x :: left bearing, in font units.
+  *   bearing_y :: top bearing, in font units.
   *   advance   :: glyph advance, in font units
   *
   * @note:
-  *   these correspond to horizontal or vertical metrics depending on the
-  *   value of the 'vertical' parameter of the method
+  *   These correspond to horizontal or vertical metrics depending on the
+  *   value of the 'vertical' argument to the function
   *   @FT_Incremental_GetGlyphMetricsFunc
   */
   typedef struct FT_Incremental_MetricsRec_
@@ -61,14 +61,14 @@
   * @type: FT_Incremental_GetGlyphDataFunc
   *
   * @description:
-  *   a function called by FreeType to access a given glyph's data bytes
-  *   during @FT_Load_Glyph or @FT_Load_Char, when incremental loading is
-  *   enable.
+  *   A function called by FreeType to access a given glyph's data bytes
+  *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+  *   enabled.
   *
-  *   note that the format of the glyph's data bytes depends on the font
+  *   Note that the format of the glyph's data bytes depends on the font
   *   file format. For TrueType, it must correspond to the raw bytes within
   *   the 'glyf' table. For Postscript formats, it must correspond to the
-  *   *unencrypted* charstrings bytes, without any 'lenIV' header. It is
+  *   *unencrypted* charstring bytes, without any 'lenIV' header. It is
   *   undefined for any other format.
   *
   * @input:
@@ -85,17 +85,17 @@
   *   FreeType error code. 0 means success
   *
   * @note:
-  *   if this function returns succesfully, the method
-  *   @FT_Incremental_FreeGlyphDataFunc will be called later to "release"
-  *   the se bytes.
+  *   If this function returns succesfully the method
+  *   @FT_Incremental_FreeGlyphDataFunc will be called later to release
+  *   the data bytes.
   *
-  *   nested @FT_Incremental_GetGlyphDataFunc can happen, in the case of
-  *   compound glyphs !!
+  *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+  *   compound glyphs.
   */
   typedef FT_Error (*FT_Incremental_GetGlyphDataFunc)
                       ( FT_Incremental  incremental,
                         FT_UInt         glyph_index,
-                        FT_DataRec     *adata );
+                        FT_Data*        adata );
 
  /**************************************************************************
   *
@@ -102,7 +102,7 @@
   * @type: FT_Incremental_FreeGlyphDataFunc
   *
   * @description:
-  *   a function used to "release" the glyph data bytes returned by a
+  *   A function used to release the glyph data bytes returned by a
   *   successful call to @FT_Incremental_GetGlyphDataFunc.
   *
   * @input:
@@ -113,7 +113,7 @@
   */
   typedef void     (*FT_Incremental_FreeGlyphDataFunc)
                       ( FT_Incremental  incremental,
-                        FT_DataRec*     data );
+                        FT_Data*        data );
 
 
  /**************************************************************************
@@ -121,9 +121,9 @@
   * @type: FT_Incremental_GetGlyphMetricsFunc
   *
   * @description:
-  *   a function used to retrieve the basic metrics of a given glyph index
+  *   A function used to retrieve the basic metrics of a given glyph index
   *   before accessing its data. This is necessary because, in certain formats
-  *   like TrueType, the metrics are stored in a different place than the
+  *   like TrueType, the metrics are stored in a different place from the
   *   glyph images proper.
   *
   * @input:
@@ -139,32 +139,58 @@
                         FT_Bool                    *afound );
 
 
+  /*************************************************************************
+   *
+   * @struct: FT_Incremental_FuncsRec
+   * 
+   * @description:
+   *    A table of functions for accessing fonts that load data
+   *    incrementally. Used in @FT_Incremental_Interface.
+   * 
+   * @fields:
+   *    get_glyph_data    :: The function to get glyph data. Must not be 
+   *                         null.
+   *
+   *    free_glyph_data   :: The function to release glyph data. Must not
+   *                         be null.
+   *
+   *    get_glyph_metrics :: The function to get glyph metrics. May be
+   *                         null if the font does not provide
+   *                         overriding glyph metrics. 
+   */
+  typedef struct  FT_Incremental_FuncsRec_
+  {
+    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
+    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
+    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
+
+  } FT_Incremental_FuncsRec;
+
+
  /**************************************************************************
   *
-  * @struct: FT_Incremental_ServiceRec
+  * @struct: FT_Incremental_InterfaceRec
   *
   * @description:
-  *   a structure to be used with @FT_Open_Face to indicate that the user
-  *   wants to support "incremental" glyph loading. You should use it with
+  *   A structure to be used with @FT_Open_Face to indicate that the user
+  *   wants to support incremental glyph loading. You should use it with
   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:
   *
   *  {
-  *    FT_Incremental_ServiceRec  incr_service;
-  *    FT_Parameter               parameter;
-  *    FT_Open_Args               open_args;
+  *    FT_Incremental_InterfaceRec    inc_int;
+  *    FT_Parameter                   parameter;
+  *    FT_Open_Args                   open_args;
   *
   *    // set up incremental descriptor
-  *    incr_service.incremental       = my_object;
-  *    incr_service.get_glyph_metrics = my_get_glyph_metrics;
-  *    incr_service.get_glyph_data    = my_get_glyph_data;
-  *    incr_service.free_glyph_data   = my_free_glyph_data;
+  *    inc_int.funcs  = my_funcs;
+  *    inc_int.object = my_object;
   *
   *    // set up optional parameter
   *    parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
-  *    parameter.data = &incr_service;
+  *    parameter.data = &inc_int;
   *
   *    // set up FT_Open_Args structure
-  *    open_args.flags      = ft_open_flag_pathname;
+  *    open_args.flags      = (FT_Open_Flags)(ft_open_pathname | ft_open_params);
   *    open_args.pathname   = my_font_pathname;
   *    open_args.num_params = 1;
   *    open_args.params     = &parameter;   // we use one optional argument
@@ -174,25 +200,21 @@
   *    ....
   *  }
   */
-  typedef struct FT_IncrementalParamsRec_
+  typedef struct FT_Incremental_InterfaceRec_
   {
-    FT_Incremental                      incremental;
-    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
-    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
-    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
+    const FT_Incremental_FuncsRec*  funcs;
+    FT_Incremental                  object;
   
-  } FT_IncrementalParamsRec, *FT_IncrementalParams;
+  } FT_Incremental_InterfaceRec;
 
-
  /**************************************************************************
   *
   * @constant: FT_PARAM_TAG_INCREMENTAL
   *
   * @description:
-  *   a constant used as the tag of @FT_Parameter structures to indicate
-  *   an incremental loading object to be used by FreeType
+  *   A constant used as the tag of @FT_Parameter structures to indicate
+  *   an incremental loading object to be used by FreeType.
   *
-  *   see the node for @FT_IncrementalParamsRec
   */
 #define  FT_PARAM_TAG_INCREMENTAL   FT_MAKE_TAG('i','n','c','r')
 
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -36,6 +36,10 @@
 #include FT_INTERNAL_AUTOHINT_H
 #include FT_INTERNAL_OBJECT_H
 
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include FT_INCREMENTAL_H
+#endif
+
 FT_BEGIN_HEADER
 
 
@@ -296,6 +300,13 @@
   /*                                                                       */
   /*    postscript_name  :: Postscript font name for this face.            */
   /*                                                                       */
+  /*    incremental_interface :: If non-null, the interface through        */
+  /*                        which glyph data and metrics are loaded        */
+  /*                        incrementally for faces that do not provide    */
+  /*                        all of this data when first opened.            */
+  /*                        This field exists only if					   */
+  /*                        @FT_CONFIG_OPTION_INCREMENTAL is defined.      */
+  /*                                                                       */
   typedef struct  FT_Face_InternalRec_
   {
     FT_UShort    max_points;
@@ -308,6 +319,10 @@
     FT_UInt32    hint_flags;
 
     const char*  postscript_name;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec*  incremental_interface;
+#endif
 
   } FT_Face_InternalRec;
 
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -25,7 +25,6 @@
 #include FT_TRUETYPE_TABLES_H
 #include FT_OUTLINE_H
 
-
   FT_BASE_DEF( void )
   ft_validator_init( FT_Validator        valid,
                      const FT_Byte*      base,
@@ -700,11 +699,6 @@
              FT_Long        face_index,
              FT_Int         num_params,
              FT_Parameter*  params,
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-             FT_Incremental_Interface*  incremental_interface,
-#endif
-
              FT_Face*       aface )
   {
     FT_Memory         memory;
@@ -713,7 +707,6 @@
     FT_Error          error;
     FT_Face_Internal  internal;
 
-
     clazz  = driver->clazz;
     memory = driver->root.memory;
 
@@ -729,8 +722,15 @@
     face->driver   = driver;
     face->memory   = memory;
     face->stream   = stream;
+
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    face->incremental_interface = incremental_interface;
+	{
+    int i;
+    face->internal->incremental_interface = 0;
+    for (i = 0; i < num_params && !face->internal->incremental_interface; i++)
+      if (params[i].tag == FT_PARAM_TAG_INCREMENTAL)
+        face->internal->incremental_interface = params[i].data;
+	}
 #endif
 
     error = clazz->init_face( stream,
@@ -874,15 +874,9 @@
       /* not all modules are drivers, so check... */
       if ( FT_MODULE_IS_DRIVER( driver ) )
       {
-        FT_Int         num_params = 0;
-        FT_Parameter*  params     = 0;
+        FT_Int                        num_params = 0;
+        FT_Parameter*                 params     = 0;
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-        FT_Incremental_Interface*  incremental_interface =
-          ( args->flags & ft_open_incremental ) ? args->incremental_interface
-                                                : 0;
-#endif
-
         if ( args->flags & ft_open_params )
         {
           num_params = args->num_params;
@@ -889,14 +883,8 @@
           params     = args->params;
         }
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
         error = open_face( driver, stream, face_index,
-                           num_params, params, incremental_interface, &face );
-#else
-        error = open_face( driver, stream, face_index,
                            num_params, params, &face );
-#endif
-
         if ( !error )
           goto Success;
       }
@@ -921,12 +909,6 @@
           FT_Int         num_params = 0;
           FT_Parameter*  params     = 0;
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-          FT_Incremental_Interface* incremental_interface =
-            ( args->flags & ft_open_incremental ) ? args->incremental_interface
-                                                  : 0;
-#endif
-
           driver = FT_DRIVER( cur[0] );
 
           if ( args->flags & ft_open_params )
@@ -935,14 +917,8 @@
             params     = args->params;
           }
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
           error = open_face( driver, stream, face_index,
-                            num_params, params, incremental_interface, &face );
-#else
-          error = open_face( driver, stream, face_index,
                             num_params, params, &face );
-#endif
-
           if ( !error )
             goto Success;
 
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -433,7 +433,7 @@
 
     /* do we have outlines in there? */
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    has_outline   = FT_BOOL( face->root.incremental_interface != 0   ||
+    has_outline   = FT_BOOL( face->root.internal->incremental_interface != 0 ||
                              TT_LookUp_Table( face, TTAG_glyf ) != 0 ||
                              TT_LookUp_Table( face, TTAG_CFF ) != 0  );
 #else
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -756,7 +756,9 @@
     FT_Bool         opened_frame = 0;
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    struct FT_StreamRec_  inc_stream;
+    struct FT_StreamRec_   inc_stream;
+    FT_Data                glyph_data;
+	FT_Bool                glyph_data_loaded = 0;
 #endif
 
 
@@ -789,14 +791,14 @@
 
       /* If this is an incrementally loaded font see if there are */
       /* overriding metrics for this glyph.                       */
-      if ( face->root.incremental_interface &&
-           face->root.incremental_interface->funcs->get_glyph_metrics )
+      if ( face->root.internal->incremental_interface &&
+           face->root.internal->incremental_interface->funcs->get_glyph_metrics )
       {
-        FT_Basic_Glyph_Metrics  m;
+        FT_Incremental_MetricsRec  m;
 
 
-        error = face->root.incremental_interface->funcs->get_glyph_metrics(
-                  face->root.incremental_interface->object,
+        error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                  face->root.internal->incremental_interface->object,
                   glyph_index, FALSE, &m, &metrics_found );
         if ( error )
           goto Exit;
@@ -841,21 +843,19 @@
     /* the loader stream to a memory stream reading the data returned  */
     /* by the interface.                                               */
 
-    if ( face->root.incremental_interface )
+    if ( face->root.internal->incremental_interface )
     {
-      FT_Data data;
-
-
-      error = face->root.incremental_interface->funcs->get_glyph_data(
-                face->root.incremental_interface->object,
-                glyph_index, &data );
+      error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+                face->root.internal->incremental_interface->object,
+                glyph_index, &glyph_data );
       if ( error )
         goto Exit;
 
+      glyph_data_loaded = 1;
       offset = 0;
-      count  = data.length;
+      count  = glyph_data.length;
       FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
-      FT_Stream_OpenMemory( &inc_stream, data.pointer, data.length );
+      FT_Stream_OpenMemory( &inc_stream, glyph_data.pointer, glyph_data.length );
       loader->stream = &inc_stream;
     }
 
@@ -1264,6 +1264,14 @@
       face->forget_glyph_frame( loader );
 
   Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if (glyph_data_loaded)
+	  face->root.internal->incremental_interface->funcs->free_glyph_data(
+                face->root.internal->incremental_interface->object,
+                &glyph_data );
+#endif
+
     return error;
   }
 
@@ -1353,13 +1361,13 @@
 
       /* If this is an incrementally loaded font see if there are */
       /* overriding metrics for this glyph.                       */
-      if ( face->root.incremental_interface &&
-           face->root.incremental_interface->funcs->get_glyph_metrics )
+      if ( face->root.internal->incremental_interface &&
+           face->root.internal->incremental_interface->funcs->get_glyph_metrics )
       {
-        FT_Basic_Glyph_Metrics  m;
-        FT_Error                error =
-          face->root.incremental_interface->funcs->get_glyph_metrics(
-            face->root.incremental_interface->object,
+        FT_Incremental_MetricsRec  m;
+        FT_Error                   error =
+          face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+            face->root.internal->incremental_interface->object,
             glyph_index, TRUE, &m, &metrics_found );
 
 
@@ -1595,7 +1603,7 @@
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
     /* Don't look for the glyph table if this is an incremental font. */
-    if ( !face->root.incremental_interface )
+    if ( !face->root.internal->incremental_interface )
 
 #endif
 
@@ -1656,7 +1664,7 @@
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
-    if ( face->root.incremental_interface )
+    if ( face->root.internal->incremental_interface )
       loader.glyf_offset = 0;
     else
 
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -201,7 +201,7 @@
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
-        if ( !face->root.incremental_interface )
+        if ( !face->root.internal->incremental_interface )
           error = TT_Load_Locations( face, stream );
         if ( !error )
           error = TT_Load_CVT      ( face, stream ) ||
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -70,9 +70,9 @@
 
     /* For incremental fonts get the character data using the */
     /* callback function.                                     */
-    if ( face->root.incremental_interface )
-      error = face->root.incremental_interface->funcs->get_glyph_data(
-                face->root.incremental_interface->object,
+    if ( face->root.internal->incremental_interface )
+      error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+                face->root.internal->incremental_interface->object,
                 glyph_index, char_string );
     else
 
@@ -92,15 +92,15 @@
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
     /* Incremental fonts can optionally override the metrics. */
-    if ( !error && face->root.incremental_interface                 &&
-         face->root.incremental_interface->funcs->get_glyph_metrics )
+    if ( !error && face->root.internal->incremental_interface                 &&
+         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
     {
-      FT_Bool                 found = FALSE;
-      FT_Basic_Glyph_Metrics  metrics;
+      FT_Bool                    found = FALSE;
+      FT_Incremental_MetricsRec  metrics;
 
 
-      error = face->root.incremental_interface->funcs->get_glyph_metrics(
-                face->root.incremental_interface->object,
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
                 glyph_index, FALSE, &metrics, &found );
       if ( found )
       {
@@ -121,10 +121,23 @@
   T1_Parse_Glyph( T1_Decoder  decoder,
                   FT_UInt     glyph_index )
   {
-    FT_Data  data;
+    FT_Data  glyph_data;
+    FT_Error error = T1_Parse_Glyph_And_Get_Char_String( decoder, glyph_index, &glyph_data );
 
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( !error)
+    {
+      T1_Face   face  = (T1_Face)decoder->builder.face;
 
-    return T1_Parse_Glyph_And_Get_Char_String( decoder, glyph_index, &data );
+
+	  if ( face->root.internal->incremental_interface )
+	    face->root.internal->incremental_interface->funcs->free_glyph_data(
+                  face->root.internal->incremental_interface->object,
+                  &glyph_data );
+    }
+#endif
+
+    return error;
   }
 
 
@@ -211,7 +224,8 @@
 
     FT_Matrix               font_matrix;
     FT_Vector               font_offset;
-    FT_Data                 char_string;
+    FT_Data                 glyph_data;
+	FT_Bool                 glyph_data_loaded = 0;
 
     if ( load_flags & FT_LOAD_NO_RECURSE )
       load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
@@ -247,9 +261,10 @@
 
     /* now load the unscaled outline */
     error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
-                                                &char_string );
+                                                &glyph_data );
     if ( error )
       goto Exit;
+	glyph_data_loaded = 1;
 
     font_matrix = decoder.font_matrix;
     font_offset = decoder.font_offset;
@@ -368,11 +383,27 @@
 
       /* Set control data to the glyph charstrings.  Note that this is */
       /* _not_ zero-terminated.                                        */
-      glyph->root.control_data = (FT_Byte*)char_string.pointer;
-      glyph->root.control_len  = char_string.length;
+      glyph->root.control_data = (FT_Byte*)glyph_data.pointer;
+      glyph->root.control_len  = glyph_data.length;
     }
 
+
   Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_data_loaded && face->root.internal->incremental_interface )
+    {
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+                  face->root.internal->incremental_interface->object,
+                  &glyph_data );
+
+      /* Set the control data to null - it is no longer available if   */
+	  /* loaded incrementally.                                         */
+      glyph->root.control_data = 0;
+      glyph->root.control_len  = 0;
+    }
+#endif
+
     return error;
   }