From 58f66ebd077671e37f6842b47409df5d3ec07fce Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 15 Sep 2021 22:54:14 +0200 Subject: [PATCH] reftests: Make image-compare use textures All image comparisons are done on textures now. --- testsuite/reftests/image-compare.c | 32 +++++-- testsuite/reftests/reftest-compare.c | 122 ++++----------------------- testsuite/reftests/reftest-compare.h | 3 - 3 files changed, 41 insertions(+), 116 deletions(-) diff --git a/testsuite/reftests/image-compare.c b/testsuite/reftests/image-compare.c index 07bb79e4e0..dd9c26c231 100644 --- a/testsuite/reftests/image-compare.c +++ b/testsuite/reftests/image-compare.c @@ -10,9 +10,9 @@ static gboolean opt_quiet; int main (int argc, char **argv) { - cairo_surface_t *image1; - cairo_surface_t *image2; - cairo_surface_t *diff; + GdkTexture *image1; + GdkTexture *image2; + GdkTexture *diff; GOptionEntry entries[] = { {"output", 'o', 0, G_OPTION_ARG_FILENAME, &opt_filename, "Output location", "FILE" }, {"quiet", 'q', 0, G_OPTION_ARG_NONE, &opt_quiet, "Don't talk", NULL }, @@ -38,13 +38,29 @@ main (int argc, char **argv) exit (1); } - image1 = cairo_image_surface_create_from_png (argv[1]); - image2 = cairo_image_surface_create_from_png (argv[2]); + image1 = gdk_texture_new_from_filename (argv[1], &error); + if (image1 == NULL) + { + g_printerr ("Error loading %s: %s\n", argv[1], error->message); + exit (1); + } + image2 = gdk_texture_new_from_filename (argv[2], &error); + if (image2 == NULL) + { + g_printerr ("Error loading %s: %s\n", argv[2], error->message); + exit (1); + } - diff = reftest_compare_surfaces (image1, image2); + diff = reftest_compare_textures (image1, image2); if (opt_filename && diff) - cairo_surface_write_to_png (diff, opt_filename); + { + if (!gdk_texture_save_to_png (diff, opt_filename)) + { + g_printerr ("Could not save diff image to %s\n", opt_filename); + exit (1); + } + } if (!opt_quiet) { @@ -59,7 +75,5 @@ main (int argc, char **argv) g_print ("No differences.\n"); } - if (!opt_quiet) - return diff != NULL ? 1 : 0; } diff --git a/testsuite/reftests/reftest-compare.c b/testsuite/reftests/reftest-compare.c index ff39ce6a58..bb6c6ebc1a 100644 --- a/testsuite/reftests/reftest-compare.c +++ b/testsuite/reftests/reftest-compare.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Red Hat Inc. + * Copyright (C) 2011,2021 Red Hat Inc. * * Author: * Benjamin Otte @@ -22,62 +22,14 @@ #include "reftest-compare.h" -static void -get_surface_size (cairo_surface_t *surface, - int *width, - int *height) -{ - cairo_t *cr; - double x1, x2, y1, y2; - - cr = cairo_create (surface); - cairo_clip_extents (cr, &x1, &y1, &x2, &y2); - cairo_destroy (cr); - - g_assert_true (x1 == 0 && y1 == 0); - g_assert_true (x2 > 0 && y2 > 0); - g_assert_true ((int) x2 == x2 && (int) y2 == y2); - - *width = x2; - *height = y2; -} - - -static cairo_surface_t * -coerce_surface_for_comparison (cairo_surface_t *surface, - int width, - int height) -{ - cairo_surface_t *coerced; - cairo_t *cr; - - coerced = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, - width, - height); - cr = cairo_create (coerced); - - cairo_set_source_surface (cr, surface, 0, 0); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_paint (cr); - - cairo_destroy (cr); - - g_assert_true (cairo_surface_status (coerced) == CAIRO_STATUS_SUCCESS); - - return coerced; -} - -/* Compares two CAIRO_FORMAT_ARGB32 buffers, returning NULL if the +/* Compares two GDK_MEMORY_DEFAULT buffers, returning NULL if the * buffers are equal or a surface containing a diff between the two * surfaces. * - * This function should be rewritten to compare all formats supported by - * cairo_format_t instead of taking a mask as a parameter. - * * This function is originally from cairo:test/buffer-diff.c. * Copyright © 2004 Richard D. Worth */ -static cairo_surface_t * +static GdkTexture * buffer_diff_core (const guchar *buf_a, int stride_a, const guchar *buf_b, @@ -88,7 +40,7 @@ buffer_diff_core (const guchar *buf_a, int x, y; guchar *buf_diff = NULL; int stride_diff = 0; - cairo_surface_t *diff = NULL; + GdkTexture *diff = NULL; for (y = 0; y < height; y++) { @@ -112,12 +64,15 @@ buffer_diff_core (const guchar *buf_a, if (diff == NULL) { - diff = cairo_image_surface_create (CAIRO_FORMAT_RGB24, - width, - height); - g_assert_true (cairo_surface_status (diff) == CAIRO_STATUS_SUCCESS); - buf_diff = cairo_image_surface_get_data (diff); - stride_diff = cairo_image_surface_get_stride (diff); + GBytes *bytes; + + stride_diff = 4 * width; + buf_diff = g_malloc0_n (stride_diff, height); + bytes = g_bytes_new_take (buf_diff, stride_diff * height); + diff = gdk_memory_texture_new (width, height, + GDK_MEMORY_DEFAULT, + bytes, + stride_diff); row = (guint32 *) (buf_diff + y * stride_diff); } @@ -153,40 +108,12 @@ buffer_diff_core (const guchar *buf_a, return diff; } -cairo_surface_t * -reftest_compare_surfaces (cairo_surface_t *surface1, - cairo_surface_t *surface2) -{ - int w1, h1, w2, h2, w, h; - cairo_surface_t *coerced1, *coerced2, *diff; - - get_surface_size (surface1, &w1, &h1); - get_surface_size (surface2, &w2, &h2); - w = MAX (w1, w2); - h = MAX (h1, h2); - coerced1 = coerce_surface_for_comparison (surface1, w, h); - coerced2 = coerce_surface_for_comparison (surface2, w, h); - - diff = buffer_diff_core (cairo_image_surface_get_data (coerced1), - cairo_image_surface_get_stride (coerced1), - cairo_image_surface_get_data (coerced2), - cairo_image_surface_get_stride (coerced2), - w, h); - - cairo_surface_destroy (coerced1); - cairo_surface_destroy (coerced2); - - return diff; -} - GdkTexture * reftest_compare_textures (GdkTexture *texture1, GdkTexture *texture2) { int w, h; guchar *data1, *data2; - GBytes *bytes; - cairo_surface_t *surface; GdkTexture *diff; w = MAX (gdk_texture_get_width (texture1), gdk_texture_get_width (texture2)); @@ -197,25 +124,12 @@ reftest_compare_textures (GdkTexture *texture1, data2 = g_malloc_n (w * 4, h); gdk_texture_download (texture2, data2, w * 4); - surface = buffer_diff_core (data1, w * 4, - data2, w * 4, - w, h); - if (surface == NULL) - return NULL; + diff = buffer_diff_core (data1, w * 4, + data2, w * 4, + w, h); - bytes = g_bytes_new_with_free_func (cairo_image_surface_get_data (surface), - cairo_image_surface_get_height (surface) - * cairo_image_surface_get_stride (surface), - (GDestroyNotify) cairo_surface_destroy, - cairo_surface_reference (surface)); - - diff = gdk_memory_texture_new (cairo_image_surface_get_width (surface), - cairo_image_surface_get_height (surface), - GDK_MEMORY_DEFAULT, - bytes, - cairo_image_surface_get_stride (surface)); - - g_bytes_unref (bytes); + g_free (data1); + g_free (data2); return diff; } diff --git a/testsuite/reftests/reftest-compare.h b/testsuite/reftests/reftest-compare.h index 04b8031fe1..d5e02a1a7d 100644 --- a/testsuite/reftests/reftest-compare.h +++ b/testsuite/reftests/reftest-compare.h @@ -22,9 +22,6 @@ G_BEGIN_DECLS -G_MODULE_EXPORT -cairo_surface_t * reftest_compare_surfaces (cairo_surface_t *surface1, - cairo_surface_t *surface2); G_MODULE_EXPORT GdkTexture * reftest_compare_textures (GdkTexture *texture1, GdkTexture *texture2);