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.
--- 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 = ¶meter; // 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;
}