screenshooter: refactor the copy loop
authorPekka Paalanen <ppaalanen@gmail.com>
Tue, 17 Apr 2012 08:55:41 +0000 (11:55 +0300)
committerPekka Paalanen <ppaalanen@gmail.com>
Tue, 17 Apr 2012 11:57:24 +0000 (14:57 +0300)
This makes it easier to later add an alternative copy loop.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
src/screenshooter.c

index bd81351..835e175 100644 (file)
@@ -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);
 }