mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-07-22 19:24:27 +00:00
tests: drop test suite screenshooter implementation and protocol extension
This is a follow-up of commit "tests: start to use Weston's default screenshooter in the test suite". As we've started to use Weston's default screenshooter implementation and protocol extension in the test suite, we don't need what we've created specifically for the test suite anymore. Drop test suite screenshooter implementation and protocol extension. Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
This commit is contained in:
parent
9e90760ab0
commit
79491b41f5
|
@ -80,22 +80,6 @@
|
|||
<arg name="x" type="fixed"/>
|
||||
<arg name="y" type="fixed"/>
|
||||
</event>
|
||||
<request name="capture_screenshot">
|
||||
<description summary="records current screen image">
|
||||
Records an image of what is currently displayed on a given
|
||||
display output, returning the image as an event.
|
||||
</description>
|
||||
<arg name="output" type="object" interface="wl_output"
|
||||
summary="output to capture from"/>
|
||||
<arg name="buffer" type="object" interface="wl_buffer"
|
||||
summary="buffer for returning screenshots to the test client"/>
|
||||
</request>
|
||||
<event name="capture_screenshot_done">
|
||||
<description summary="screenshot capture is done">
|
||||
The capture_screenshot_done signal is sent when a screenshot has been copied into the
|
||||
provided buffer.
|
||||
</description>
|
||||
</event>
|
||||
<request name="send_touch">
|
||||
<arg name="tv_sec_hi" type="uint"/>
|
||||
<arg name="tv_sec_lo" type="uint"/>
|
||||
|
|
|
@ -338,250 +338,6 @@ device_add(struct wl_client *client,
|
|||
}
|
||||
}
|
||||
|
||||
enum weston_test_screenshot_outcome {
|
||||
WESTON_TEST_SCREENSHOT_SUCCESS,
|
||||
WESTON_TEST_SCREENSHOT_NO_MEMORY,
|
||||
WESTON_TEST_SCREENSHOT_BAD_BUFFER
|
||||
};
|
||||
|
||||
typedef void (*weston_test_screenshot_done_func_t)(void *data,
|
||||
enum weston_test_screenshot_outcome outcome);
|
||||
|
||||
struct test_screenshot {
|
||||
struct weston_compositor *compositor;
|
||||
struct wl_global *global;
|
||||
struct wl_client *client;
|
||||
struct weston_process process;
|
||||
struct wl_listener destroy_listener;
|
||||
};
|
||||
|
||||
struct test_screenshot_frame_listener {
|
||||
struct wl_listener listener;
|
||||
struct weston_buffer *buffer;
|
||||
struct weston_output *output;
|
||||
weston_test_screenshot_done_func_t done;
|
||||
void *data;
|
||||
};
|
||||
|
||||
static void
|
||||
copy_bgra_yflip(uint8_t *dst, uint8_t *src, int height, int stride)
|
||||
{
|
||||
uint8_t *end;
|
||||
|
||||
end = dst + height * stride;
|
||||
while (dst < end) {
|
||||
memcpy(dst, src, stride);
|
||||
dst += stride;
|
||||
src -= stride;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
copy_bgra(uint8_t *dst, uint8_t *src, int height, int stride)
|
||||
{
|
||||
/* TODO: optimize this out */
|
||||
memcpy(dst, src, height * stride);
|
||||
}
|
||||
|
||||
static void
|
||||
copy_row_swap_RB(void *vdst, void *vsrc, int bytes)
|
||||
{
|
||||
uint32_t *dst = vdst;
|
||||
uint32_t *src = vsrc;
|
||||
uint32_t *end = dst + bytes / 4;
|
||||
|
||||
while (dst < end) {
|
||||
uint32_t v = *src++;
|
||||
/* A R G B */
|
||||
uint32_t tmp = v & 0xff00ff00;
|
||||
tmp |= (v >> 16) & 0x000000ff;
|
||||
tmp |= (v << 16) & 0x00ff0000;
|
||||
*dst++ = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
copy_rgba_yflip(uint8_t *dst, uint8_t *src, int height, int stride)
|
||||
{
|
||||
uint8_t *end;
|
||||
|
||||
end = dst + height * stride;
|
||||
while (dst < end) {
|
||||
copy_row_swap_RB(dst, src, stride);
|
||||
dst += stride;
|
||||
src -= stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
copy_rgba(uint8_t *dst, uint8_t *src, int height, int stride)
|
||||
{
|
||||
uint8_t *end;
|
||||
|
||||
end = dst + height * stride;
|
||||
while (dst < end) {
|
||||
copy_row_swap_RB(dst, src, stride);
|
||||
dst += stride;
|
||||
src += stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
test_screenshot_frame_notify(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct test_screenshot_frame_listener *l =
|
||||
container_of(listener,
|
||||
struct test_screenshot_frame_listener, listener);
|
||||
struct weston_output *output = l->output;
|
||||
struct weston_compositor *compositor = output->compositor;
|
||||
int32_t stride;
|
||||
uint8_t *pixels, *d, *s;
|
||||
|
||||
weston_output_disable_planes_decr(output);
|
||||
wl_list_remove(&listener->link);
|
||||
stride = l->buffer->width * (PIXMAN_FORMAT_BPP(compositor->read_format) / 8);
|
||||
pixels = malloc(stride * l->buffer->height);
|
||||
|
||||
if (pixels == NULL) {
|
||||
l->done(l->data, WESTON_TEST_SCREENSHOT_NO_MEMORY);
|
||||
free(l);
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: Needs to handle output transformations */
|
||||
|
||||
compositor->renderer->read_pixels(output,
|
||||
compositor->read_format,
|
||||
pixels,
|
||||
0, 0,
|
||||
output->current_mode->width,
|
||||
output->current_mode->height);
|
||||
|
||||
stride = wl_shm_buffer_get_stride(l->buffer->shm_buffer);
|
||||
|
||||
d = wl_shm_buffer_get_data(l->buffer->shm_buffer);
|
||||
s = pixels + stride * (l->buffer->height - 1);
|
||||
|
||||
wl_shm_buffer_begin_access(l->buffer->shm_buffer);
|
||||
|
||||
/* XXX: It would be nice if we used Pixman to do all this rather
|
||||
* than our own implementation
|
||||
*/
|
||||
switch (compositor->read_format) {
|
||||
case PIXMAN_a8r8g8b8:
|
||||
case PIXMAN_x8r8g8b8:
|
||||
if (compositor->capabilities & WESTON_CAP_CAPTURE_YFLIP)
|
||||
copy_bgra_yflip(d, s, output->current_mode->height, stride);
|
||||
else
|
||||
copy_bgra(d, pixels, output->current_mode->height, stride);
|
||||
break;
|
||||
case PIXMAN_x8b8g8r8:
|
||||
case PIXMAN_a8b8g8r8:
|
||||
if (compositor->capabilities & WESTON_CAP_CAPTURE_YFLIP)
|
||||
copy_rgba_yflip(d, s, output->current_mode->height, stride);
|
||||
else
|
||||
copy_rgba(d, pixels, output->current_mode->height, stride);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
wl_shm_buffer_end_access(l->buffer->shm_buffer);
|
||||
|
||||
l->done(l->data, WESTON_TEST_SCREENSHOT_SUCCESS);
|
||||
free(pixels);
|
||||
free(l);
|
||||
}
|
||||
|
||||
static bool
|
||||
weston_test_screenshot_shoot(struct weston_output *output,
|
||||
struct weston_buffer *buffer,
|
||||
weston_test_screenshot_done_func_t done,
|
||||
void *data)
|
||||
{
|
||||
struct test_screenshot_frame_listener *l;
|
||||
|
||||
/* Get the shm buffer resource the client created */
|
||||
if (!wl_shm_buffer_get(buffer->resource)) {
|
||||
done(data, WESTON_TEST_SCREENSHOT_BAD_BUFFER);
|
||||
return false;
|
||||
}
|
||||
|
||||
buffer->shm_buffer = wl_shm_buffer_get(buffer->resource);
|
||||
buffer->width = wl_shm_buffer_get_width(buffer->shm_buffer);
|
||||
buffer->height = wl_shm_buffer_get_height(buffer->shm_buffer);
|
||||
|
||||
/* Verify buffer is big enough */
|
||||
if (buffer->width < output->current_mode->width ||
|
||||
buffer->height < output->current_mode->height) {
|
||||
done(data, WESTON_TEST_SCREENSHOT_BAD_BUFFER);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* allocate the frame listener */
|
||||
l = malloc(sizeof *l);
|
||||
if (l == NULL) {
|
||||
done(data, WESTON_TEST_SCREENSHOT_NO_MEMORY);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Set up the listener */
|
||||
l->buffer = buffer;
|
||||
l->output = output;
|
||||
l->done = done;
|
||||
l->data = data;
|
||||
l->listener.notify = test_screenshot_frame_notify;
|
||||
wl_signal_add(&output->frame_signal, &l->listener);
|
||||
|
||||
/* Fire off a repaint */
|
||||
weston_output_disable_planes_incr(output);
|
||||
weston_output_schedule_repaint(output);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
capture_screenshot_done(void *data, enum weston_test_screenshot_outcome outcome)
|
||||
{
|
||||
struct wl_resource *resource = data;
|
||||
|
||||
switch (outcome) {
|
||||
case WESTON_TEST_SCREENSHOT_SUCCESS:
|
||||
weston_test_send_capture_screenshot_done(resource);
|
||||
break;
|
||||
case WESTON_TEST_SCREENSHOT_NO_MEMORY:
|
||||
wl_resource_post_no_memory(resource);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Grabs a snapshot of the screen.
|
||||
*/
|
||||
static void
|
||||
capture_screenshot(struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
struct wl_resource *output_resource,
|
||||
struct wl_resource *buffer_resource)
|
||||
{
|
||||
struct weston_output *output =
|
||||
weston_head_from_resource(output_resource)->output;
|
||||
struct weston_buffer *buffer =
|
||||
weston_buffer_from_resource(buffer_resource);
|
||||
|
||||
if (buffer == NULL) {
|
||||
wl_resource_post_no_memory(resource);
|
||||
return;
|
||||
}
|
||||
|
||||
weston_test_screenshot_shoot(output, buffer,
|
||||
capture_screenshot_done, resource);
|
||||
}
|
||||
|
||||
static void
|
||||
send_touch(struct wl_client *client, struct wl_resource *resource,
|
||||
uint32_t tv_sec_hi, uint32_t tv_sec_lo, uint32_t tv_nsec,
|
||||
|
@ -608,7 +364,6 @@ static const struct weston_test_interface test_implementation = {
|
|||
send_key,
|
||||
device_release,
|
||||
device_add,
|
||||
capture_screenshot,
|
||||
send_touch,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue