From 56db1dc607617e4bd7adfd9e45bbeffcc19327b1 Mon Sep 17 00:00:00 2001 From: Vitaliy Cherepanov Date: Wed, 19 Oct 2016 20:49:20 +0300 Subject: [PATCH] fix UIHV screenshot of object placed out of screen Change-Id: Ib2bf26aae6284f604c635352d87a69bde7fb9202 Signed-off-by: Vitaliy Cherepanov --- ui_viewer/ui_viewer_screenshot.c | 54 +++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/ui_viewer/ui_viewer_screenshot.c b/ui_viewer/ui_viewer_screenshot.c index 73501bf..b202b24 100644 --- a/ui_viewer/ui_viewer_screenshot.c +++ b/ui_viewer/ui_viewer_screenshot.c @@ -268,35 +268,65 @@ static void __set_buffer_size(struct efl_data *data) } } +static int min(int a, int b) +{ + if (a < b) + return a; + return b; +} + +static int max(int a, int b) +{ + if (a > b) + return a; + return b; +} + static void *__tbm_surface_to_buf(unsigned char *src, uint32_t src_stride, uint32_t src_size, int x, int y, int width, int height) { int dest_stride; + int dest_copy_size; void *data, *dest; - uint32_t dest_size, n; + uint32_t dest_size; + int n; - dest_stride = width * 4; - dest_size = dest_stride * height; + int dest_x, dest_y, dest_width, dest_height; + int src_x, src_y, src_width, src_height; - if (dest_size > src_size) - return NULL; - data = malloc(dest_size); + src_x = max(x, 0); + src_y = max(y, 0); + + src_width = src_stride / 4; + src_height = src_size / src_stride; + + src_width = max(0, min(x + width, src_width) - src_x); + src_height = max(0, min(y + height, src_height) - src_y); + + dest_x = -min(x, 0); + dest_y = -min(y, 0); + dest_width = width; + dest_height = height; + dest_stride = dest_width * 4; + dest_size = dest_stride * dest_height; + + data = calloc(1, dest_size); if (!data) return NULL; dest = data; - src = src + y * src_stride + x * 4; - n = 0; - while (n < dest_size) { - memcpy(dest, src, dest_stride); - n += dest_stride; + dest = data + dest_x * 4 + dest_y * dest_stride; + src = src + src_x * 4 + src_y * src_stride; + dest_copy_size = src_width * 4; + + for (n = 0; n < src_height; n++) { + memcpy(dest, src, dest_copy_size); dest += dest_stride; src += src_stride; } - return data; } -- 2.7.4