summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2020-10-17 02:38:49 +0300
committerOleg Oshmyan <chortos@inbox.lv>2020-10-18 05:03:17 +0300
commit0aec12b3576e93f8387992de73bca99ab6e50d2f (patch)
treebd5e8fe9d5e250200c264179596b5345c0e570df /libass
parentcc2b5e9e4829ca0487ea3707e2e77219c99975c8 (diff)
downloadlibass-0aec12b3576e93f8387992de73bca99ab6e50d2f.tar.bz2
libass-0aec12b3576e93f8387992de73bca99ab6e50d2f.tar.xz
Fix Scroll effects with rectangle \clip/\iclip
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_parse.c4
-rw-r--r--libass/ass_render.c12
-rw-r--r--libass/ass_render.h1
3 files changed, 13 insertions, 4 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c
index 920b035..4134987 100644
--- a/libass/ass_parse.c
+++ b/libass/ass_parse.c
@@ -943,8 +943,8 @@ void apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event)
y0 = v[1];
y1 = v[0];
}
- render_priv->state.clip_y0 = y0;
- render_priv->state.clip_y1 = y1;
+ render_priv->state.scroll_y0 = y0;
+ render_priv->state.scroll_y1 = y1;
render_priv->state.evt_type |= EVENT_VSCROLL;
render_priv->state.detect_collisions = 0;
}
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 272a1e8..b00f22a 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -2687,13 +2687,13 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
if (render_priv->state.scroll_direction == SCROLL_TB)
device_y =
y2scr(render_priv,
- render_priv->state.clip_y0 +
+ render_priv->state.scroll_y0 +
render_priv->state.scroll_shift) -
bbox.y_max;
else if (render_priv->state.scroll_direction == SCROLL_BT)
device_y =
y2scr(render_priv,
- render_priv->state.clip_y1 -
+ render_priv->state.scroll_y1 -
render_priv->state.scroll_shift) -
bbox.y_min;
} else if (!(render_priv->state.evt_type & EVENT_POSITIONED)) {
@@ -2760,6 +2760,14 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
render_priv->state.clip_y1 = render_priv->settings.frame_height;
}
+ if (render_priv->state.evt_type & EVENT_VSCROLL) {
+ double y0 = y2scr_pos(render_priv, render_priv->state.scroll_y0);
+ double y1 = y2scr_pos(render_priv, render_priv->state.scroll_y1);
+
+ render_priv->state.clip_y0 = FFMAX(render_priv->state.clip_y0, y0);
+ render_priv->state.clip_y1 = FFMIN(render_priv->state.clip_y1, y1);
+ }
+
calculate_rotation_params(render_priv, &bbox, device_x, device_y);
render_and_combine_glyphs(render_priv, device_x, device_y);
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 22d7230..4714dfa 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -261,6 +261,7 @@ typedef struct {
SCROLL_BT
} scroll_direction; // for EVENT_HSCROLL, EVENT_VSCROLL
int scroll_shift;
+ int scroll_y0, scroll_y1;
// face properties
char *family;