summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2020-10-17 00:25:57 +0300
committerOleg Oshmyan <chortos@inbox.lv>2020-10-18 05:03:17 +0300
commitb27b97ae52a0af7f4a0f32b32c280d8cc1dae12c (patch)
tree21a2ec2b3e164f4fbf521981e8445c2fdf632d13
parent3250a3b784f3b76d476943ab9ffd880c720ecb10 (diff)
downloadlibass-b27b97ae52a0af7f4a0f32b32c280d8cc1dae12c.tar.bz2
libass-b27b97ae52a0af7f4a0f32b32c280d8cc1dae12c.tar.xz
ass_render_event: simplify clip conversion to screen coordinates
The "depends on alignment" block is useless: if use_margins, then the coordinates will be overridden, but if not, then all of the various x/y2scr... calls delegate to x/y2scr_pos... Rewrite several lines using FFMIN/FFMAX to keep them short.
-rw-r--r--libass/ass_render.c68
1 files changed, 15 insertions, 53 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index eb3dbaf..fe499f1 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -224,21 +224,6 @@ static double x2scr_pos_scaled(ASS_Renderer *render_priv, double x)
return x * render_priv->orig_width / render_priv->track->PlayResX +
render_priv->settings.left_margin;
}
-static double x2scr_left_scaled(ASS_Renderer *render_priv, double x)
-{
- if (render_priv->state.explicit || !render_priv->settings.use_margins)
- return x2scr_pos_scaled(render_priv, x);
- return x * render_priv->fit_width /
- render_priv->track->PlayResX;
-}
-static double x2scr_right_scaled(ASS_Renderer *render_priv, double x)
-{
- if (render_priv->state.explicit || !render_priv->settings.use_margins)
- return x2scr_pos_scaled(render_priv, x);
- return x * render_priv->fit_width /
- render_priv->track->PlayResX +
- (render_priv->width - render_priv->fit_width);
-}
/**
* \brief Mapping between script and screen coordinates
*/
@@ -2751,31 +2736,8 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
y2scr_pos(render_priv, render_priv->state.pos_y) - base_y;
}
- // fix clip coordinates (they depend on alignment)
- if (render_priv->state.evt_type == EVENT_NORMAL ||
- render_priv->state.evt_type == EVENT_HSCROLL ||
- render_priv->state.evt_type == EVENT_VSCROLL) {
- render_priv->state.clip_x0 =
- x2scr_left_scaled(render_priv, render_priv->state.clip_x0);
- render_priv->state.clip_x1 =
- x2scr_right_scaled(render_priv, render_priv->state.clip_x1);
- if (valign == VALIGN_TOP) {
- render_priv->state.clip_y0 =
- y2scr_top(render_priv, render_priv->state.clip_y0);
- render_priv->state.clip_y1 =
- y2scr_top(render_priv, render_priv->state.clip_y1);
- } else if (valign == VALIGN_CENTER) {
- render_priv->state.clip_y0 =
- y2scr(render_priv, render_priv->state.clip_y0);
- render_priv->state.clip_y1 =
- y2scr(render_priv, render_priv->state.clip_y1);
- } else if (valign == VALIGN_SUB) {
- render_priv->state.clip_y0 =
- y2scr_sub(render_priv, render_priv->state.clip_y0);
- render_priv->state.clip_y1 =
- y2scr_sub(render_priv, render_priv->state.clip_y1);
- }
- } else if (render_priv->state.evt_type == EVENT_POSITIONED) {
+ // fix clip coordinates
+ if (render_priv->state.explicit || !render_priv->settings.use_margins) {
render_priv->state.clip_x0 =
x2scr_pos_scaled(render_priv, render_priv->state.clip_x0);
render_priv->state.clip_x1 =
@@ -2784,20 +2746,20 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
y2scr_pos(render_priv, render_priv->state.clip_y0);
render_priv->state.clip_y1 =
y2scr_pos(render_priv, render_priv->state.clip_y1);
- }
-
- if (render_priv->state.explicit) {
- // we still need to clip against screen boundaries
- double zx = x2scr_pos_scaled(render_priv, 0);
- double zy = y2scr_pos(render_priv, 0);
- double sx = x2scr_pos_scaled(render_priv, render_priv->track->PlayResX);
- double sy = y2scr_pos(render_priv, render_priv->track->PlayResY);
- render_priv->state.clip_x0 = render_priv->state.clip_x0 < zx ? zx : render_priv->state.clip_x0;
- render_priv->state.clip_y0 = render_priv->state.clip_y0 < zy ? zy : render_priv->state.clip_y0;
- render_priv->state.clip_x1 = render_priv->state.clip_x1 > sx ? sx : render_priv->state.clip_x1;
- render_priv->state.clip_y1 = render_priv->state.clip_y1 > sy ? sy : render_priv->state.clip_y1;
- } else if (render_priv->settings.use_margins) {
+ if (render_priv->state.explicit) {
+ // we still need to clip against screen boundaries
+ double zx = x2scr_pos_scaled(render_priv, 0);
+ double zy = y2scr_pos(render_priv, 0);
+ double sx = x2scr_pos_scaled(render_priv, render_priv->track->PlayResX);
+ double sy = y2scr_pos(render_priv, render_priv->track->PlayResY);
+
+ render_priv->state.clip_x0 = FFMAX(render_priv->state.clip_x0, zx);
+ render_priv->state.clip_y0 = FFMAX(render_priv->state.clip_y0, zy);
+ render_priv->state.clip_x1 = FFMIN(render_priv->state.clip_x1, sx);
+ render_priv->state.clip_y1 = FFMIN(render_priv->state.clip_y1, sy);
+ }
+ } else {
// no \clip (explicit==0) and use_margins => only clip to screen with margins
render_priv->state.clip_x0 = 0;
render_priv->state.clip_y0 = 0;