[PATCH v1 weston 06/11] tests: Add screenshot recording to weston-test

Bryce Harrington bryce at osg.samsung.com
Wed Nov 19 15:06:21 PST 2014


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.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=83981
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
-- 
1.9.1



More information about the wayland-devel mailing list