]> granicus.if.org Git - libass/commitdiff
Fix \fade corner cases
authorOleg Oshmyan <chortos@inbox.lv>
Wed, 15 Jan 2014 02:38:54 +0000 (02:38 +0000)
committerOleg Oshmyan <chortos@inbox.lv>
Wed, 15 Jan 2014 03:43:08 +0000 (03:43 +0000)
Times in \fade(,,,-1,fadein,fadeout,-1)
are interpreted as in \fad(fadein,fadeout).

Make sure we check the times in the same
order as VSFilter in case they are not sorted.

libass/ass_parse.c

index 2b49cbb794a368d1566e4e594ab8945c21703234..159be3b83ced3dd795867337c7045464bd61d98c 100644 (file)
@@ -183,16 +183,16 @@ interpolate_alpha(long long now, long long t1, long long t2, long long t3,
 
     if (now < t1) {
         a = a1;
-    } else if (now >= t4) {
-        a = a3;
-    } else if (now < t2 && t2 > t1) {
+    } else if (now < t2) {
         cf = ((double) (now - t1)) / (t2 - t1);
         a = a1 * (1 - cf) + a2 * cf;
-    } else if (now >= t3 && t4 > t3) {
+    } else if (now < t3) {
+        a = a2;
+    } else if (now < t4) {
         cf = ((double) (now - t3)) / (t4 - t3);
         a = a2 * (1 - cf) + a3 * cf;
-    } else {                    // t2 <= now < t3
-        a = a2;
+    } else {                    // now >= t4
+        a = a3;
     }
 
     return a;
@@ -564,10 +564,10 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
         if (*p == ')') {
             // 2-argument version (\fad, according to specs)
             // a1 and a2 are fade-in and fade-out durations
-            t1 = 0;
-            t4 = render_priv->state.event->Duration;
+            t1 = -1;
             t2 = a1;
-            t3 = t4 - a2;
+            t3 = a2;
+            t4 = -1;
             a1 = 0xFF;
             a2 = 0;
             a3 = 0xFF;
@@ -586,6 +586,11 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
             mystrtoll(&p, &t4);
         }
         skipopt(')');
+        if (t1 == -1 && t4 == -1) {
+            t1 = 0;
+            t4 = render_priv->state.event->Duration;
+            t3 = t4 - t3;
+        }
         if ((render_priv->state.parsed_tags & PARSED_FADE) == 0) {
             render_priv->state.fade =
                 interpolate_alpha(render_priv->time -