diff --git a/testsuite/gsk/compare-render.c b/testsuite/gsk/compare-render.c new file mode 100644 index 0000000000..f83e4e0650 --- /dev/null +++ b/testsuite/gsk/compare-render.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include "reftest-compare.h" + +char * +file_replace_extension (const char *old_file, + const char *old_ext, + const char *new_ext) +{ + GString *file = g_string_new (NULL); + + if (g_str_has_suffix (old_file, old_ext)) + g_string_append_len (file, old_file, strlen (old_file) - strlen (old_ext)); + else + g_string_append (file, old_file); + + g_string_append (file, new_ext); + + return g_string_free (file, FALSE); +} + +static char * +get_output_file (const char *file, + const char *orig_ext, + const char *new_ext) +{ + const char *dir; + char *result, *base; + char *name; + + dir = g_get_tmp_dir (); + base = g_path_get_basename (file); + name = file_replace_extension (base, orig_ext, new_ext); + + result = g_strconcat (dir, G_DIR_SEPARATOR_S, name, NULL); + + g_free (base); + g_free (name); + + return result; +} + +static void +save_image (cairo_surface_t *surface, + const char *test_name, + const char *extension) +{ + char *filename = get_output_file (test_name, ".node", extension); + + g_test_message ("Storing test result image at %s", filename); + g_assert (cairo_surface_write_to_png (surface, filename) == CAIRO_STATUS_SUCCESS); + g_free (filename); +} + +/* + * Arguments: + * 1) .node file to compare + * 2) .png file to compare the rendered .node file to + */ +int +main (int argc, char **argv) +{ + cairo_surface_t *reference_surface = NULL; + cairo_surface_t *rendered_surface = NULL; + cairo_surface_t *diff_surface = NULL; + GdkTexture *texture; + GskRenderer *renderer; + GdkWindow *window; + GskRenderNode *node; + const char *node_file; + const char *png_file; + + g_assert (argc == 3); + + gtk_init (); + + node_file = argv[1]; + png_file = argv[2]; + + window = gdk_window_new_toplevel (gdk_display_get_default(), 10 , 10); + renderer = gsk_renderer_new_for_window (window); + + g_test_message ("Node file: '%s'\n", node_file); + g_test_message ("PNG file: '%s'\n", png_file); + + /* Load the render node from the given .node file */ + { + GBytes *bytes; + GError *error = NULL; + gsize len; + char *contents; + + if (!g_file_get_contents (node_file, &contents, &len, &error)) + { + g_test_message ("Could not open node file: %s\n", error->message); + g_clear_error (&error); + g_test_fail (); + return -1; + } + + bytes = g_bytes_new_take (contents, len); + node = gsk_render_node_deserialize (bytes, &error); + g_bytes_unref (bytes); + + g_assert (node != NULL); + } + + /* Render the .node file and download to cairo surface */ + texture = gsk_renderer_render_texture (renderer, node, NULL); + g_assert (texture != NULL); + + rendered_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + gdk_texture_get_width (texture), + gdk_texture_get_height (texture)); + gdk_texture_download (texture, + cairo_image_surface_get_data (rendered_surface), + cairo_image_surface_get_stride (rendered_surface)); + cairo_surface_mark_dirty (rendered_surface); + + /* Load the given reference png file */ + reference_surface = cairo_image_surface_create_from_png (png_file); + g_assert (reference_surface != NULL); + + /* Now compare the two */ + diff_surface = reftest_compare_surfaces (rendered_surface, reference_surface); + + save_image (rendered_surface, node_file, ".out.png"); + + if (diff_surface) + save_image (diff_surface, node_file, ".diff.png"); + + g_assert (diff_surface == NULL); + + return 0; +} diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 65c065f061..a2f6318082 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -10,6 +10,14 @@ test_render_nodes = executable( install_dir: testexecdir ) +compare_render = executable( + 'compare-render', + ['compare-render.c', 'reftest-compare.c'], + dependencies: libgtk_dep, + install: get_option('install-tests'), + install_dir: testexecdir +) + test('nodes (cairo)', test_render_nodes, args: [ '--tap', '-k' ], env: [ 'GIO_USE_VOLUME_MONITOR=unix', @@ -22,6 +30,35 @@ test('nodes (cairo)', test_render_nodes, ], suite: 'gsk') +# Interesting render nodes proven to be rendered 'correctly' by the GL renderer. +gl_tests = [ + ['outset shadow simple', 'outset_shadow_simple.node', 'outset_shadow_simple.gl.png'], + ['outset shadow offset x', 'outset_shadow_offsetx.node', 'outset_shadow_offsetx.gl.png'], + ['outset shadow offset y', 'outset_shadow_offsety.node', 'outset_shadow_offsety.gl.png'], + ['outset shadow offset both', 'outset_shadow_offset_both.node', 'outset_shadow_offset_both.gl.png'], + ['outset shadow rounded1', 'outset_shadow_rounded1.node', 'outset_shadow_rounded1.gl.png'], + ['outset shadow rounded2', 'outset_shadow_rounded2.node', 'outset_shadow_rounded2.gl.png'], + ['outset shadow rounded top', 'outset_shadow_rounded_top.node', 'outset_shadow_rounded_top.gl.png'], + ['outset shadow blurred simple', 'outset_shadow_blurred_simple.node', 'outset_shadow_blurred_simple.gl.png'], + ['outset shadow blurred small', 'outset_shadow_blurred_small.node', 'outset_shadow_blurred_small.gl.png'], + ['outset shadow blurred offset', 'outset_shadow_blurred_offset.node', 'outset_shadow_blurred_offset.gl.png'], +] + +foreach gl_test : gl_tests + test(gl_test[0], compare_render, + args: [join_paths(meson.current_source_dir(), gl_test[1]), + join_paths(meson.current_source_dir(), gl_test[2])], + env: [ 'GIO_USE_VOLUME_MONITOR=unix', + 'GSETTINGS_BACKEND=memory', + 'GTK_CSD=1', + 'G_ENABLE_DIAGNOSTIC=0', + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + 'GSK_RENDERER=opengl' + ], + suite: 'gsk') +endforeach + if have_vulkan test('nodes (vulkan)', test_render_nodes, args: [ '--tap', '-k' ], diff --git a/testsuite/gsk/outset_shadow_blurred_offset.gl.png b/testsuite/gsk/outset_shadow_blurred_offset.gl.png new file mode 100644 index 0000000000..f4d0f4b67d Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_offset.gl.png differ diff --git a/testsuite/gsk/outset_shadow_blurred_offset.node b/testsuite/gsk/outset_shadow_blurred_offset.node new file mode 100644 index 0000000000..7d982d688e Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_offset.node differ diff --git a/testsuite/gsk/outset_shadow_blurred_simple.gl.png b/testsuite/gsk/outset_shadow_blurred_simple.gl.png new file mode 100644 index 0000000000..bcd96d894b Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_simple.gl.png differ diff --git a/testsuite/gsk/outset_shadow_blurred_simple.node b/testsuite/gsk/outset_shadow_blurred_simple.node new file mode 100644 index 0000000000..66b38b9e5a Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_simple.node differ diff --git a/testsuite/gsk/outset_shadow_blurred_simple2.gl.png b/testsuite/gsk/outset_shadow_blurred_simple2.gl.png new file mode 100644 index 0000000000..96a2ba75c0 Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_simple2.gl.png differ diff --git a/testsuite/gsk/outset_shadow_blurred_simple2.node b/testsuite/gsk/outset_shadow_blurred_simple2.node new file mode 100644 index 0000000000..59f250c002 Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_simple2.node differ diff --git a/testsuite/gsk/outset_shadow_blurred_small.gl.png b/testsuite/gsk/outset_shadow_blurred_small.gl.png new file mode 100644 index 0000000000..880db76f3b Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_small.gl.png differ diff --git a/testsuite/gsk/outset_shadow_blurred_small.node b/testsuite/gsk/outset_shadow_blurred_small.node new file mode 100644 index 0000000000..291389a5e8 Binary files /dev/null and b/testsuite/gsk/outset_shadow_blurred_small.node differ diff --git a/testsuite/gsk/outset_shadow_offset_both.gl.png b/testsuite/gsk/outset_shadow_offset_both.gl.png new file mode 100644 index 0000000000..0b69710dc5 Binary files /dev/null and b/testsuite/gsk/outset_shadow_offset_both.gl.png differ diff --git a/testsuite/gsk/outset_shadow_offset_both.node b/testsuite/gsk/outset_shadow_offset_both.node new file mode 100644 index 0000000000..014d8ce9f8 Binary files /dev/null and b/testsuite/gsk/outset_shadow_offset_both.node differ diff --git a/testsuite/gsk/outset_shadow_offsetx.gl.png b/testsuite/gsk/outset_shadow_offsetx.gl.png new file mode 100644 index 0000000000..7ae6367915 Binary files /dev/null and b/testsuite/gsk/outset_shadow_offsetx.gl.png differ diff --git a/testsuite/gsk/outset_shadow_offsetx.node b/testsuite/gsk/outset_shadow_offsetx.node new file mode 100644 index 0000000000..f88bee53eb Binary files /dev/null and b/testsuite/gsk/outset_shadow_offsetx.node differ diff --git a/testsuite/gsk/outset_shadow_offsety.gl.png b/testsuite/gsk/outset_shadow_offsety.gl.png new file mode 100644 index 0000000000..c54898fe61 Binary files /dev/null and b/testsuite/gsk/outset_shadow_offsety.gl.png differ diff --git a/testsuite/gsk/outset_shadow_offsety.node b/testsuite/gsk/outset_shadow_offsety.node new file mode 100644 index 0000000000..3b0af62689 Binary files /dev/null and b/testsuite/gsk/outset_shadow_offsety.node differ diff --git a/testsuite/gsk/outset_shadow_rounded1.gl.png b/testsuite/gsk/outset_shadow_rounded1.gl.png new file mode 100644 index 0000000000..8c0494958c Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded1.gl.png differ diff --git a/testsuite/gsk/outset_shadow_rounded1.node b/testsuite/gsk/outset_shadow_rounded1.node new file mode 100644 index 0000000000..956f79bae4 Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded1.node differ diff --git a/testsuite/gsk/outset_shadow_rounded2.gl.png b/testsuite/gsk/outset_shadow_rounded2.gl.png new file mode 100644 index 0000000000..8c0494958c Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded2.gl.png differ diff --git a/testsuite/gsk/outset_shadow_rounded2.node b/testsuite/gsk/outset_shadow_rounded2.node new file mode 100644 index 0000000000..8b8be016c6 Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded2.node differ diff --git a/testsuite/gsk/outset_shadow_rounded_top.gl.png b/testsuite/gsk/outset_shadow_rounded_top.gl.png new file mode 100644 index 0000000000..d448d8459d Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded_top.gl.png differ diff --git a/testsuite/gsk/outset_shadow_rounded_top.node b/testsuite/gsk/outset_shadow_rounded_top.node new file mode 100644 index 0000000000..ea9dee50e8 Binary files /dev/null and b/testsuite/gsk/outset_shadow_rounded_top.node differ diff --git a/testsuite/gsk/outset_shadow_simple.gl.png b/testsuite/gsk/outset_shadow_simple.gl.png new file mode 100644 index 0000000000..87c691cdb8 Binary files /dev/null and b/testsuite/gsk/outset_shadow_simple.gl.png differ diff --git a/testsuite/gsk/outset_shadow_simple.node b/testsuite/gsk/outset_shadow_simple.node new file mode 100644 index 0000000000..65adef7642 Binary files /dev/null and b/testsuite/gsk/outset_shadow_simple.node differ