[base] Do not reorder library->renderers upon use.
Instead of keeping `library->renderers' in a MRU order, just leave it as-is. The MRU machinery wasn't thread-safe. With this patch, rasterizing glyphs from different faces from different threads doesn't fail choosing rasterizer (FT_Err_Cannot_Render_Glyph). Easiest to see that crash was to add a `printf' (or otherwise let thread yield in FT_Throw with debugging enabled). * src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c (FT_Outline_Render): Don't call `FT_Set_Renderer'.
This commit is contained in:
parent
a773c3041e
commit
6dfdaf4d99
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
||||||
|
2015-01-14 Behdad Esfahbod <behdad@behdad.org>
|
||||||
|
|
||||||
|
[base] Do not reorder library->renderers upon use.
|
||||||
|
|
||||||
|
Instead of keeping `library->renderers' in a MRU order, just leave
|
||||||
|
it as-is. The MRU machinery wasn't thread-safe.
|
||||||
|
|
||||||
|
With this patch, rasterizing glyphs from different faces from
|
||||||
|
different threads doesn't fail choosing rasterizer
|
||||||
|
(FT_Err_Cannot_Render_Glyph).
|
||||||
|
|
||||||
|
Easiest to see that crash was to add a `printf' (or otherwise let
|
||||||
|
thread yield in FT_Throw with debugging enabled).
|
||||||
|
|
||||||
|
* src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c
|
||||||
|
(FT_Outline_Render): Don't call `FT_Set_Renderer'.
|
||||||
|
|
||||||
2015-01-14 Behdad Esfahbod <behdad@behdad.org>
|
2015-01-14 Behdad Esfahbod <behdad@behdad.org>
|
||||||
|
|
||||||
[raster] Allocate render pool for mono rasterizer on the stack.
|
[raster] Allocate render pool for mono rasterizer on the stack.
|
||||||
|
|
|
@ -4084,8 +4084,7 @@
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
FT_ListNode node = 0;
|
FT_ListNode node = 0;
|
||||||
FT_Bool update = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* small shortcut for the very common case */
|
/* small shortcut for the very common case */
|
||||||
|
@ -4112,16 +4111,6 @@
|
||||||
/* now, look for another renderer that supports the same */
|
/* now, look for another renderer that supports the same */
|
||||||
/* format. */
|
/* format. */
|
||||||
renderer = FT_Lookup_Renderer( library, slot->format, &node );
|
renderer = FT_Lookup_Renderer( library, slot->format, &node );
|
||||||
update = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we changed the current renderer for the glyph image format */
|
|
||||||
/* we need to select it as the next current one */
|
|
||||||
if ( !error && update && renderer )
|
|
||||||
{
|
|
||||||
error = FT_Set_Renderer( library, renderer, 0, 0 );
|
|
||||||
if ( error )
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -612,7 +612,6 @@
|
||||||
FT_Raster_Params* params )
|
FT_Raster_Params* params )
|
||||||
{
|
{
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
FT_Bool update = FALSE;
|
|
||||||
FT_Renderer renderer;
|
FT_Renderer renderer;
|
||||||
FT_ListNode node;
|
FT_ListNode node;
|
||||||
|
|
||||||
|
@ -646,14 +645,8 @@
|
||||||
/* format */
|
/* format */
|
||||||
renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
|
renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
|
||||||
&node );
|
&node );
|
||||||
update = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we changed the current renderer for the glyph image format */
|
|
||||||
/* we need to select it as the next current one */
|
|
||||||
if ( !error && update && renderer )
|
|
||||||
error = FT_Set_Renderer( library, renderer, 0, 0 );
|
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue