diff libass/ass_parse.c @ 34011:88eebbbbd6a0

Update included libass copy to 0.9.13 release. Besides a license change to BSD license and other (minor?) fixes, this fixes possible crashes with the latest (2.4.6?) freetype release.
author reimar
date Sun, 11 Sep 2011 10:33:13 +0000
parents ac6e48baa03d
children 6e7f60f6f9d4
line wrap: on
line diff
--- a/libass/ass_parse.c	Sat Sep 10 09:37:52 2011 +0000
+++ b/libass/ass_parse.c	Sun Sep 11 10:33:13 2011 +0000
@@ -359,6 +359,22 @@
                 render_priv->state.hspacing * (1 - pwr) + val * pwr;
         else
             render_priv->state.hspacing = render_priv->state.style->Spacing;
+    } else if (mystrcmp(&p, "fs+")) {
+        double val;
+        if (mystrtod(&p, &val)) {
+            val = render_priv->state.font_size + pwr * val;
+        } else
+            val = render_priv->state.style->FontSize;
+        if (render_priv->state.font)
+            change_font_size(render_priv, val);
+    } else if (mystrcmp(&p, "fs-")) {
+        double val;
+        if (mystrtod(&p, &val))
+            val = render_priv->state.font_size - pwr * val;
+        else
+            val = render_priv->state.style->FontSize;
+        if (render_priv->state.font)
+            change_font_size(render_priv, val);
     } else if (mystrcmp(&p, "fs")) {
         double val;
         if (mystrtod(&p, &val))
@@ -487,16 +503,22 @@
             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")) {
@@ -550,10 +572,13 @@
             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('(');