summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--libass/ass_parse.c27
-rw-r--r--libass/ass_render.c1
-rw-r--r--libass/ass_render.h4
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;