From e6438cc29c441ed6d0aad17dc6bdd85b69ced61b Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 16 May 2011 02:04:38 +0200 Subject: 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. --- libass/ass_parse.c | 27 ++++++++++++++++++--------- libass/ass_render.c | 1 + libass/ass_render.h | 4 ++++ 3 files changed, 23 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('('); diff --git a/libass/ass_render.c b/libass/ass_render.c index 2f3405e..0db6303 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -887,6 +887,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event) { render_priv->state.event = event; render_priv->state.style = render_priv->track->styles + event->Style; + render_priv->state.parsed_tags = 0; reset_render_context(render_priv); diff --git a/libass/ass_render.h b/libass/ass_render.h index 89bffb0..78c7339 100644 --- a/libass/ass_render.h +++ b/libass/ass_render.h @@ -39,6 +39,9 @@ #define GLYPH_CACHE_MAX 1000 #define BITMAP_CACHE_MAX_SIZE 30 * 1048576 +#define PARSED_FADE (1<<0) +#define PARSED_A (1<<1) + typedef struct { double xMin; double xMax; @@ -141,6 +144,7 @@ typedef struct { typedef struct { ASS_Event *event; ASS_Style *style; + int parsed_tags; ASS_Font *font; char *font_path; -- cgit v1.2.3