}
static float
-fz_advance_ft_glyph(fz_context *ctx, fz_font *font, int gid, int wmode)
+fz_advance_ft_glyph_aux(fz_context *ctx, fz_font *font, int gid, int wmode, int locked)
{
FT_Error fterr;
FT_Fixed adv = 0;
mask = FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_TRANSFORM;
if (wmode)
mask |= FT_LOAD_VERTICAL_LAYOUT;
- fz_lock(ctx, FZ_LOCK_FREETYPE);
+ if (!locked)
+ fz_lock(ctx, FZ_LOCK_FREETYPE);
fterr = FT_Get_Advance(font->ft_face, gid, mask, &adv);
- fz_unlock(ctx, FZ_LOCK_FREETYPE);
+ if (!locked)
+ fz_unlock(ctx, FZ_LOCK_FREETYPE);
if (fterr && fterr != FT_Err_Invalid_Argument)
{
fz_warn(ctx, "FT_Get_Advance(%s,%d): %s", font->name, gid, ft_error_string(fterr));
return (float) adv / ((FT_Face)font->ft_face)->units_per_EM;
}
+static float
+fz_advance_ft_glyph(fz_context *ctx, fz_font *font, int gid, int wmode)
+{
+ return fz_advance_ft_glyph_aux(ctx, font, gid, wmode, 0);
+}
+
static float
fz_advance_t3_glyph(fz_context *ctx, fz_font *font, int gid)
{
return fz_advance_ft_glyph(ctx, font, gid, 1);
if (gid >= 0 && gid < font->glyph_count && gid < MAX_ADVANCE_CACHE)
{
+ float f;
+ fz_lock(ctx, FZ_LOCK_FREETYPE);
if (!font->advance_cache)
{
int i;
- font->advance_cache = Memento_label(fz_malloc_array(ctx, font->glyph_count, float), "font_advance_cache");
+ fz_try(ctx)
+ font->advance_cache = Memento_label(fz_malloc_array(ctx, font->glyph_count, float), "font_advance_cache");
+ fz_catch(ctx)
+ {
+ fz_unlock(ctx, FZ_LOCK_FREETYPE);
+ fz_rethrow(ctx);
+ }
for (i = 0; i < font->glyph_count; ++i)
- font->advance_cache[i] = fz_advance_ft_glyph(ctx, font, i, 0);
+ font->advance_cache[i] = fz_advance_ft_glyph_aux(ctx, font, i, 0, 1);
}
- return font->advance_cache[gid];
+ f = font->advance_cache[gid];
+ fz_unlock(ctx, FZ_LOCK_FREETYPE);
+ return f;
}
return fz_advance_ft_glyph(ctx, font, gid, 0);