GError *error = NULL;
GOptionContext *context;
GdkTexture *diff_texture;
+ guint max_diff = 0;
+ guint pixels_changed = 0;
+ guint pixels = 0;
(g_test_init) (&argc, &argv, NULL);
}
/* Now compare the two */
- diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture,
+ &max_diff, &pixels_changed, &pixels);
if (diff_texture)
{
+ g_print ("%u (out of %u) pixels differ from reference by up to %u levels\n",
+ pixels_changed, pixels, max_diff);
save_image (diff_texture, node_file, ".diff.png");
g_object_unref (diff_texture);
success = FALSE;
save_image (reference_texture, node_file, "-flipped.ref.png");
- diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture,
+ &max_diff, &pixels_changed, &pixels);
if (diff_texture)
{
+ g_print ("%u (out of %u) pixels differ from reference by up to %u levels\n",
+ pixels_changed, pixels, max_diff);
save_image (diff_texture, node_file, "-flipped.diff.png");
g_object_unref (diff_texture);
success = FALSE;
save_image (reference_texture, node_file, "-repeated.ref.png");
- diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture,
+ &max_diff, &pixels_changed, &pixels);
if (diff_texture)
{
+ g_print ("%u (out of %u) pixels differ from reference by up to %u levels\n",
+ pixels_changed, pixels, max_diff);
save_image (diff_texture, node_file, "-repeated.diff.png");
g_object_unref (diff_texture);
success = FALSE;
save_image (reference_texture, node_file, "-rotated.ref.png");
- diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture,
+ &max_diff, &pixels_changed, &pixels);
if (diff_texture)
{
+ g_print ("%u (out of %u) pixels differ from reference by up to %u levels\n",
+ pixels_changed, pixels, max_diff);
save_image (diff_texture, node_file, "-rotated.diff.png");
g_object_unref (diff_texture);
success = FALSE;
save_image (reference_texture, node_file, "-masked.ref.png");
- diff_texture = reftest_compare_textures (rendered_texture, reference_texture);
+ diff_texture = reftest_compare_textures (rendered_texture, reference_texture,
+ &max_diff, &pixels_changed, &pixels);
if (diff_texture)
{
+ g_print ("%u (out of %u) pixels differ from reference by up to %u levels\n",
+ pixels_changed, pixels, max_diff);
save_image (diff_texture, node_file, "-masked.diff.png");
g_object_unref (diff_texture);
success = FALSE;
char *ui_file, *reference_file;
GdkTexture *ui_image, *reference_image, *diff_image;
GtkStyleProvider *provider;
+ guint max_diff = 0;
+ guint pixels_changed = 0;
+ guint pixels = 0;
ui_file = g_file_get_path (file);
if (reference_image == NULL)
reference_image = gdk_memory_texture_new (1, 1, GDK_MEMORY_DEFAULT, g_bytes_new ((guchar[4]) {0, 0, 0, 0}, 4), 4);
- diff_image = reftest_compare_textures (ui_image, reference_image);
+ diff_image = reftest_compare_textures (ui_image, reference_image,
+ &max_diff, &pixels_changed, &pixels);
save_image (ui_image, ui_file, ".out.png");
save_image (reference_image, ui_file, ".ref.png");
+
if (diff_image)
{
+ g_test_message ("%u (out of %u) pixels differ from reference by up to %u levels",
+ pixels_changed, pixels, max_diff);
save_node (g_object_get_data (G_OBJECT (ui_image), "source-render-node"), ui_file, ".out.node");
save_node (g_object_get_data (G_OBJECT (reference_image), "source-render-node"), ui_file, ".ref.node");
save_image (diff_image, ui_file, ".diff.png");
const guchar *buf_b,
int stride_b,
int width,
- int height)
+ int height,
+ guint *max_diff_out,
+ guint *pixels_changed_out)
{
int x, y;
guchar *buf_diff = NULL;
int stride_diff = 0;
GdkTexture *diff = NULL;
+ guint max_diff = 0;
+ guint pixels_changed = 0;
for (y = 0; y < height; y++)
{
guint channel_diff;
channel_diff = ABS (value_a - value_b);
+
+ if (channel_diff > max_diff)
+ max_diff = channel_diff;
+
channel_diff *= 4; /* emphasize */
if (channel_diff)
channel_diff += 128; /* make sure it's visible */
diff_pixel |= channel_diff << (channel * 8);
}
+ pixels_changed++;
+
if ((diff_pixel & 0x00ffffff) == 0)
{
/* alpha only difference, convert to luminance */
}
}
+ if (max_diff_out != NULL)
+ *max_diff_out = max_diff;
+
+ if (pixels_changed_out != NULL)
+ *pixels_changed_out = pixels_changed;
+
return diff;
}
GdkTexture *
reftest_compare_textures (GdkTexture *texture1,
- GdkTexture *texture2)
+ GdkTexture *texture2,
+ guint *max_diff_out,
+ guint *pixels_changed_out,
+ guint *pixels_out)
{
int w, h;
guchar *data1, *data2;
diff = buffer_diff_core (data1, w * 4,
data2, w * 4,
- w, h);
+ w, h, max_diff_out, pixels_changed_out);
g_free (data1);
g_free (data2);
+ if (pixels_out != NULL)
+ *pixels_out = w * h;
+
return diff;
}