summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2011-08-15 17:28:13 +0200
committerGrigori Goronzy <greg@blackbox>2011-08-15 17:28:13 +0200
commitd64a1c24d00be03d850758bf8936dc02ac8989ec (patch)
treedfff0ecffe80190c72c08c784da046d50e16c07e /libass/ass_render.c
parent64aa342057dfd5cb3aead09be562a40a75404927 (diff)
downloadlibass-d64a1c24d00be03d850758bf8936dc02ac8989ec.tar.bz2
libass-d64a1c24d00be03d850758bf8936dc02ac8989ec.tar.xz
Deterministic bitmap loading
This is similar to the earlier change, but for bitmaps.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c123
1 files changed, 61 insertions, 62 deletions
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.