diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2020-10-17 02:38:49 +0300 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2020-10-18 05:03:17 +0300 |
commit | 0aec12b3576e93f8387992de73bca99ab6e50d2f (patch) | |
tree | bd5e8fe9d5e250200c264179596b5345c0e570df /libass | |
parent | cc2b5e9e4829ca0487ea3707e2e77219c99975c8 (diff) | |
download | libass-0aec12b3576e93f8387992de73bca99ab6e50d2f.tar.bz2 libass-0aec12b3576e93f8387992de73bca99ab6e50d2f.tar.xz |
Fix Scroll effects with rectangle \clip/\iclip
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_parse.c | 4 | ||||
-rw-r--r-- | libass/ass_render.c | 12 | ||||
-rw-r--r-- | libass/ass_render.h | 1 |
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; |