From d64a1c24d00be03d850758bf8936dc02ac8989ec Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 15 Aug 2011 17:28:13 +0200 Subject: Deterministic bitmap loading This is similar to the earlier change, but for bitmaps. --- libass/ass_render.c | 123 ++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 62 deletions(-) (limited to 'libass') diff --git a/libass/ass_render.c b/libass/ass_render.c index 3ee750e..e62846e 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1284,75 +1284,74 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info) BitmapHashValue *val; OutlineBitmapHashKey *key = &info->hash_key.u.outline; + if (!info->outline || info->symbol == '\n' || info->symbol == 0 || info->skip) + return; + val = ass_cache_get(render_priv->cache.bitmap_cache, &info->hash_key); - if (val) { - info->bm = val->bm; - info->bm_o = val->bm_o; - info->bm_s = val->bm_s; - } else { + if (!val) { FT_Vector shift; BitmapHashValue hash_val; int error; double fax_scaled, fay_scaled; - info->bm = info->bm_o = info->bm_s = 0; - if (info->outline && info->symbol != '\n' && info->symbol != 0 - && !info->skip) { - FT_Outline *outline, *border; - double scale_x = render_priv->font_scale_x; - - outline_copy(render_priv->ftlibrary, info->outline, &outline); - outline_copy(render_priv->ftlibrary, info->border, &border); - // calculating rotation shift vector (from rotation origin to the glyph basepoint) - shift.x = key->shift_x; - shift.y = key->shift_y; - fax_scaled = info->fax * - render_priv->state.scale_x; - fay_scaled = info->fay * render_priv->state.scale_y; - // apply rotation - transform_3d(shift, outline, border, - info->frx, info->fry, info->frz, fax_scaled, - fay_scaled, render_priv->font_scale, info->asc); - - // PAR correction scaling - FT_Matrix m = { double_to_d16(scale_x), 0, - 0, double_to_d16(1.0) }; - - // subpixel shift - if (outline) { - if (scale_x != 1.0) - FT_Outline_Transform(outline, &m); - FT_Outline_Translate(outline, key->advance.x, -key->advance.y); - } - if (border) { - if (scale_x != 1.0) - FT_Outline_Transform(border, &m); - FT_Outline_Translate(border, key->advance.x, -key->advance.y); - } - // render glyph - error = outline_to_bitmap3(render_priv->library, - render_priv->synth_priv, - render_priv->ftlibrary, - outline, border, - &info->bm, &info->bm_o, - &info->bm_s, info->be, - info->blur * render_priv->border_scale, - key->shadow_offset, - render_priv->state.style->BorderStyle); - if (error) - info->symbol = 0; - - // add bitmaps to cache - hash_val.bm_o = info->bm_o; - hash_val.bm = info->bm; - hash_val.bm_s = info->bm_s; - ass_cache_put(render_priv->cache.bitmap_cache, &info->hash_key, - &hash_val); - - outline_free(render_priv->ftlibrary, outline); - outline_free(render_priv->ftlibrary, border); + FT_Outline *outline, *border; + double scale_x = render_priv->font_scale_x; + + hash_val.bm = hash_val.bm_o = hash_val.bm_s = 0; + + outline_copy(render_priv->ftlibrary, info->outline, &outline); + outline_copy(render_priv->ftlibrary, info->border, &border); + + // calculating rotation shift vector (from rotation origin to the glyph basepoint) + shift.x = key->shift_x; + shift.y = key->shift_y; + fax_scaled = info->fax * render_priv->state.scale_x; + fay_scaled = info->fay * render_priv->state.scale_y; + + // apply rotation + transform_3d(shift, outline, border, + info->frx, info->fry, info->frz, fax_scaled, + fay_scaled, render_priv->font_scale, info->asc); + + // PAR correction scaling + FT_Matrix m = { double_to_d16(scale_x), 0, + 0, double_to_d16(1.0) }; + + // subpixel shift + if (outline) { + if (scale_x != 1.0) + FT_Outline_Transform(outline, &m); + FT_Outline_Translate(outline, key->advance.x, -key->advance.y); } - } + if (border) { + if (scale_x != 1.0) + FT_Outline_Transform(border, &m); + FT_Outline_Translate(border, key->advance.x, -key->advance.y); + } + + // render glyph + error = outline_to_bitmap3(render_priv->library, + render_priv->synth_priv, + render_priv->ftlibrary, + outline, border, + &hash_val.bm, &hash_val.bm_o, + &hash_val.bm_s, info->be, + info->blur * render_priv->border_scale, + key->shadow_offset, + render_priv->state.style->BorderStyle); + if (error) + info->symbol = 0; + + val = ass_cache_put(render_priv->cache.bitmap_cache, &info->hash_key, + &hash_val); + + outline_free(render_priv->ftlibrary, outline); + outline_free(render_priv->ftlibrary, border); + } + + info->bm = val->bm; + info->bm_o = val->bm_o; + info->bm_s = val->bm_s; // VSFilter compatibility: invisible fill and no border? // In this case no shadow is supposed to be rendered. -- cgit v1.2.3