screenshooter: refactor the copy loop

This makes it easier to later add an alternative copy loop.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Pekka Paalanen 13 years ago
parent 299e58d9f8
commit 45fab0e8e6
  1. 24
      src/screenshooter.c

@ -36,6 +36,20 @@ struct screenshooter {
struct wl_listener destroy_listener;
};
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,
@ -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);
}

Loading…
Cancel
Save