]> granicus.if.org Git - libass/commitdiff
Match first occurence of \fade, \fad, \an and \a tags
authorGrigori Goronzy <greg@blackbox>
Mon, 16 May 2011 00:04:38 +0000 (02:04 +0200)
committerGrigori Goronzy <greg@blackbox>
Mon, 30 May 2011 19:35:53 +0000 (21:35 +0200)
Track if we already parsed a fade or a alignment tag and ignore all
further tags.

libass/ass_parse.c
libass/ass_render.c
libass/ass_render.h

index 40aaf0430262f6b309eb4be81c408c68b051a95b..55e8fd129030a303243a31d2af09df892330c3fa 100644 (file)
@@ -503,16 +503,22 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
             val = ((val - 1) % 3) + 1;  // horizontal alignment
             val += v * 4;
             ass_msg(render_priv->library, MSGL_DBG2, "align %d", val);
-            render_priv->state.alignment = val;
+            if ((render_priv->state.parsed_tags & PARSED_A) == 0) {
+                render_priv->state.alignment = val;
+                render_priv->state.parsed_tags |= PARSED_A;
+            }
         } else
             render_priv->state.alignment =
                 render_priv->state.style->Alignment;
     } else if (mystrcmp(&p, "a")) {
         int val;
-        if (mystrtoi(&p, &val) && val)
-            // take care of a vsfilter quirk: handle illegal \a8 like \a5
-            render_priv->state.alignment = (val == 8) ? 5 : val;
-        else
+        if (mystrtoi(&p, &val) && val) {
+            if ((render_priv->state.parsed_tags & PARSED_A) == 0) {
+                // take care of a vsfilter quirk: handle illegal \a8 like \a5
+                render_priv->state.alignment = (val == 8) ? 5 : val;
+                render_priv->state.parsed_tags |= PARSED_A;
+            }
+        } else
             render_priv->state.alignment =
                 render_priv->state.style->Alignment;
     } else if (mystrcmp(&p, "pos")) {
@@ -566,10 +572,13 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
             mystrtoll(&p, &t4);
         }
         skip(')');
-        render_priv->state.fade =
-            interpolate_alpha(render_priv->time -
-                              render_priv->state.event->Start, t1, t2,
-                              t3, t4, a1, a2, a3);
+        if ((render_priv->state.parsed_tags & PARSED_FADE) == 0) {
+            render_priv->state.fade =
+                interpolate_alpha(render_priv->time -
+                        render_priv->state.event->Start, t1, t2,
+                        t3, t4, a1, a2, a3);
+            render_priv->state.parsed_tags |= PARSED_FADE;
+        }
     } else if (mystrcmp(&p, "org")) {
         int v1, v2;
         skip('(');
index 2f3405e67cdcbe4f57b6e7b5b59dec59c7003fe2..0db63036e00cc08221c52a8fd1e760e37494b51a 100644 (file)
@@ -887,6 +887,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event)
 {
     render_priv->state.event = event;
     render_priv->state.style = render_priv->track->styles + event->Style;
+    render_priv->state.parsed_tags = 0;
 
     reset_render_context(render_priv);
 
index 89bffb0127ad41a7cbf9ee4d2a64aaae231bfa90..78c733904d1ae6b675d6b2a405975e486459160a 100644 (file)
@@ -39,6 +39,9 @@
 #define GLYPH_CACHE_MAX 1000
 #define BITMAP_CACHE_MAX_SIZE 30 * 1048576
 
+#define PARSED_FADE (1<<0)
+#define PARSED_A    (1<<1)
+
 typedef struct {
     double xMin;
     double xMax;
@@ -141,6 +144,7 @@ typedef struct {
 typedef struct {
     ASS_Event *event;
     ASS_Style *style;
+    int parsed_tags;
 
     ASS_Font *font;
     char *font_path;