diff --git a/tests/meson.build b/tests/meson.build index cbb16f1c..85b6cf25 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -193,6 +193,7 @@ tests = [ 'dep_objs': [ dep_libdrm_headers ], }, { 'name': 'output-damage', }, + { 'name': 'output-decorations', }, { 'name': 'output-transforms', }, { 'name': 'plugin-registry', }, { diff --git a/tests/output-decorations-test.c b/tests/output-decorations-test.c new file mode 100644 index 00000000..95c9fead --- /dev/null +++ b/tests/output-decorations-test.c @@ -0,0 +1,84 @@ +/* + * Copyright 2022 Collabora, Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "config.h" + +#include "weston-test-client-helper.h" +#include "weston-test-fixture-compositor.h" + +static enum test_result_code +fixture_setup(struct weston_test_harness *harness) +{ + struct compositor_setup setup; + + compositor_setup_defaults(&setup); + setup.renderer = RENDERER_GL; + setup.width = 300; + setup.height = 150; + setup.shell = SHELL_TEST_DESKTOP; + + weston_ini_setup(&setup, + cfgln("[core]"), + cfgln("output-decorations=true")); + + return weston_test_harness_execute_as_client(harness, &setup); +} +DECLARE_FIXTURE_SETUP(fixture_setup); + +/* + * Basic screenshot test for output decorations + * + * Tests that the cairo-util code for drawing window decorations works at all + * through headless-backend. The window decorations are normally used as output + * decorations by wayland-backend when the outputs are windows in a parent + * compositor. + * + * This works only with GL-renderer. Pixman-renderer has no code for blitting + * output decorations and does not even know they exist. + * + * Headless-backend sets window title string to NULL because it might be + * difficult to ensure text rendering is pixel-precise between different + * systems. + */ +TEST(output_decorations) +{ + struct client *client; + struct buffer *shot; + pixman_image_t *img; + bool match; + + client = create_client(); + + shot = client_capture_output(client, client->output, + WESTON_CAPTURE_V1_SOURCE_FULL_FRAMEBUFFER); + img = image_convert_to_a8r8g8b8(shot->image); + + match = verify_image(img, "output-decorations", 0, NULL, 0); + assert(match); + + pixman_image_unref(img); + buffer_destroy(shot); + client_destroy(client); +} diff --git a/tests/reference/output-decorations-00.png b/tests/reference/output-decorations-00.png new file mode 100644 index 00000000..13f9aa82 Binary files /dev/null and b/tests/reference/output-decorations-00.png differ diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c index c4d24f8e..2ce1ffd8 100644 --- a/tests/weston-test-client-helper.c +++ b/tests/weston-test-client-helper.c @@ -1537,7 +1537,7 @@ write_image_as_png(pixman_image_t *image, const char *fname) return true; } -static pixman_image_t * +pixman_image_t * image_convert_to_a8r8g8b8(pixman_image_t *image) { pixman_image_t *ret; @@ -1685,7 +1685,7 @@ static const struct weston_capture_source_v1_listener output_capturer_source_han .failed = output_capturer_handle_failed, }; -static struct buffer * +struct buffer * client_capture_output(struct client *client, struct output *output, enum weston_capture_v1_source src) diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h index 3d6ab28e..efee44a9 100644 --- a/tests/weston-test-client-helper.h +++ b/tests/weston-test-client-helper.h @@ -38,6 +38,7 @@ #include "weston-test-runner.h" #include "weston-test-client-protocol.h" #include "viewporter-client-protocol.h" +#include "weston-output-capture-client-protocol.h" struct client { struct wl_display *wl_display; @@ -275,6 +276,14 @@ load_image_from_png(const char *fname); struct buffer * capture_screenshot_of_output(struct client *client); +struct buffer * +client_capture_output(struct client *client, + struct output *output, + enum weston_capture_v1_source src); + +pixman_image_t * +image_convert_to_a8r8g8b8(pixman_image_t *image); + bool verify_image(pixman_image_t *shot, const char *ref_image,