On Fri, Sep 25, 2015 at 01:02:33PM -0500, Derek Foreman wrote: > On 24/09/15 04:43 PM, Bryce Harrington wrote: > > These routines provide test cases an ability to capture screen images > > for rendering verification. > > > > This commit is a no-change refactoring, except for making the routines > > non-static. Makefile rules are also updated; most notably, this links > > test clients against the cairo libraries now. > > > > Signed-off-by: Bryce Harrington <br...@osg.samsung.com> > > And Reviewed-by: Derek Foreman <der...@osg.samsung.com> > > However, see below for gratuitous formatting changes, as letting you > land something without at least a v2 doesn't seem right. ;)
Thanks for the review, I've fixed the pointer formatting style as suggested. Pushed: To ssh://git.freedesktop.org/git/wayland/weston 89dcea9..892122e master -> master Bryce > > --- > > Makefile.am | 8 +- > > tests/internal-screenshot-test.c | 160 > > -------------------------------------- > > tests/weston-test-client-helper.c | 158 > > +++++++++++++++++++++++++++++++++++++ > > tests/weston-test-client-helper.h | 12 +++ > > 4 files changed, 174 insertions(+), 164 deletions(-) > > > > diff --git a/Makefile.am b/Makefile.am > > index 1d66cc0..b82b8ee 100644 > > --- a/Makefile.am > > +++ b/Makefile.am > > @@ -1153,8 +1153,8 @@ libtest_client_la_SOURCES = \ > > nodist_libtest_client_la_SOURCES = \ > > protocol/weston-test-protocol.c \ > > protocol/weston-test-client-protocol.h > > -libtest_client_la_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) > > -libtest_client_la_LIBADD = $(TEST_CLIENT_LIBS) libshared.la > > libtest-runner.la > > +libtest_client_la_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) > > $(CAIRO_CFLAGS) > > +libtest_client_la_LIBADD = $(TEST_CLIENT_LIBS) $(CAIRO_LIBS) libshared.la > > libtest-runner.la > > > > > > # > > @@ -1162,8 +1162,8 @@ libtest_client_la_LIBADD = $(TEST_CLIENT_LIBS) > > libshared.la libtest-runner.la > > # > > > > internal_screenshot_weston_SOURCES = tests/internal-screenshot-test.c > > -internal_screenshot_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) > > $(CAIRO_CFLAGS) > > -internal_screenshot_weston_LDADD = libtest-client.la $(CAIRO_LIBS) > > +internal_screenshot_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) > > +internal_screenshot_weston_LDADD = libtest-client.la > > > > > > # > > diff --git a/tests/internal-screenshot-test.c > > b/tests/internal-screenshot-test.c > > index 6b26e1a..563aa3d 100644 > > --- a/tests/internal-screenshot-test.c > > +++ b/tests/internal-screenshot-test.c > > @@ -25,172 +25,12 @@ > > > > #include "config.h" > > > > -#include <unistd.h> > > #include <stdio.h> > > -#include <string.h> /* memcpy */ > > -#include <cairo.h> > > > > -#include "zalloc.h" > > #include "weston-test-client-helper.h" > > > > char *server_parameters="--use-pixman --width=320 --height=240"; > > > > -/** write_surface_as_png() > > - * > > - * Writes out a given weston test surface to disk as a PNG image > > - * using the provided filename (with path). > > - * > > - * @returns true if successfully saved file; false otherwise. > > - */ > > -static bool > > -write_surface_as_png(const struct surface* weston_surface, const char > > *fname) > > -{ > > - cairo_surface_t *cairo_surface; > > - cairo_status_t status; > > - int bpp = 4; /* Assume ARGB */ > > - int stride = bpp * weston_surface->width; > > - > > - cairo_surface = > > cairo_image_surface_create_for_data(weston_surface->data, > > - CAIRO_FORMAT_ARGB32, > > - > > weston_surface->width, > > - > > weston_surface->height, > > - stride); > > - printf("Writing PNG to disk\n"); > > - status = cairo_surface_write_to_png(cairo_surface, fname); > > - if (status != CAIRO_STATUS_SUCCESS) { > > - printf("Failed to save screenshot: %s\n", > > - cairo_status_to_string(status)); > > - return false; > > - } > > - cairo_surface_destroy(cairo_surface); > > - return true; > > -} > > - > > -/** load_surface_from_png() > > - * > > - * Reads a PNG image from disk using the given filename (and path) > > - * and returns as a freshly allocated weston test surface. > > - * > > - * @returns weston test surface with image, which should be free'd > > - * when no longer used; or, NULL in case of error. > > - */ > > -static struct surface* > > -load_surface_from_png(const char *fname) > > -{ > > - struct surface *reference; > > - cairo_surface_t *reference_cairo_surface; > > - cairo_status_t status; > > - size_t source_data_size; > > - int bpp; > > - int stride; > > - > > - reference_cairo_surface = cairo_image_surface_create_from_png(fname); > > - status = cairo_surface_status(reference_cairo_surface); > > - if (status != CAIRO_STATUS_SUCCESS) { > > - printf("Could not open %s: %s\n", fname, > > cairo_status_to_string(status)); > > - cairo_surface_destroy(reference_cairo_surface); > > - return NULL; > > - } > > - > > - /* Disguise the cairo surface in a weston test surface */ > > - reference = zalloc(sizeof *reference); > > - if (reference == NULL) { > > - perror("zalloc reference"); > > - cairo_surface_destroy(reference_cairo_surface); > > - return NULL; > > - } > > - reference->width = > > cairo_image_surface_get_width(reference_cairo_surface); > > - reference->height = > > cairo_image_surface_get_height(reference_cairo_surface); > > - stride = cairo_image_surface_get_stride(reference_cairo_surface); > > - source_data_size = stride * reference->height; > > - > > - /* Check that the file's stride matches our assumption */ > > - bpp = 4; > > - if (stride != bpp * reference->width) { > > - printf("Mismatched stride for screenshot reference image %s\n", > > fname); > > - cairo_surface_destroy(reference_cairo_surface); > > - free(reference); > > - return NULL; > > - } > > - > > - /* Allocate new buffer for our weston reference, and copy the data from > > - the cairo surface so we can destroy it */ > > - reference->data = zalloc(source_data_size); > > - if (reference->data == NULL) { > > - perror("zalloc reference data"); > > - cairo_surface_destroy(reference_cairo_surface); > > - free(reference); > > - return NULL; > > - } > > - memcpy(reference->data, > > - cairo_image_surface_get_data(reference_cairo_surface), > > - source_data_size); > > - > > - cairo_surface_destroy(reference_cairo_surface); > > - return reference; > > -} > > - > > -/** create_screenshot_surface() > > - * > > - * Allocates and initializes a weston test surface for use in > > - * storing a screenshot of the client's output. Establishes a > > - * shm backed wl_buffer for retrieving screenshot image data > > - * from the server, sized to match the client's output display. > > - * > > - * @returns stack allocated surface image, which should be > > - * free'd when done using it. > > - */ > > -static struct surface* > > -create_screenshot_surface(struct client *client) > > -{ > > - struct surface* screenshot; > > - screenshot = zalloc(sizeof *screenshot); > > - if (screenshot == NULL) > > - return NULL; > > - screenshot->wl_buffer = create_shm_buffer(client, > > - client->output->width, > > - client->output->height, > > - &screenshot->data); > > - screenshot->height = client->output->height; > > - screenshot->width = client->output->width; > > - > > - return screenshot; > > -} > > - > > -/** capture_screenshot_of_output() > > - * > > - * Requests a screenshot from the server of the output that the > > - * client appears on. The image data returned from the server > > - * can be accessed from the screenshot surface's data member. > > - * > > - * @returns a new surface object, which should be free'd when no > > - * longer needed. > > - */ > > -static struct surface * > > -capture_screenshot_of_output(struct client *client) > > -{ > > - struct surface *screenshot; > > - > > - /* Create a surface to hold the screenshot */ > > - screenshot = create_screenshot_surface(client); > > - > > - client->test->buffer_copy_done = 0; > > - weston_test_capture_screenshot(client->test->weston_test, > > - client->output->wl_output, > > - screenshot->wl_buffer); > > - while (client->test->buffer_copy_done == 0) > > - if (wl_display_dispatch(client->wl_display) < 0) > > - break; > > - > > - /* FIXME: Document somewhere the orientation the screenshot is taken > > - * and how the clip coords are interpreted, in case of > > scaling/transform. > > - * If we're using read_pixels() just make sure it is documented > > somewhere. > > - * Protocol docs in the XML, comparison function docs in Doxygen style. > > - */ > > - > > - return screenshot; > > -} > > - > > static void > > draw_stuff(void *pixels, int w, int h) > > { > > diff --git a/tests/weston-test-client-helper.c > > b/tests/weston-test-client-helper.c > > index 65a8880..58d6327 100644 > > --- a/tests/weston-test-client-helper.c > > +++ b/tests/weston-test-client-helper.c > > @@ -31,7 +31,9 @@ > > #include <unistd.h> > > #include <errno.h> > > #include <sys/mman.h> > > +#include <cairo.h> > > > > +#include "zalloc.h" > > #include "shared/os-compatibility.h" > > #include "weston-test-client-helper.h" > > > > @@ -979,3 +981,159 @@ check_surfaces_match_in_clip(const struct surface *a, > > const struct surface *b, c > > > > return true; > > } > > + > > +/** write_surface_as_png() > > + * > > + * Writes out a given weston test surface to disk as a PNG image > > + * using the provided filename (with path). > > + * > > + * @returns true if successfully saved file; false otherwise. > > + */ > > +bool > > +write_surface_as_png(const struct surface* weston_surface, const char > > *fname) > > Wrong formatting for surface* weston_surface... > > > +{ > > + cairo_surface_t *cairo_surface; > > + cairo_status_t status; > > + int bpp = 4; /* Assume ARGB */ > > + int stride = bpp * weston_surface->width; > > + > > + cairo_surface = > > cairo_image_surface_create_for_data(weston_surface->data, > > + CAIRO_FORMAT_ARGB32, > > + > > weston_surface->width, > > + > > weston_surface->height, > > + stride); > > + printf("Writing PNG to disk\n"); > > + status = cairo_surface_write_to_png(cairo_surface, fname); > > + if (status != CAIRO_STATUS_SUCCESS) { > > + printf("Failed to save screenshot: %s\n", > > + cairo_status_to_string(status)); > > + return false; > > + } > > + cairo_surface_destroy(cairo_surface); > > + return true; > > +} > > + > > +/** load_surface_from_png() > > + * > > + * Reads a PNG image from disk using the given filename (and path) > > + * and returns as a freshly allocated weston test surface. > > + * > > + * @returns weston test surface with image, which should be free'd > > + * when no longer used; or, NULL in case of error. > > + */ > > +struct surface* > > needs a space before the * > > > +load_surface_from_png(const char *fname) > > +{ > > + struct surface *reference; > > + cairo_surface_t *reference_cairo_surface; > > + cairo_status_t status; > > + size_t source_data_size; > > + int bpp; > > + int stride; > > + > > + reference_cairo_surface = cairo_image_surface_create_from_png(fname); > > + status = cairo_surface_status(reference_cairo_surface); > > + if (status != CAIRO_STATUS_SUCCESS) { > > + printf("Could not open %s: %s\n", fname, > > cairo_status_to_string(status)); > > + cairo_surface_destroy(reference_cairo_surface); > > + return NULL; > > + } > > + > > + /* Disguise the cairo surface in a weston test surface */ > > + reference = zalloc(sizeof *reference); > > + if (reference == NULL) { > > + perror("zalloc reference"); > > + cairo_surface_destroy(reference_cairo_surface); > > + return NULL; > > + } > > + reference->width = > > cairo_image_surface_get_width(reference_cairo_surface); > > + reference->height = > > cairo_image_surface_get_height(reference_cairo_surface); > > + stride = cairo_image_surface_get_stride(reference_cairo_surface); > > + source_data_size = stride * reference->height; > > + > > + /* Check that the file's stride matches our assumption */ > > + bpp = 4; > > + if (stride != bpp * reference->width) { > > + printf("Mismatched stride for screenshot reference image %s\n", > > fname); > > + cairo_surface_destroy(reference_cairo_surface); > > + free(reference); > > + return NULL; > > + } > > + > > + /* Allocate new buffer for our weston reference, and copy the data from > > + the cairo surface so we can destroy it */ > > + reference->data = zalloc(source_data_size); > > + if (reference->data == NULL) { > > + perror("zalloc reference data"); > > + cairo_surface_destroy(reference_cairo_surface); > > + free(reference); > > + return NULL; > > + } > > + memcpy(reference->data, > > + cairo_image_surface_get_data(reference_cairo_surface), > > + source_data_size); > > + > > + cairo_surface_destroy(reference_cairo_surface); > > + return reference; > > +} > > + > > +/** create_screenshot_surface() > > + * > > + * Allocates and initializes a weston test surface for use in > > + * storing a screenshot of the client's output. Establishes a > > + * shm backed wl_buffer for retrieving screenshot image data > > + * from the server, sized to match the client's output display. > > + * > > + * @returns stack allocated surface image, which should be > > + * free'd when done using it. > > + */ > > +struct surface* > > same... > > > +create_screenshot_surface(struct client *client) > > +{ > > + struct surface* screenshot; > > + screenshot = zalloc(sizeof *screenshot); > > + if (screenshot == NULL) > > + return NULL; > > + screenshot->wl_buffer = create_shm_buffer(client, > > + client->output->width, > > + client->output->height, > > + &screenshot->data); > > + screenshot->height = client->output->height; > > + screenshot->width = client->output->width; > > + > > + return screenshot; > > +} > > + > > +/** capture_screenshot_of_output() > > + * > > + * Requests a screenshot from the server of the output that the > > + * client appears on. The image data returned from the server > > + * can be accessed from the screenshot surface's data member. > > + * > > + * @returns a new surface object, which should be free'd when no > > + * longer needed. > > + */ > > +struct surface * > > +capture_screenshot_of_output(struct client *client) > > +{ > > + struct surface *screenshot; > > + > > + /* Create a surface to hold the screenshot */ > > + screenshot = create_screenshot_surface(client); > > + > > + client->test->buffer_copy_done = 0; > > + weston_test_capture_screenshot(client->test->weston_test, > > + client->output->wl_output, > > + screenshot->wl_buffer); > > + while (client->test->buffer_copy_done == 0) > > + if (wl_display_dispatch(client->wl_display) < 0) > > + break; > > + > > + /* FIXME: Document somewhere the orientation the screenshot is taken > > + * and how the clip coords are interpreted, in case of > > scaling/transform. > > + * If we're using read_pixels() just make sure it is documented > > somewhere. > > + * Protocol docs in the XML, comparison function docs in Doxygen style. > > + */ > > + > > + return screenshot; > > +} > > diff --git a/tests/weston-test-client-helper.h > > b/tests/weston-test-client-helper.h > > index 7c2727a..c264bfd 100644 > > --- a/tests/weston-test-client-helper.h > > +++ b/tests/weston-test-client-helper.h > > @@ -212,4 +212,16 @@ check_surfaces_equal(const struct surface *a, const > > struct surface *b); > > bool > > check_surfaces_match_in_clip(const struct surface *a, const struct surface > > *b, const struct rectangle *clip); > > > > +bool > > +write_surface_as_png(const struct surface* weston_surface, const char > > *fname); > > same > > > + > > +struct surface* > > same > > > +load_surface_from_png(const char *fname); > > + > > +struct surface* > > same > > > +create_screenshot_surface(struct client *client); > > + > > +struct surface * > > +capture_screenshot_of_output(struct client *client); > > + > > #endif > > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel