From e35427071bb2cfa8239aceae7367f6523ff53a6b Mon Sep 17 00:00:00 2001 From: Ville Sokk Date: Fri, 8 Jun 2012 21:31:17 +0300 Subject: [PATCH] app: added test for gegl operations --- app/operations/gimpoperationnormalmode.c | 6 +- app/tests/Makefile.am | 8 +- app/tests/files/blending-test-A.png | Bin 0 -> 3117 bytes app/tests/files/blending-test-B.png | Bin 0 -> 2034 bytes app/tests/files/normal-mode.png | Bin 0 -> 40239 bytes app/tests/files/normal-mode.xml | 15 ++ app/tests/test-operations.c | 328 +++++++++++++++++++++++ 7 files changed, 353 insertions(+), 4 deletions(-) create mode 100644 app/tests/files/blending-test-A.png create mode 100644 app/tests/files/blending-test-B.png create mode 100644 app/tests/files/normal-mode.png create mode 100644 app/tests/files/normal-mode.xml create mode 100644 app/tests/test-operations.c diff --git a/app/operations/gimpoperationnormalmode.c b/app/operations/gimpoperationnormalmode.c index 5bf7e47404..d5f69af099 100644 --- a/app/operations/gimpoperationnormalmode.c +++ b/app/operations/gimpoperationnormalmode.c @@ -59,8 +59,10 @@ gimp_operation_normal_mode_class_init (GimpOperationNormalModeClass *klass) point_class = GEGL_OPERATION_POINT_COMPOSER3_CLASS (klass); gegl_operation_class_set_keys (operation_class, - "name", "gimp:normal-mode", - "description", "GIMP normal mode operation", + "name", "gimp:normal-mode", + "description", "GIMP normal mode operation", + "reference-image", "normal-mode.png", + "reference-composition", "normal-mode.xml", NULL); operation_class->process = gimp_operation_normal_parent_process; diff --git a/app/tests/Makefile.am b/app/tests/Makefile.am index f7ba12cf0c..e536fdd489 100644 --- a/app/tests/Makefile.am +++ b/app/tests/Makefile.am @@ -22,6 +22,7 @@ TESTS = \ test-core \ test-gimpidtable \ test-gimptilebackendtilemanager \ + test-operations \ test-save-and-export \ test-session-2-6-compatibility \ test-session-2-8-compatibility-multi-window \ @@ -34,7 +35,7 @@ TESTS = \ EXTRA_PROGRAMS = $(TESTS) CLEANFILES = $(EXTRA_PROGRAMS) -$(TESTS): gimpdir-output +$(TESTS): gimpdir-output operations-output noinst_LIBRARIES = libgimpapptestutils.a libgimpapptestutils_a_SOURCES = \ @@ -138,5 +139,8 @@ gimpdir-output: mkdir -p gimpdir-output/patterns mkdir -p gimpdir-output/gradients +operations-output: + mkdir -p operations-output + clean-local: - rm -rf gimpdir-output + rm -rf gimpdir-output operations-output diff --git a/app/tests/files/blending-test-A.png b/app/tests/files/blending-test-A.png new file mode 100644 index 0000000000000000000000000000000000000000..effdbb44c2537ada5600b8e2ca0ca3636ae497c4 GIT binary patch literal 3117 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 Hu0mjf^{CDx literal 0 HcmV?d00001 diff --git a/app/tests/files/blending-test-B.png b/app/tests/files/blending-test-B.png new file mode 100644 index 0000000000000000000000000000000000000000..012cec0fbe4bce184b2ad831861b9ed1a67f3935 GIT binary patch literal 2034 zcmVPx+tVu*cRCwC$ol%zCAPhxC&n&L{U(Yo3r!yyU0Np2q<4oaan#M5(3G86N?(r>ylz)F~!bK_< zOphf-JO0}`WAes2>dOY>{CZuSexKgEH%PCOSudD1ih8~bhl+mQGlV;@BZGJoq^yMA zxvepPa`+!Z)uYdb6vzyR~4Ym@`BfTxn8xUzxM~N7Zu1@zq?8I!AcqH2U}<44XXf97k;TGb65j!3?WH6D3|75zoz4k-0S}D^YDzhRf z0p5edN(0hdk7=NI|N34S&cZ+yuu-E_aq_&+c*517LDastY!8T(7 zYUX&XcMJ*ABgP})O+zEK;37p0RoEYC3LJ@ZqLbleFww1t2t?vQ1MI!i_2ESN|yfX+M-8fo+QnK-ni(rmVStY5%D0(>a8cbYm zE0|qVsn6a+W-s*YM9@n!vUg`$?}%uI$My;boH;?X@94P|F(_eXDp01-Q`_W5%o5Mb-aIwr_Slm3q8~kSGsgWfN3*b#8vjc~&WH zf?1R?5BpH60jaQ%dU6DpnB`R>vcR@m7p;&f{H_F?WldCFv|U^Vvy8T^s}GC~mF}sX;wgJDxfIb}snpJI@7HFod zD1$#`#8-`wi^9Af>h?wk=!zWEOKwzg!e=Q0onVz&c`LH_#MaF*B%U5AK<^TN)^;0s_}lVLO}yW&6~xF&roG<7O$nHfJ2I92;eLpIw2s8GOh}iv_eS9 z3L?mVcHfT#`k^G%mJUJjL&g#NJ34P6VNOzc^-NhRHMg7uQMWo6zxI=d=_n1!+PY@H?l$q zx**jV6jVW8&v-J?FP^4}tUR}7$W|tiraSKuEH^c$jMv>A`09666tDoXu{yhzdL(h73$RtP<|1XoTKyAw|~A6d-`u8GE_MSeuB8+AfY7{TyoR2P~>GFhd|=`Tl=kuW?v`b7QC zq=*x!+$UbqT!UP-WsvBz)9pf^-7M<|u&iiJlGW^Lb$_RndLosrBh_wbbqf<;hu90w%M{0M-Oei13(q{7i} zgZzOcmj<^PoJdd6k{TmwC2o?B5(TJ{fWSy0=iPSOZMWTa+ikbqc6;~s7fkH_{2}5? Q2><{907*qoM6N<$f;CUM2LJ#7 literal 0 HcmV?d00001 diff --git a/app/tests/files/normal-mode.png b/app/tests/files/normal-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f26171dfd796a0c5c4461b3f2beda998ae275c GIT binary patch literal 40239 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 Nzxo${;cxz<{|k>CNI3ui literal 0 HcmV?d00001 diff --git a/app/tests/files/normal-mode.xml b/app/tests/files/normal-mode.xml new file mode 100644 index 0000000000..0db2ef0d0e --- /dev/null +++ b/app/tests/files/normal-mode.xml @@ -0,0 +1,15 @@ + + + + + + blending-test-B.png + + + + + + blending-test-A.png + + + diff --git a/app/tests/test-operations.c b/app/tests/test-operations.c new file mode 100644 index 0000000000..ef05ab4220 --- /dev/null +++ b/app/tests/test-operations.c @@ -0,0 +1,328 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 2010 Øyvind Kolås + * 2012 Ville Sokk + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "app/operations/gimp-operations.h" + +#define DATA_DIR "files" +#define OUTPUT_DIR "operations-output" + + +static inline gfloat +square (gfloat x) +{ + return x * x; +} + +/* + * image comparison function from GEGL + */ +static gboolean +image_compare (gchar *composition_path, + gchar *reference_path) +{ + GeglBuffer *bufferA = NULL; + GeglBuffer *bufferB = NULL; + GeglBuffer *debug_buf = NULL; + gboolean result = TRUE; + + { + GeglNode *graph, *sink; + graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferA, NULL, + gegl_node ("gegl:load", "path", composition_path, NULL))); + gegl_node_process (sink); + g_object_unref (graph); + if (!bufferA) + { + g_printerr ("\nFailed to open %s\n", composition_path); + return FALSE; + } + + graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferB, NULL, + gegl_node ("gegl:load", "path", reference_path, NULL))); + gegl_node_process (sink); + g_object_unref (graph); + if (!bufferB) + { + g_printerr ("\nFailed to open %s\n", reference_path); + return FALSE; + } + } + + if (gegl_buffer_get_width (bufferA) != gegl_buffer_get_width (bufferB) || + gegl_buffer_get_height (bufferA) != gegl_buffer_get_height (bufferB)) + { + g_printerr ("\nBuffers differ in size\n"); + g_printerr (" %ix%i vs %ix%i\n", + gegl_buffer_get_width (bufferA), gegl_buffer_get_height (bufferA), + gegl_buffer_get_width (bufferB), gegl_buffer_get_height (bufferB)); + + return FALSE; + } + + debug_buf = gegl_buffer_new (gegl_buffer_get_extent (bufferA), babl_format ("R'G'B' u8")); + + { + gfloat *bufA, *bufB; + gfloat *a, *b; + guchar *debug, *d; + gint rowstrideA, rowstrideB, dRowstride; + gint pixels; + gint wrong_pixels = 0; + gint i; + gdouble diffsum = 0.0; + gdouble max_diff = 0.0; + + pixels = gegl_buffer_get_pixel_count (bufferA); + + bufA = (void*)gegl_buffer_linear_open (bufferA, NULL, &rowstrideA, + babl_format ("CIE Lab float")); + bufB = (void*)gegl_buffer_linear_open (bufferB, NULL, &rowstrideB, + babl_format ("CIE Lab float")); + debug = (void*)gegl_buffer_linear_open (debug_buf, NULL, &dRowstride, + babl_format ("R'G'B' u8")); + + a = bufA; + b = bufB; + d = debug; + + for (i=0; i= 0.01) + { + wrong_pixels++; + diffsum += diff; + if (diff > max_diff) + max_diff = diff; + d[0] = (diff/100.0*255); + d[1] = 0; + d[2] = a[0]/100.0*255; + } + else + { + d[0] = a[0]/100.0*255; + d[1] = a[0]/100.0*255; + d[2] = a[0]/100.0*255; + } + a += 3; + b += 3; + d += 3; + } + + a = bufA; + b = bufB; + d = debug; + + if (wrong_pixels) + for (i = 0; i < pixels; i++) + { + gdouble diff = sqrt (square (a[0]-b[0])+ + square (a[1]-b[1])+ + square (a[2]-b[2]) + /*+square (a[3]-b[3])*/); + if (diff >= 0.01) + { + d[0] = (100-a[0])/100.0*64+32; + d[1] = (diff/max_diff * 255); + d[2] = 0; + } + else + { + d[0] = a[0]/100.0*255; + d[1] = a[0]/100.0*255; + d[2] = a[0]/100.0*255; + } + a += 3; + b += 3; + d += 3; + } + + gegl_buffer_linear_close (bufferA, bufA); + gegl_buffer_linear_close (bufferB, bufB); + gegl_buffer_linear_close (debug_buf, debug); + + if (max_diff >= 0.1) + { + g_print ("\nBuffers differ\n" + " wrong pixels : %i/%i (%2.2f%%)\n" + " max Δe : %2.3f\n" + " avg Δe (wrong) : %2.3f(wrong) %2.3f(total)\n", + wrong_pixels, pixels, (wrong_pixels*100.0/pixels), + max_diff, + diffsum/wrong_pixels, + diffsum/pixels); + + result = FALSE; + + if (max_diff > 1.5) + { + GeglNode *graph, *sink; + gchar *debug_path = g_malloc (strlen (composition_path)+16); + gint ext_length = strlen (strrchr (composition_path, '.')); + + memcpy (debug_path, composition_path, strlen (composition_path)+1); + memcpy (debug_path + strlen(composition_path)-ext_length, "-diff.png", 11); + graph = gegl_graph (sink=gegl_node ("gegl:png-save", + "path", debug_path, NULL, + gegl_node ("gegl:buffer-source", + "buffer", debug_buf, NULL))); + gegl_node_process (sink); + g_object_unref (graph); + g_object_unref (debug_buf); + } + } + } + + g_object_unref (debug_buf); + g_object_unref (bufferA); + g_object_unref (bufferB); + + return result; +} + +static gboolean +process_operations (GType type) +{ + GType *operations; + gboolean result = TRUE; + guint count; + gint i; + + operations = g_type_children (type, &count); + + if (!operations) + { + g_free (operations); + return TRUE; + } + + for (i = 0; i < count; i++) + { + GeglOperationClass *operation_class; + const gchar *image, *xml; + + operation_class = g_type_class_ref (operations[i]); + image = gegl_operation_class_get_key (operation_class, "reference-image"); + xml = gegl_operation_class_get_key (operation_class, "reference-composition"); + + if (image && xml) + { + gchar *root = g_get_current_dir (); + gchar *image_path = g_build_path (G_DIR_SEPARATOR_S, root, DATA_DIR, image, NULL); + gchar *xml_path = g_build_path (G_DIR_SEPARATOR_S, root, DATA_DIR, xml, NULL); + gchar *output_path = g_build_path (G_DIR_SEPARATOR_S, root, OUTPUT_DIR, image, NULL); + GeglNode *composition, *output; + + g_printf ("%s: ", gegl_operation_class_get_key (operation_class, "name")); + + if (!g_file_test (xml_path, G_FILE_TEST_EXISTS)) + { + g_printerr ("\nCan't locate %s\n", xml_path); + result = FALSE; + } + + composition = gegl_node_new_from_file (xml_path); + if (!composition) + { + g_printerr ("\nComposition graph is flawed\n"); + result = FALSE; + } + else + { + output = gegl_node_new_child (composition, + "operation", "gegl:save", + "path", output_path, + NULL); + gegl_node_connect_to (composition, "output", output, "input"); + gegl_node_process (output); + + if (image_compare (output_path, image_path)) + { + g_printf ("PASS\n"); + result = TRUE; + } + else + { + g_printf ("FAIL\n"); + result = FALSE; + } + } + + g_object_unref (composition); + g_free (root); + g_free (image_path); + g_free (xml_path); + g_free (output_path); + } + + result = result && process_operations(operations[i]); + } + + g_free (operations); + + return result; +} + +/** + * test_operations: + * + * Test GIMP's GEGL operations that supply a reference image + * and composition xml. + **/ +static void +test_operations (void) +{ + gint result; + + putchar ('\n'); + result = process_operations (GEGL_TYPE_OPERATION); + g_assert_cmpint (result, ==, TRUE); +} + +gint +main (gint argc, + gchar ** argv) +{ + gint result; + + g_thread_init (NULL); + gegl_init (&argc, &argv); + gimp_operations_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gimp-operations", test_operations); + + result = g_test_run (); + + gegl_exit (); + + return result; +} +