]> granicus.if.org Git - libass/commitdiff
Don't use margins for events that should not be overridden
authorwm4 <wm4@nowhere>
Mon, 16 Mar 2015 20:02:47 +0000 (21:02 +0100)
committerwm4 <wm4@nowhere>
Mon, 16 Mar 2015 20:02:47 +0000 (21:02 +0100)
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
libass/ass_render.h

index 97dc1192bc96ae2c9c43a16d352de5bb876a8721..70858827bfb5ebfd3fc75f9e6d7d2e3f00e033ff 100644 (file)
@@ -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);
 
index d7416e184f696168466c2059fd1c4e83e63ed22c..8b4698b24c6350280a0fd8b57a96f271ad182468 100644 (file)
@@ -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;