Blame tools/img_cmp.c

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