|
Packit |
bc1512 |
#include <gegl.h>
|
|
Packit |
bc1512 |
#include <math.h>
|
|
Packit |
bc1512 |
#include <string.h>
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#define SQR(x) ((x) * (x))
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gint
|
|
Packit |
bc1512 |
main (gint argc,
|
|
Packit |
bc1512 |
gchar **argv)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglBuffer *bufferA = NULL;
|
|
Packit |
bc1512 |
GeglBuffer *bufferB = NULL;
|
|
Packit |
bc1512 |
GeglBuffer *debug_buf = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
g_thread_init (NULL);
|
|
Packit |
bc1512 |
gegl_init (&argc, &argv);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (argc != 3)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_print ("This is simple image difference detection tool for use in regression testing"
|
|
Packit |
bc1512 |
"return message is non zero if images are different, if they are equal"
|
|
Packit |
bc1512 |
"the output will contain the string identical.");
|
|
Packit |
bc1512 |
g_print ("Usage: %s <imageA> <imageB>\n", argv[0]);
|
|
Packit |
bc1512 |
return 1;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglNode *graph, *sink;
|
|
Packit |
bc1512 |
graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferA, NULL,
|
|
Packit |
bc1512 |
gegl_node ("gegl:load", "path", argv[1], NULL)));
|
|
Packit |
bc1512 |
gegl_node_process (sink);
|
|
Packit |
bc1512 |
g_object_unref (graph);
|
|
Packit |
bc1512 |
if (!bufferA)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_printerr ("Failed to open %s\n", argv[1]);
|
|
Packit |
bc1512 |
return 1;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
graph = gegl_graph (sink=gegl_node ("gegl:buffer-sink", "buffer", &bufferB, NULL,
|
|
Packit |
bc1512 |
gegl_node ("gegl:load", "path", argv[2], NULL)));
|
|
Packit |
bc1512 |
gegl_node_process (sink);
|
|
Packit |
bc1512 |
g_object_unref (graph);
|
|
Packit |
bc1512 |
if (!bufferB)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_printerr ("Failed to open %s\n", argv[2]);
|
|
Packit |
bc1512 |
return 1;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (gegl_buffer_get_width (bufferA) != gegl_buffer_get_width (bufferB) ||
|
|
Packit |
bc1512 |
gegl_buffer_get_height (bufferA) != gegl_buffer_get_height (bufferB))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_printerr ("%s and %s differ in size\n", argv[1], argv[2]);
|
|
Packit |
bc1512 |
g_printerr (" %ix%i vs %ix%i\n",
|
|
Packit |
bc1512 |
gegl_buffer_get_width (bufferA), gegl_buffer_get_height (bufferA),
|
|
Packit |
bc1512 |
gegl_buffer_get_width (bufferB), gegl_buffer_get_height (bufferB));
|
|
Packit |
bc1512 |
return 1;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
debug_buf = gegl_buffer_new (gegl_buffer_get_extent (bufferA), babl_format ("R'G'B' u8"));
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
gfloat *bufA, *bufB;
|
|
Packit |
bc1512 |
gfloat *a, *b;
|
|
Packit |
bc1512 |
guchar *debug, *d;
|
|
Packit |
bc1512 |
gint rowstrideA, rowstrideB, dRowstride;
|
|
Packit |
bc1512 |
gint pixels;
|
|
Packit |
bc1512 |
gint wrong_pixels=0;
|
|
Packit |
bc1512 |
gint i;
|
|
Packit |
bc1512 |
gdouble diffsum = 0.0;
|
|
Packit |
bc1512 |
gdouble max_diff = 0.0;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
pixels = gegl_buffer_get_pixel_count (bufferA);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
bufA = (void*)gegl_buffer_linear_open (bufferA, NULL, &rowstrideA,
|
|
Packit |
bc1512 |
babl_format ("CIE Lab float"));
|
|
Packit |
bc1512 |
bufB = (void*)gegl_buffer_linear_open (bufferB, NULL, &rowstrideB,
|
|
Packit |
bc1512 |
babl_format ("CIE Lab float"));
|
|
Packit |
bc1512 |
debug = (void*)gegl_buffer_linear_open (debug_buf, NULL, &dRowstride, babl_format ("R'G'B' u8"));
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
a = bufA;
|
|
Packit |
bc1512 |
b = bufB;
|
|
Packit |
bc1512 |
d = debug;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
for (i=0;i
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
gdouble diff = sqrt ( SQR(a[0]-b[0])+
|
|
Packit |
bc1512 |
SQR(a[1]-b[1])+
|
|
Packit |
bc1512 |
SQR(a[2]-b[2])
|
|
Packit |
bc1512 |
/*+SQR(a[3]-b[3])*/);
|
|
Packit |
bc1512 |
if (diff>=0.01)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
wrong_pixels++;
|
|
Packit |
bc1512 |
diffsum += diff;
|
|
Packit |
bc1512 |
if (diff > max_diff)
|
|
Packit |
bc1512 |
max_diff = diff;
|
|
Packit |
bc1512 |
d[0]=(diff/100.0 * 255);
|
|
Packit |
bc1512 |
d[1]=0;
|
|
Packit |
bc1512 |
d[2]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
d[0]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
d[1]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
d[2]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
a+=3;
|
|
Packit |
bc1512 |
b+=3;
|
|
Packit |
bc1512 |
d+=3;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
a = bufA;
|
|
Packit |
bc1512 |
b = bufB;
|
|
Packit |
bc1512 |
d = debug;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (wrong_pixels)
|
|
Packit |
bc1512 |
for (i=0;i
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
gdouble diff = sqrt ( SQR(a[0]-b[0])+
|
|
Packit |
bc1512 |
SQR(a[1]-b[1])+
|
|
Packit |
bc1512 |
SQR(a[2]-b[2])
|
|
Packit |
bc1512 |
/*+SQR(a[3]-b[3])*/);
|
|
Packit |
bc1512 |
if (diff>=0.01)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
d[0]=(100-a[0])/100.0*64+32;
|
|
Packit |
bc1512 |
d[1]=(diff/max_diff * 255);
|
|
Packit |
bc1512 |
d[2]=0;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
d[0]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
d[1]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
d[2]=a[0]/100.0*255;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
a+=3;
|
|
Packit |
bc1512 |
b+=3;
|
|
Packit |
bc1512 |
d+=3;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gegl_buffer_linear_close (bufferA, bufA);
|
|
Packit |
bc1512 |
gegl_buffer_linear_close (bufferB, bufB);
|
|
Packit |
bc1512 |
gegl_buffer_linear_close (debug_buf, debug);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (max_diff >= 0.1)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_printerr ("%s and %s differ\n"
|
|
Packit |
bc1512 |
" wrong pixels : %i/%i (%2.2f%%)\n"
|
|
Packit |
bc1512 |
" max Δe : %2.3f\n"
|
|
Packit |
bc1512 |
" avg Δe (wrong) : %2.3f(wrong) %2.3f(total)\n",
|
|
Packit |
bc1512 |
argv[1], argv[2],
|
|
Packit |
bc1512 |
wrong_pixels, pixels, (wrong_pixels*100.0/pixels),
|
|
Packit |
bc1512 |
max_diff,
|
|
Packit |
bc1512 |
diffsum/wrong_pixels,
|
|
Packit |
bc1512 |
diffsum/pixels);
|
|
Packit |
bc1512 |
if (max_diff > 1.5 &&
|
|
Packit |
bc1512 |
!strstr (argv[2], "broken"))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglNode *sink;
|
|
Packit |
bc1512 |
gchar *debug_path = g_malloc (strlen (argv[2])+16);
|
|
Packit |
bc1512 |
memcpy (debug_path, argv[2], strlen (argv[2])+1);
|
|
Packit |
bc1512 |
memcpy (debug_path + strlen(argv[2])-4, "-diff.png", 11);
|
|
Packit |
bc1512 |
gegl_graph (sink=gegl_node ("gegl:png-save",
|
|
Packit |
bc1512 |
"path", debug_path, NULL,
|
|
Packit |
bc1512 |
gegl_node ("gegl:buffer-source", "buffer", debug_buf, NULL)));
|
|
Packit |
bc1512 |
gegl_node_process (sink);
|
|
Packit |
bc1512 |
return 1;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
if (strstr (argv[2], "broken"))
|
|
Packit |
bc1512 |
g_print ("because the test is expected to fail ");
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
g_print ("because the error is small ");
|
|
Packit |
bc1512 |
g_print ("we'll say ");
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
g_print ("%s and %s are identical\n", argv[1], argv[2]);
|
|
Packit |
bc1512 |
g_object_unref (debug_buf);
|
|
Packit |
bc1512 |
g_object_unref (bufferA);
|
|
Packit |
bc1512 |
g_object_unref (bufferB);
|
|
Packit |
bc1512 |
gegl_exit ();
|
|
Packit |
bc1512 |
return 0;
|
|
Packit |
bc1512 |
}
|