Blame tools/img_cmp.c

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
}