[PATCH weston v0 05/11] tests: add screenshot recording to weston-test

Bill Spitzak spitzak at gmail.com
Mon Nov 10 10:31:09 PST 2014


It is possible to call libpng directly if you want to avoid the cairo 
dependency.

On 11/09/2014 01:41 PM, Bryce Harrington wrote:
> From: Derek Foreman <derekf at osg.samsung.com>
>
> Adds wl_test_record_screenshot() to weston test.  This commit also
> adds a dependency on cairo to weston-test to use it for writing PNG
> files.
>
> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
>   Makefile.am               |  4 +--
>   protocol/wayland-test.xml |  3 +++
>   tests/weston-test.c       | 68 +++++++++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 73 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index 1e7cc81..26dd473 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -881,7 +881,7 @@ noinst_PROGRAMS +=			\
>   	matrix-test
>
>   test_module_ldflags = \
> -	-module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS)
> +	-module -avoid-version -rpath $(libdir) $(COMPOSITOR_LIBS) $(CAIRO_LIBS)
>
>   surface_global_test_la_SOURCES = tests/surface-global-test.c
>   surface_global_test_la_LDFLAGS = $(test_module_ldflags)
> @@ -893,7 +893,7 @@ surface_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS)
>
>   weston_test_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la
>   weston_test_la_LDFLAGS = $(test_module_ldflags)
> -weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS)
> +weston_test_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) $(CAIRO_CFLAGS)
>   weston_test_la_SOURCES = tests/weston-test.c
>   nodist_weston_test_la_SOURCES =			\
>   	protocol/wayland-test-protocol.c	\
> diff --git a/protocol/wayland-test.xml b/protocol/wayland-test.xml
> index 18b6625..a22a6ac 100644
> --- a/protocol/wayland-test.xml
> +++ b/protocol/wayland-test.xml
> @@ -58,5 +58,8 @@
>       <event name="n_egl_buffers">
>         <arg name="n" type="uint"/>
>       </event>
> +    <request name="record_screenshot">
> +      <arg name="basename" type="string"/>
> +    </request>
>     </interface>
>   </protocol>
> diff --git a/tests/weston-test.c b/tests/weston-test.c
> index f1e45c1..16f20c6 100644
> --- a/tests/weston-test.c
> +++ b/tests/weston-test.c
> @@ -35,6 +35,8 @@
>   #include <EGL/eglext.h>
>   #endif /* ENABLE_EGL */
>
> +#include <cairo.h>
> +
>   struct weston_test {
>   	struct weston_compositor *compositor;
>   	struct weston_layer layer;
> @@ -235,6 +237,71 @@ get_n_buffers(struct wl_client *client, struct wl_resource *resource)
>   	wl_test_send_n_egl_buffers(resource, n_buffers);
>   }
>
> +static void
> +dump_image(const char *filename, int x, int y, uint32_t *image)
> +{
> +	cairo_surface_t *surface, *flipped;
> +	cairo_t *cr;
> +
> +	surface = cairo_image_surface_create_for_data((unsigned char *)image,
> +						      CAIRO_FORMAT_ARGB32,
> +						      x, y, x * 4);
> +	flipped = cairo_surface_create_similar_image(surface, CAIRO_FORMAT_ARGB32, x, y);
> +
> +	cr = cairo_create(flipped);
> +	cairo_translate(cr, 0.0, y);
> +	cairo_scale(cr, 1.0, -1.0);
> +	cairo_set_source_surface(cr, surface, 0, 0);
> +	cairo_paint(cr);
> +	cairo_destroy(cr);
> +	cairo_surface_destroy(surface);
> +
> +	cairo_surface_write_to_png(flipped, filename);
> +	cairo_surface_destroy(flipped);
> +}
> +
> +static void
> +record_screenshot(struct wl_client *client, struct wl_resource *resource,
> +		  const char *basename)
> +{
> +	struct weston_output *o;
> +	struct weston_test *test = wl_resource_get_user_data(resource);
> +	char *filename;
> +	uint32_t *buffer;
> +	int w, h, head = 0;
> +
> +	wl_list_for_each(o, &test->compositor->output_list, link) {
> +		switch (o->transform) {
> +		case WL_OUTPUT_TRANSFORM_90:
> +		case WL_OUTPUT_TRANSFORM_270:
> +		case WL_OUTPUT_TRANSFORM_FLIPPED_90:
> +		case WL_OUTPUT_TRANSFORM_FLIPPED_270:
> +			w = o->height;
> +			h = o->width;
> +			break;
> +		default:
> +			w = o->width;
> +			h = o->height;
> +			break;
> +		}
> +		buffer = malloc(w * h * 4);
> +		if (!buffer)
> +			return;
> +
> +		test->compositor->renderer->read_pixels(o,
> +					      o->compositor->read_format,
> +					      buffer, 0, 0, w, h);
> +
> +		if (asprintf(&filename, "%s-%d.png", basename, head) < 0)
> +			return;
> +
> +		dump_image(filename, w, h, buffer);
> +		free(filename);
> +		free(buffer);
> +		head++;
> +	}
> +}
> +
>   static const struct wl_test_interface test_implementation = {
>   	move_surface,
>   	move_pointer,
> @@ -242,6 +309,7 @@ static const struct wl_test_interface test_implementation = {
>   	activate_surface,
>   	send_key,
>   	get_n_buffers,
> +	record_screenshot
>   };
>
>   static void
>


More information about the wayland-devel mailing list