From e0200429f799b4a06e1b4ca18ab7eab504777241 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 16 Mar 2015 21:02:47 +0100 Subject: 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. --- libass/ass_render.c | 12 ++++++++++++ libass/ass_render.h | 2 ++ 2 files changed, 14 insertions(+) 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; -- cgit v1.2.3