summaryrefslogtreecommitdiffstats
path: root/libass/ass_parse.c
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2011-05-16 02:04:38 +0200
committerGrigori Goronzy <greg@blackbox>2011-05-30 21:35:53 +0200
commite6438cc29c441ed6d0aad17dc6bdd85b69ced61b (patch)
treee9ee38211b6a35f80e74170550f88c53255f59f6 /libass/ass_parse.c
parent1e246a4a242afd2ddc4e9dea698ce8ec02e3538a (diff)
downloadlibass-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.c27
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('(');