summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-03-16 21:02:47 +0100
committerwm4 <wm4@nowhere>2015-03-16 21:02:47 +0100
commite0200429f799b4a06e1b4ca18ab7eab504777241 (patch)
treefb57f7ec4d292e1e2c5d6fa6657756d30aabf8de
parent50799d10fac81f25f2da8353d0394875101ee220 (diff)
downloadlibass-e0200429f799b4a06e1b4ca18ab7eab504777241.tar.bz2
libass-e0200429f799b4a06e1b4ca18ab7eab504777241.tar.xz
Don't use margins for events that should not be overridden
libass already does not use the margins for events using \pos. This is not quite complete: there are other tags that we consider as "not dialogue", and which should not be overridden. These tags do not use EVENT_POSITIONED, and thus use the margins, which can mess up rendering.
-rw-r--r--libass/ass_render.c12
-rw-r--r--libass/ass_render.h2
2 files changed, 14 insertions, 0 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 97dc119..7085882 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -245,6 +245,8 @@ static double x2scr_pos(ASS_Renderer *render_priv, double x)
}
static double x2scr(ASS_Renderer *render_priv, double x)
{
+ if (render_priv->state.explicit)
+ return x2scr_pos(render_priv, x);
return x * render_priv->orig_width_nocrop / render_priv->font_scale_x /
render_priv->track->PlayResX +
FFMAX(render_priv->settings.left_margin, 0);
@@ -256,6 +258,8 @@ static double x2scr_pos_scaled(ASS_Renderer *render_priv, double x)
}
static double x2scr_scaled(ASS_Renderer *render_priv, double x)
{
+ if (render_priv->state.explicit)
+ return x2scr_pos_scaled(render_priv, x);
return x * render_priv->orig_width_nocrop /
render_priv->track->PlayResX +
FFMAX(render_priv->settings.left_margin, 0);
@@ -270,6 +274,8 @@ static double y2scr_pos(ASS_Renderer *render_priv, double y)
}
static double y2scr(ASS_Renderer *render_priv, double y)
{
+ if (render_priv->state.explicit)
+ return y2scr_pos(render_priv, y);
return y * render_priv->orig_height_nocrop /
render_priv->track->PlayResY +
FFMAX(render_priv->settings.top_margin, 0);
@@ -278,6 +284,8 @@ static double y2scr(ASS_Renderer *render_priv, double y)
// the same for toptitles
static double y2scr_top(ASS_Renderer *render_priv, double y)
{
+ if (render_priv->state.explicit)
+ return y2scr_pos(render_priv, y);
if (render_priv->settings.use_margins)
return y * render_priv->orig_height_nocrop /
render_priv->track->PlayResY;
@@ -289,6 +297,8 @@ static double y2scr_top(ASS_Renderer *render_priv, double y)
// the same for subtitles
static double y2scr_sub(ASS_Renderer *render_priv, double y)
{
+ if (render_priv->state.explicit)
+ return y2scr_pos(render_priv, y);
if (render_priv->settings.use_margins)
return y * render_priv->orig_height_nocrop /
render_priv->track->PlayResY +
@@ -772,6 +782,8 @@ static ASS_Style *handle_selective_style_overrides(ASS_Renderer *render_priv,
// script's style that are deemed necessary.
*new = *rstyle;
+ render_priv->state.explicit = explicit;
+
render_priv->state.apply_font_scale =
!explicit || !(requested & ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE);
diff --git a/libass/ass_render.h b/libass/ass_render.h
index d7416e1..8b4698b 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -275,6 +275,8 @@ typedef struct {
unsigned overrides;
// whether to apply font_scale
int apply_font_scale;
+ // whether this is assumed to be explicitly positioned
+ int explicit;
// used to store RenderContext.style when doing selective style overrides
ASS_Style override_style_temp_storage;