#include "../reftests/reftest-compare.h"
static char *arg_output_dir = NULL;
+static gboolean flip = FALSE;
+static gboolean rotate = FALSE;
+static gboolean repeat = FALSE;
static const char *
get_output_dir (void)
}
static const GOptionEntry options[] = {
- { "output", 0, 0, G_OPTION_ARG_FILENAME, &arg_output_dir,
- "Directory to save image files to", "DIR" },
+ { "output", 0, 0, G_OPTION_ARG_FILENAME, &arg_output_dir, "Directory to save image files to", "DIR" },
+ { "flip", 0, 0, G_OPTION_ARG_NONE, &flip, "Do flipped test", NULL },
+ { "rotate", 0, 0, G_OPTION_ARG_NONE, &rotate, "Do rotated test", NULL },
+ { "repeat", 0, 0, G_OPTION_ARG_NONE, &repeat, "Do repeat test", NULL },
{ NULL }
};
+static GskRenderNode *
+load_node_file (const char *node_file)
+{
+ GBytes *bytes;
+ gsize len;
+ char *contents;
+ GError *error = NULL;
+ GskRenderNode *node;
+
+ if (!g_file_get_contents (node_file, &contents, &len, &error))
+ {
+ g_print ("Could not open node file: %s\n", error->message);
+ g_clear_error (&error);
+ return NULL;
+ }
+
+ bytes = g_bytes_new_take (contents, len);
+ node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL);
+ g_bytes_unref (bytes);
+
+ g_assert_no_error (error);
+ g_assert_nonnull (node);
+
+ return node;
+}
+
/*
* Non-option arguments:
* 1) .node file to compare
gboolean success = TRUE;
GError *error = NULL;
GOptionContext *context;
+ GdkTexture *diff_texture;
(g_test_init) (&argc, &argv, NULL);
node_file = argv[1];
png_file = argv[2];
- window = gdk_surface_new_toplevel (gdk_display_get_default());
- renderer = gsk_renderer_new_for_surface (window);
-
g_print ("Node file: '%s'\n", node_file);
g_print ("PNG file: '%s'\n", png_file);
+ window = gdk_surface_new_toplevel (gdk_display_get_default());
+ renderer = gsk_renderer_new_for_surface (window);
+
/* Load the render node from the given .node file */
- {
- GBytes *bytes;
- gsize len;
- char *contents;
-
- if (!g_file_get_contents (node_file, &contents, &len, &error))
- {
- g_print ("Could not open node file: %s\n", error->message);
- g_clear_error (&error);
- return 1;
- }
-
- bytes = g_bytes_new_take (contents, len);
- node = gsk_render_node_deserialize (bytes, deserialize_error_func, &success);
- g_bytes_unref (bytes);
-
- g_assert_no_error (error);
- g_assert_nonnull (node);
- }
+ node = load_node_file (node_file);
+ if (!node)
+ return 1;
/* Render the .node file and download to cairo surface */
rendered_texture = gsk_renderer_render_texture (renderer, node, NULL);
g_assert_nonnull (rendered_texture);
+ save_image (rendered_texture, node_file, ".out.png");
+
/* Load the given reference png file */
reference_texture = gdk_texture_new_from_filename (png_file, &error);
if (reference_texture == NULL)
{
g_print ("Error loading reference surface: %s\n", error->message);
g_clear_error (&error);
+ save_image (rendered_texture, node_file, ".out.png");
+ return 0;
+ }
+
+ /* Now compare the two */
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ if (diff_texture)
+ {
+ save_image (diff_texture, node_file, ".diff.png");
+ g_object_unref (diff_texture);
success = FALSE;
}
- else
+
+ g_clear_object (&reference_texture);
+ g_clear_object (&rendered_texture);
+
+ if (flip)
+ {
+ GskRenderNode *node2;
+ GdkPixbuf *pixbuf, *pixbuf2;
+
+ node2 = gsk_transform_node_new (node, gsk_transform_scale (NULL, -1, 1));
+ rendered_texture = gsk_renderer_render_texture (renderer, node2, NULL);
+
+ save_image (rendered_texture, node_file, "-flipped.out.png");
+
+ pixbuf = gdk_pixbuf_new_from_file (png_file, &error);
+ pixbuf2 = gdk_pixbuf_flip (pixbuf, TRUE);
+ reference_texture = gdk_texture_new_for_pixbuf (pixbuf2);
+ g_object_unref (pixbuf2);
+ g_object_unref (pixbuf);
+
+ save_image (reference_texture, node_file, "-flipped.ref.png");
+
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+
+ if (diff_texture)
+ {
+ save_image (diff_texture, node_file, "-flipped.diff.png");
+ g_object_unref (diff_texture);
+ success = FALSE;
+ }
+
+ g_clear_object (&rendered_texture);
+ g_clear_object (&reference_texture);
+ gsk_render_node_unref (node2);
+ }
+
+ if (repeat)
{
- GdkTexture *diff_texture;
+ GskRenderNode *node2;
+ GdkPixbuf *pixbuf, *pixbuf2;
+ int width, height;
+ graphene_rect_t node_bounds;
+ graphene_rect_t bounds;
+
+ gsk_render_node_get_bounds (node, &node_bounds);
+ bounds.origin.x = 0.;
+ bounds.origin.y = 0.;
+ bounds.size.width = 2 * node_bounds.size.width;
+ bounds.size.height = 2 * node_bounds.size.height;
+
+ node2 = gsk_repeat_node_new (&bounds, node, &node_bounds);
+ rendered_texture = gsk_renderer_render_texture (renderer, node2, NULL);
+
+ save_image (rendered_texture, node_file, "-repeated.out.png");
+
+ pixbuf = gdk_pixbuf_new_from_file (png_file, &error);
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ pixbuf2 = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (pixbuf),
+ gdk_pixbuf_get_has_alpha (pixbuf),
+ gdk_pixbuf_get_bits_per_sample (pixbuf),
+ width * 2,
+ height * 2);
+ gdk_pixbuf_copy_area (pixbuf, 0, 0, width, height, pixbuf2, 0, 0);
+ gdk_pixbuf_copy_area (pixbuf, 0, 0, width, height, pixbuf2, width, 0);
+ gdk_pixbuf_copy_area (pixbuf, 0, 0, width, height, pixbuf2, 0, height);
+ gdk_pixbuf_copy_area (pixbuf, 0, 0, width, height, pixbuf2, width, height);
+
+ reference_texture = gdk_texture_new_for_pixbuf (pixbuf2);
+ g_object_unref (pixbuf2);
+ g_object_unref (pixbuf);
+
+ save_image (reference_texture, node_file, "-repeated.ref.png");
- /* Now compare the two */
diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
if (diff_texture)
{
- save_image (diff_texture, node_file, ".diff.png");
+ save_image (diff_texture, node_file, "-repeated.diff.png");
g_object_unref (diff_texture);
success = FALSE;
}
+
+ g_clear_object (&rendered_texture);
+ g_clear_object (&reference_texture);
+ gsk_render_node_unref (node2);
}
- save_image (rendered_texture, node_file, ".out.png");
+ if (rotate)
+ {
+ GskRenderNode *node2;
+ GdkPixbuf *pixbuf, *pixbuf2;
+
+ node2 = gsk_transform_node_new (node, gsk_transform_rotate (NULL, 90));
+ rendered_texture = gsk_renderer_render_texture (renderer, node2, NULL);
+
+ save_image (rendered_texture, node_file, "-rotated.out.png");
+
+ pixbuf = gdk_pixbuf_new_from_file (png_file, &error);
+ pixbuf2 = gdk_pixbuf_rotate_simple (pixbuf, GDK_PIXBUF_ROTATE_CLOCKWISE);
+ reference_texture = gdk_texture_new_for_pixbuf (pixbuf2);
+ g_object_unref (pixbuf2);
+ g_object_unref (pixbuf);
+
+ save_image (reference_texture, node_file, "-rotated.ref.png");
+
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
- g_object_unref (reference_texture);
- g_object_unref (rendered_texture);
+ if (diff_texture)
+ {
+ save_image (diff_texture, node_file, "-rotated.diff.png");
+ g_object_unref (diff_texture);
+ success = FALSE;
+ }
+
+ g_clear_object (&rendered_texture);
+ g_clear_object (&reference_texture);
+ gsk_render_node_unref (node2);
+ }
gsk_render_node_unref (node);