diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2014-01-15 02:16:58 +0000 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2014-01-15 03:43:08 +0000 |
commit | 088c617c3ee6ef0a21a71a1310972e60134fda94 (patch) | |
tree | 85fecf50281350b3215fbd10a1594ee694db46f9 /libass | |
parent | f6211a334e238483ba1da05e5879e3c54e93f401 (diff) | |
download | libass-088c617c3ee6ef0a21a71a1310972e60134fda94.tar.bz2 libass-088c617c3ee6ef0a21a71a1310972e60134fda94.tar.xz |
Fix \t corner cases
The end time is reset to line duration if and only if it is zero.
Negative accelerations are allowed (and can cause overflow later).
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_parse.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c index c426d13..2b49cbb 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -609,8 +609,7 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) } } else if (mystrcmp(&p, "t")) { double v[3]; - int v1, v2; - double v3; + double accel; int cnt; long long t1, t2, t, delta_t; double k; @@ -621,28 +620,26 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) skip(','); } if (cnt == 3) { - v1 = v[0]; - v2 = (v[1] < v1) ? render_priv->state.event->Duration : v[1]; - v3 = v[2]; + t1 = v[0]; + t2 = v[1]; + accel = v[2]; } else if (cnt == 2) { - v1 = v[0]; - v2 = (v[1] < v1) ? render_priv->state.event->Duration : v[1]; - v3 = 1.; + t1 = v[0]; + t2 = v[1]; + accel = 1.; } else if (cnt == 1) { - v1 = 0; - v2 = render_priv->state.event->Duration; - v3 = v[0]; + t1 = 0; + t2 = 0; + accel = v[0]; } else { // cnt == 0 - v1 = 0; - v2 = render_priv->state.event->Duration; - v3 = 1.; + t1 = 0; + t2 = 0; + accel = 1.; } render_priv->state.detect_collisions = 0; - t1 = v1; - t2 = v2; - delta_t = v2 - v1; - if (v3 < 0.) - v3 = 0.; + if (t2 == 0) + t2 = render_priv->state.event->Duration; + delta_t = t2 - t1; t = render_priv->time - render_priv->state.event->Start; // FIXME: move to render_context if (t <= t1) k = 0.; @@ -650,7 +647,7 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) k = 1.; else { assert(delta_t != 0.); - k = pow(((double) (t - t1)) / delta_t, v3); + k = pow(((double) (t - t1)) / delta_t, accel); } while (*p != ')' && *p != '}' && *p != '\0') p = parse_tag(render_priv, p, k); // maybe k*pwr ? no, specs forbid nested \t's |