diff options
author | wm4 <wm4@nowhere> | 2017-01-11 07:10:13 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2017-01-11 16:58:20 +0100 |
commit | dec079d312a2dcf73d20446bebd2935e8a6a9e41 (patch) | |
tree | eafc9cd750e6921f0a7accdc18842a555c7eeb3e /libass/ass_render.c | |
parent | 3b08a1dcb5be8ef42feafdfcbe6a8be97f9a4a9e (diff) | |
download | libass-dec079d312a2dcf73d20446bebd2935e8a6a9e41.tar.bz2 libass-dec079d312a2dcf73d20446bebd2935e8a6a9e41.tar.xz |
render: clip BorderStyle=4 against screen
ASS_Images returned by libass are guaranteed to be clipped. Not doing
this will cause invalid memory accesses in applications which try to use
this guarantee.
Fixes #254.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r-- | libass/ass_render.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index d0f827d3..101131ea 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -2413,15 +2413,23 @@ static void render_and_combine_glyphs(ASS_Renderer *render_priv, static void add_background(ASS_Renderer *render_priv, EventImages *event_images) { - void *nbuffer = ass_aligned_alloc(1, event_images->width * event_images->height, false); + int left = event_images->left; + int top = event_images->top; + int right = event_images->left + event_images->width; + int bottom = event_images->top + event_images->height; + left = FFMINMAX(left, 0, render_priv->width); + top = FFMINMAX(top, 0, render_priv->height); + right = FFMINMAX(right, 0, render_priv->width); + bottom = FFMINMAX(bottom, 0, render_priv->height); + int w = right - left; + int h = bottom - top; + if (w < 1 || h < 1) + return; + void *nbuffer = ass_aligned_alloc(1, w * h, false); if (!nbuffer) return; - memset(nbuffer, 0xFF, event_images->width * event_images->height); - ASS_Image *img = my_draw_bitmap(nbuffer, event_images->width, - event_images->height, - event_images->width, - event_images->left, - event_images->top, + memset(nbuffer, 0xFF, w * h); + ASS_Image *img = my_draw_bitmap(nbuffer, w, h, w, left, top, render_priv->state.c[3], NULL); if (img) { img->next = event_images->imgs; |