From 45fab0e8e6d905bc110e9d080ad651057d234ffe Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Tue, 17 Apr 2012 11:55:41 +0300 Subject: [PATCH] screenshooter: refactor the copy loop This makes it easier to later add an alternative copy loop. Signed-off-by: Pekka Paalanen --- src/screenshooter.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/screenshooter.c b/src/screenshooter.c index bd81351..835e175 100644 --- a/src/screenshooter.c +++ b/src/screenshooter.c @@ -37,6 +37,20 @@ struct screenshooter { }; static void +copy_bgra_yflip(uint8_t *dst, uint8_t *src, int height, + int dst_stride, int src_stride) +{ + uint8_t *end; + + end = dst + height * dst_stride; + while (dst < end) { + memcpy(dst, src, src_stride); + dst += dst_stride; + src -= src_stride; + } +} + +static void screenshooter_shoot(struct wl_client *client, struct wl_resource *resource, struct wl_resource *output_resource, @@ -45,7 +59,7 @@ screenshooter_shoot(struct wl_client *client, struct weston_output *output = output_resource->data; struct wl_buffer *buffer = buffer_resource->data; uint8_t *tmp, *d, *s; - int32_t buffer_stride, output_stride, i; + int32_t buffer_stride, output_stride; if (!wl_buffer_is_shm(buffer)) return; @@ -68,12 +82,8 @@ screenshooter_shoot(struct wl_client *client, d = wl_shm_buffer_get_data(buffer) + output->y * buffer_stride + output->x * 4; s = tmp + output_stride * (output->current->height - 1); - - for (i = 0; i < output->current->height; i++) { - memcpy(d, s, output_stride); - d += buffer_stride; - s -= output_stride; - } + copy_bgra_yflip(d, s, output->current->height, + buffer_stride, output_stride); free(tmp); } -- 2.7.4