Commit 130d2ad9 authored by Ville Sokk's avatar Ville Sokk

tools: changed img_cmp to use gegl:image-compare

parent a2304529
......@@ -69,16 +69,20 @@ process (GeglOperation *operation,
gdouble diffsum = 0.0;
gint wrong_pixels = 0;
const Babl* cielab = babl_format ("CIE Lab float");
gint rowstride_in, rowstride_aux, rowstride_out, pixels, i;
const Babl* srgb = babl_format ("R'G'B' u8");
gint pixels, i;
gfloat *in_buf, *aux_buf, *a, *b;
guchar *out_buf, *out;
if (aux == NULL)
return TRUE;
in_buf = (void *) gegl_buffer_linear_open (input, result, &rowstride_in, cielab);
aux_buf = (void *) gegl_buffer_linear_open (aux, result, &rowstride_aux, cielab);
out_buf = (void *) gegl_buffer_linear_open (output, result, &rowstride_out, babl_format ("R'G'B' u8"));
in_buf = g_malloc (result->height * result->width * babl_format_get_bytes_per_pixel (cielab));
aux_buf = g_malloc (result->height * result->width * babl_format_get_bytes_per_pixel (cielab));
out_buf = g_malloc (result->height * result->width * babl_format_get_bytes_per_pixel (srgb));
gegl_buffer_get (input, result, 1.0, cielab, in_buf, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
gegl_buffer_get (aux, result, 1.0, cielab, aux_buf, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
a = in_buf;
b = aux_buf;
......@@ -140,9 +144,11 @@ process (GeglOperation *operation,
out += 3;
}
gegl_buffer_linear_close (input, in_buf);
gegl_buffer_linear_close (aux, aux_buf);
gegl_buffer_linear_close (output, out_buf);
gegl_buffer_set (output, result, 1.0, srgb, out_buf, GEGL_AUTO_ROWSTRIDE);
g_free (in_buf);
g_free (aux_buf);
g_free (out_buf);
props->wrong_pixels = wrong_pixels;
props->max_diff = max_diff;
......@@ -167,7 +173,7 @@ gegl_chant_class_init (GeglChantClass *klass)
gegl_operation_class_set_keys (operation_class,
"name" , "gegl:image-compare",
"categories" , "misc",
"categories" , "programming",
"description", _("Compares if input and aux buffers are "
"different. Results are saved in the "
"properties."),
......
#include <gegl.h>
#include <gegl.h>
#include <math.h>
#include <string.h>
......@@ -8,9 +8,10 @@ gint
main (gint argc,
gchar **argv)
{
GeglBuffer *bufferA = NULL;
GeglBuffer *bufferB = NULL;
GeglBuffer *debug_buf = NULL;
GeglNode *gegl, *imgA, *imgB, *comparison;
GeglRectangle boundsA, boundsB;
gdouble max_diff, avg_diff_wrong, avg_diff_total;
gint wrong_pixels, total_pixels;
g_thread_init (NULL);
gegl_init (&argc, &argv);
......@@ -24,162 +25,84 @@ main (gint argc,
return 1;
}
{
GeglNode *graph, *sink;
graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferA, NULL,
gegl_node ("gegl:load", "path", argv[1], NULL)));
gegl_node_process (sink);
g_object_unref (graph);
if (!bufferA)
{
g_printerr ("Failed to open %s\n", argv[1]);
return 1;
}
graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferB, NULL,
gegl_node ("gegl:load", "path", argv[2], NULL)));
gegl_node_process (sink);
g_object_unref (graph);
if (!bufferB)
{
g_printerr ("Failed to open %s\n", argv[2]);
return 1;
}
}
if (gegl_buffer_get_width (bufferA) != gegl_buffer_get_width (bufferB) ||
gegl_buffer_get_height (bufferA) != gegl_buffer_get_height (bufferB))
gegl = gegl_node_new ();
imgA = gegl_node_new_child (gegl,
"operation", "gegl:load",
"path", argv[1],
NULL);
imgB = gegl_node_new_child (gegl,
"operation", "gegl:load",
"path", argv[2],
NULL);
boundsA = gegl_node_get_bounding_box (imgA);
boundsB = gegl_node_get_bounding_box (imgB);
total_pixels = boundsA.width * boundsA.height;
if (boundsA.width != boundsB.width || boundsA.height != boundsB.height)
{
g_printerr ("%s and %s differ in size\n", argv[1], argv[2]);
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));
boundsA.width, boundsA.height, boundsB.width, boundsB.height);
return 1;
}
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<pixels;i++)
{
gdouble diff = sqrt ( SQR(a[0]-b[0])+
SQR(a[1]-b[1])+
SQR(a[2]-b[2])
/*+SQR(a[3]-b[3])*/);
if (diff>=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 ( SQR(a[0]-b[0])+
SQR(a[1]-b[1])+
SQR(a[2]-b[2])
/*+SQR(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_printerr ("%s and %s differ\n"
" wrong pixels : %i/%i (%2.2f%%)\n"
" max Δe : %2.3f\n"
" avg Δe (wrong) : %2.3f(wrong) %2.3f(total)\n",
argv[1], argv[2],
wrong_pixels, pixels, (wrong_pixels*100.0/pixels),
max_diff,
diffsum/wrong_pixels,
diffsum/pixels);
if (max_diff > 1.5 &&
!strstr (argv[2], "broken"))
{
GeglNode *sink;
gchar *debug_path = g_malloc (strlen (argv[2])+16);
memcpy (debug_path, argv[2], strlen (argv[2])+1);
memcpy (debug_path + strlen(argv[2])-4, "-diff.png", 11);
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);
return 1;
}
if (strstr (argv[2], "broken"))
g_print ("because the test is expected to fail ");
else
g_print ("because the error is small ");
g_print ("we'll say ");
}
}
comparison = gegl_node_create_child (gegl, "gegl:image-compare");
gegl_node_link (imgA, comparison);
gegl_node_connect_to (imgB, "output", comparison, "aux");
gegl_node_process (comparison);
gegl_node_get (comparison,
"max diff", &max_diff,
"avg-diff-wrong", &avg_diff_wrong,
"avg-diff-total", &avg_diff_total,
"wrong-pixels", &wrong_pixels,
NULL);
if (max_diff >= 0.1)
{
g_printerr ("%s and %s differ\n"
" wrong pixels : %i/%i (%2.2f%%)\n"
" max Δe : %2.3f\n"
" avg Δe (wrong) : %2.3f(wrong) %2.3f(total)\n",
argv[1], argv[2],
wrong_pixels, total_pixels,
(wrong_pixels*100.0/total_pixels), max_diff,
avg_diff_wrong, avg_diff_total);
if (max_diff > 1.5 &&
!strstr (argv[2], "broken"))
{
GeglNode *save;
gchar *debug_path = g_malloc (strlen (argv[2])+16);
memcpy (debug_path, argv[2], strlen (argv[2])+1);
memcpy (debug_path + strlen(argv[2])-4, "-diff.png", 11);
save = gegl_node_new_child (gegl,
"operation", "gegl:png-save",
"path", debug_path,
NULL);
gegl_node_link (comparison, save);
gegl_node_process (save);
/*gegl_graph (sink=gegl_node ("gegl:png-save",
"path", debug_path, NULL,
gegl_node ("gegl:buffer-source", "buffer", debug_buf, NULL)));*/
return 1;
}
if (strstr (argv[2], "broken"))
g_print ("because the test is expected to fail ");
else
g_print ("because the error is small ");
g_print ("we'll say ");
}
g_print ("%s and %s are identical\n", argv[1], argv[2]);
g_object_unref (debug_buf);
g_object_unref (bufferA);
g_object_unref (bufferB);
g_object_unref (gegl);
gegl_exit ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment