]> granicus.if.org Git - libass/commitdiff
Deterministic bitmap loading
authorGrigori Goronzy <greg@blackbox>
Mon, 15 Aug 2011 15:28:13 +0000 (17:28 +0200)
committerGrigori Goronzy <greg@blackbox>
Mon, 15 Aug 2011 15:28:13 +0000 (17:28 +0200)
This is similar to the earlier change, but for bitmaps.

libass/ass_render.c

index 3ee750ebd4da95ffb10865c4bc0abdfed2e6d84a..e62846ec6b5ca4f69a0ea1973178db82cd732043 100644 (file)
@@ -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.