summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2014-01-08 04:18:56 +0200
committerOleg Oshmyan <chortos@inbox.lv>2014-01-08 04:18:56 +0200
commit1f5eb5ebc776a64cb7034c489353adc127d75793 (patch)
treef9c8114782dcfc3ea304b6538b95db774d59b837
parent0b36713ae21722102f435e4645ac79dfccba6730 (diff)
downloadlibass-1f5eb5ebc776a64cb7034c489353adc127d75793.tar.bz2
libass-1f5eb5ebc776a64cb7034c489353adc127d75793.tar.xz
Do not reset \pbo and \p values after each drawing
Confirmed with VSFilter. This complements the previous commit.
-rw-r--r--libass/ass_parse.c7
-rw-r--r--libass/ass_render.c8
-rw-r--r--libass/ass_render.h3
3 files changed, 10 insertions, 8 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c
index 46bb6b0..c426d13 100644
--- a/libass/ass_parse.c
+++ b/libass/ass_parse.c
@@ -832,13 +832,12 @@ char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr)
} else if (mystrcmp(&p, "pbo")) {
double val;
mystrtod(&p, &val);
- render_priv->state.drawing->pbo = val;
+ render_priv->state.pbo = val;
} else if (mystrcmp(&p, "p")) {
int val;
mystrtoi(&p, &val);
- if (val > 0)
- render_priv->state.drawing->scale = val;
- render_priv->state.drawing_mode = val > 0;
+ val = (val < 0) ? 0 : val;
+ render_priv->state.drawing_scale = val;
} else if (mystrcmp(&p, "q")) {
int val;
if (!mystrtoi(&p, &val) || !(val >= 0 && val <= 3))
diff --git a/libass/ass_render.c b/libass/ass_render.c
index dbc487c..1edb9ae 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -907,7 +907,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event)
render_priv->state.clip_mode = 0;
render_priv->state.detect_collisions = 1;
render_priv->state.fade = 0;
- render_priv->state.drawing_mode = 0;
+ render_priv->state.drawing_scale = 0;
render_priv->state.effect_type = EF_NONE;
render_priv->state.effect_timing = 0;
render_priv->state.effect_skip_timing = 0;
@@ -1755,7 +1755,7 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
if (!in_tag && *p == '{') { // '\0' goes here
p++;
in_tag = 1;
- if (render_priv->state.drawing_mode) {
+ if (render_priv->state.drawing_scale) {
// A drawing definition has just ended.
// Exit and create the drawing now lest we
// accidentally let it consume later text
@@ -1775,7 +1775,7 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
}
} else {
code = get_next_char(render_priv, &p);
- if (code && render_priv->state.drawing_mode) {
+ if (code && render_priv->state.drawing_scale) {
ass_drawing_add_char(drawing, (char) code);
continue; // skip everything in drawing mode
}
@@ -1802,6 +1802,8 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
render_priv->font_scale;
drawing->scale_y = render_priv->state.scale_y *
render_priv->font_scale;
+ drawing->scale = render_priv->state.drawing_scale;
+ drawing->pbo = render_priv->state.pbo;
code = 0xfffc; // object replacement character
info->drawing = drawing;
}
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 3a7c6d9..a41586b 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -214,7 +214,8 @@ typedef struct {
double blur; // gaussian blur
double shadow_x;
double shadow_y;
- int drawing_mode; // not implemented; when != 0 text is discarded, except for style override tags
+ int drawing_scale; // currently reading: regular text if 0, drawing otherwise
+ double pbo; // drawing baseline offset
ASS_Drawing *drawing; // current drawing
ASS_Drawing *clip_drawing; // clip vector
int clip_drawing_mode; // 0 = regular clip, 1 = inverse clip