ref: 89bc8d4de7bf93336e182bd42507851f5b46f66f
parent: 3f9b3d882d0b1050450f0f1b3e77c9b5ab3e8c4d
author: Behdad Esfahbod <[email protected]>
date: Wed Jan 14 11:01:19 EST 2015
[autofit] Allocate AF_Loader on the stack instead of AF_Module. Stop sharing a global `AF_Loader'. Allocate one on the stack during glyph load. Right now this results in about 25% slowdown, to be fixed in a following commit. With this patch loading glyphs from different faces from different threads doesn't immediately crash in the autohinting loader code. Bugs: https://bugzilla.redhat.com/show_bug.cgi?id=1164941 * src/autofit/afloader.c (af_loader_init): Pass `AF_Loader' and `FT_Memory' instead of `AF_Module' as arguments. (af_loader_reset, af_loader_load_glyph): Also pass `loader' as argument. (af_loader_done): Use `AF_Loader' instead of `AF_Module' as argument. * src/autofit/afmodule.c (af_autofitter_init): Don't call `af_loader_init'. (af_autofitter_done): Don't call `af_loader_done'. (af_autofitter_load_glyph): Use a local `AF_Loader' object. * src/autofit/afloader.h: Include `afmodule.h'. Update prototypes. Move typedef for `AF_Module' to... * src/autofit/afmodule.h: ... this place. No longer include `afloader.h'.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,41 @@
2015-01-14 Behdad Esfahbod <[email protected]>
+ [autofit] Allocate AF_Loader on the stack instead of AF_Module.
+
+ Stop sharing a global `AF_Loader'. Allocate one on the stack during
+ glyph load.
+
+ Right now this results in about 25% slowdown, to be fixed in a
+ following commit.
+
+ With this patch loading glyphs from different faces from different
+ threads doesn't immediately crash in the autohinting loader code.
+
+ Bugs:
+
+ https://bugzilla.redhat.com/show_bug.cgi?id=1164941
+
+ * src/autofit/afloader.c (af_loader_init): Pass
+ `AF_Loader' and `FT_Memory' instead of `AF_Module' as arguments.
+ (af_loader_reset, af_loader_load_glyph): Also pass `loader' as
+ argument.
+ (af_loader_done): Use `AF_Loader' instead of `AF_Module' as
+ argument.
+
+ * src/autofit/afmodule.c (af_autofitter_init): Don't call
+ `af_loader_init'.
+ (af_autofitter_done): Don't call `af_loader_done'.
+ (af_autofitter_load_glyph): Use a local `AF_Loader' object.
+
+ * src/autofit/afloader.h: Include `afmodule.h'.
+ Update prototypes.
+ Move typedef for `AF_Module' to...
+
+ * src/autofit/afmodule.h: ... this place.
+ No longer include `afloader.h'.
+
+2015-01-14 Behdad Esfahbod <[email protected]>
+
* src/type42/t42objs.h (T42_DriverRec): Remove unused member.
2015-01-12 Werner Lemberg <[email protected]>
--- a/src/autofit/afloader.c
+++ b/src/autofit/afloader.c
@@ -27,12 +27,9 @@
/* Initialize glyph loader. */
FT_LOCAL_DEF( FT_Error )
- af_loader_init( AF_Module module )
+ af_loader_init( AF_Loader loader,
+ FT_Memory memory )
{
- AF_Loader loader = module->loader;
- FT_Memory memory = module->root.library->memory;
-
-
FT_ZERO( loader );
af_glyph_hints_init( &loader->hints, memory );
@@ -46,11 +43,11 @@
/* Reset glyph loader and compute globals if necessary. */
FT_LOCAL_DEF( FT_Error )
- af_loader_reset( AF_Module module,
+ af_loader_reset( AF_Loader loader,
+ AF_Module module,
FT_Face face )
{
- FT_Error error = FT_Err_Ok;
- AF_Loader loader = module->loader;
+ FT_Error error = FT_Err_Ok;
loader->face = face;
@@ -77,11 +74,8 @@
/* Finalize glyph loader. */
FT_LOCAL_DEF( void )
- af_loader_done( AF_Module module )
+ af_loader_done( AF_Loader loader )
{
- AF_Loader loader = module->loader;
-
-
af_glyph_hints_done( &loader->hints );
loader->face = NULL;
@@ -496,7 +490,8 @@
/* Load a glyph. */
FT_LOCAL_DEF( FT_Error )
- af_loader_load_glyph( AF_Module module,
+ af_loader_load_glyph( AF_Loader loader,
+ AF_Module module,
FT_Face face,
FT_UInt gindex,
FT_Int32 load_flags )
@@ -503,7 +498,6 @@
{
FT_Error error;
FT_Size size = face->size;
- AF_Loader loader = module->loader;
AF_ScalerRec scaler;
@@ -521,7 +515,7 @@
scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );
scaler.flags = 0; /* XXX: fix this */
- error = af_loader_reset( module, face );
+ error = af_loader_reset( loader, module, face );
if ( !error )
{
AF_StyleMetrics metrics;
--- a/src/autofit/afloader.h
+++ b/src/autofit/afloader.h
@@ -20,13 +20,12 @@
#define __AFLOADER_H__
#include "afhints.h"
+#include "afmodule.h"
#include "afglobal.h"
FT_BEGIN_HEADER
- typedef struct AF_ModuleRec_* AF_Module;
-
/*
* The autofitter module's (global) data structure to communicate with
* actual fonts. If necessary, `local' data like the current face, the
@@ -56,20 +55,23 @@
FT_LOCAL( FT_Error )
- af_loader_init( AF_Module module );
+ af_loader_init( AF_Loader loader,
+ FT_Memory memory );
FT_LOCAL( FT_Error )
- af_loader_reset( AF_Module module,
+ af_loader_reset( AF_Loader loader,
+ AF_Module module,
FT_Face face );
FT_LOCAL( void )
- af_loader_done( AF_Module module );
+ af_loader_done( AF_Loader loader );
FT_LOCAL( FT_Error )
- af_loader_load_glyph( AF_Module module,
+ af_loader_load_glyph( AF_Loader loader,
+ AF_Module module,
FT_Face face,
FT_UInt gindex,
FT_Int32 load_flags );
--- a/src/autofit/afmodule.c
+++ b/src/autofit/afmodule.c
@@ -253,7 +253,7 @@
module->fallback_style = AF_STYLE_FALLBACK;
module->default_script = AF_SCRIPT_DEFAULT;
- return af_loader_init( module );
+ return FT_Err_Ok;
}
@@ -261,9 +261,6 @@
af_autofitter_done( FT_Module ft_module ) /* AF_Module */
{
AF_Module module = (AF_Module)ft_module;
-
-
- af_loader_done( module );
}
@@ -274,10 +271,22 @@
FT_UInt glyph_index,
FT_Int32 load_flags )
{
+ FT_Error error = FT_Err_Ok;
+ AF_LoaderRec loader[1];
+
FT_UNUSED( size );
- return af_loader_load_glyph( module, slot->face,
- glyph_index, load_flags );
+
+ error = af_loader_init( loader, module->root.library->memory );
+ if ( error )
+ return error;
+
+ error = af_loader_load_glyph( loader, module, slot->face,
+ glyph_index, load_flags );
+
+ af_loader_done( loader );
+
+ return error;
}
--- a/src/autofit/afmodule.h
+++ b/src/autofit/afmodule.h
@@ -23,17 +23,13 @@
#include FT_INTERNAL_OBJECTS_H
#include FT_MODULE_H
-#include "afloader.h"
-
FT_BEGIN_HEADER
/*
* This is the `extended' FT_Module structure which holds the
- * autofitter's global data. Right before hinting a glyph, the data
- * specific to the glyph's face (blue zones, stem widths, etc.) are
- * loaded into `loader' (see function `af_loader_reset').
+ * autofitter's global data.
*/
typedef struct AF_ModuleRec_
@@ -43,9 +39,7 @@
FT_UInt fallback_style;
FT_UInt default_script;
- AF_LoaderRec loader[1];
-
- } AF_ModuleRec;
+ } AF_ModuleRec, *AF_Module;
FT_DECLARE_MODULE(autofit_module_class)