]> granicus.if.org Git - libass/commitdiff
Parse vector clip mask only after cache miss
authorGrigori Goronzy <greg@blackbox>
Thu, 29 Jul 2010 01:05:19 +0000 (03:05 +0200)
committerGrigori Goronzy <greg@blackbox>
Thu, 29 Jul 2010 01:05:19 +0000 (03:05 +0200)
libass/ass_parse.c
libass/ass_render.c

index dc872b9dd061e2560a8f588747a70019f23d7a67..2fb33da5b652b76f95102036ebea685168746479 100644 (file)
@@ -233,20 +233,6 @@ static char *parse_vector_clip(ASS_Renderer *render_priv, char *p)
     while (*p != ')' && *p != '}' && p != 0)
         ass_drawing_add_char(drawing, *p++);
     skipopt(')');
-    if (ass_drawing_parse(drawing, 1)) {
-        // We need to translate the clip according to screen borders
-        if (render_priv->settings.left_margin != 0 ||
-            render_priv->settings.top_margin != 0) {
-            FT_Vector trans = {
-                .x = int_to_d6(render_priv->settings.left_margin),
-                .y = -int_to_d6(render_priv->settings.top_margin),
-            };
-            FT_Outline_Translate(&drawing->glyph->outline, trans.x, trans.y);
-        }
-        ass_msg(render_priv->library, MSGL_DBG2,
-                "Parsed vector clip: scale %d, scales (%f, %f) string [%s]\n",
-                scale, drawing->scale_x, drawing->scale_y, drawing->text);
-    }
 
     return p;
 }
index 59d13ed22827494d6927ac5cc04816e0d2c14517..cf11f92c1857f82e1f42882880152963ee8670a3 100644 (file)
@@ -598,8 +598,29 @@ static void blend_vector_clip(ASS_Renderer *render_priv,
     } else {
         GlyphHashValue v;
 
-        // Not found in cache, rasterize it
-        glyph = (FT_Glyph) drawing->glyph;
+        // Not found in cache, parse and rasterize it
+        glyph = (FT_Glyph) *ass_drawing_parse(drawing, 1);
+        if (!glyph) {
+            ass_msg(render_priv->library, MSGL_WARN,
+                    "Clip vector parsing failed. Skipping.");
+            goto blend_vector_exit;
+        }
+
+        // We need to translate the clip according to screen borders
+        if (render_priv->settings.left_margin != 0 ||
+            render_priv->settings.top_margin != 0) {
+            FT_Vector trans = {
+                .x = int_to_d6(render_priv->settings.left_margin),
+                .y = -int_to_d6(render_priv->settings.top_margin),
+            };
+            FT_Outline_Translate(&drawing->glyph->outline,
+                                 trans.x, trans.y);
+        }
+
+        ass_msg(render_priv->library, MSGL_DBG2,
+                "Parsed vector clip: scales (%f, %f) string [%s]\n",
+                drawing->scale_x, drawing->scale_y, drawing->text);
+
         error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
         if (error) {
             ass_msg(render_priv->library, MSGL_WARN,