diff options
author | Grigori Goronzy <greg@blackbox> | 2011-05-16 02:04:38 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2011-05-30 21:35:53 +0200 |
commit | e6438cc29c441ed6d0aad17dc6bdd85b69ced61b (patch) | |
tree | e9ee38211b6a35f80e74170550f88c53255f59f6 /libass/ass_parse.c | |
parent | 1e246a4a242afd2ddc4e9dea698ce8ec02e3538a (diff) | |
download | libass-e6438cc29c441ed6d0aad17dc6bdd85b69ced61b.tar.bz2 libass-e6438cc29c441ed6d0aad17dc6bdd85b69ced61b.tar.xz |
Match first occurence of \fade, \fad, \an and \a tags
Track if we already parsed a fade or a alignment tag and ignore all
further tags.
Diffstat (limited to 'libass/ass_parse.c')
-rw-r--r-- | libass/ass_parse.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c index 40aaf04..55e8fd1 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -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('('); |