Blame tests/buffer/buffer-test.c

Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
#include <gegl.h>
Packit Service 2781ba
#include <gegl-buffer.h>
Packit Service 2781ba
#include <math.h>
Packit Service 2781ba
#include <stdio.h>
Packit Service 2781ba
#include <stdlib.h>
Packit Service 2781ba
#include <glib.h>
Packit Service 2781ba
#include <glib/gstdio.h>
Packit Service 2781ba
Packit Service 2781ba
/* This file consists of a testing suite for the GeglBuffer API. For every
Packit Service 2781ba
 * function matching the regexp ^static.*(' in the file a test is performed and
Packit Service 2781ba
 * the output is stored in in a file with the name of the function.
Packit Service 2781ba
 *
Packit Service 2781ba
 * The makefile contains shell scripting that provides knowledge of how much
Packit Service 2781ba
 * passes the reference suite, testing should occur over a range of different
Packit Service 2781ba
 * tile sizes to make sure the behavior is consistent.
Packit Service 2781ba
 */
Packit Service 2781ba
Packit Service 2781ba
#include "../../gegl/buffer/gegl-buffer-iterator.h"
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
/* helper macros for the output, issue a test_start() after your defined
Packit Service 2781ba
 * variables and the first logic, use print as your printf and print_buffer to
Packit Service 2781ba
 * dump a GeglBuffer's contents to the log, issue test_end for the final
Packit Service 2781ba
 * rendering.
Packit Service 2781ba
 */
Packit Service 2781ba
Packit Service 2781ba
#define test_start()              GString *gstring=g_string_new("");\
Packit Service 2781ba
                                  print (("Test: %s\n", G_STRINGIFY (TESTNAME)))
Packit Service 2781ba
#define print(args)		  G_STMT_START {		\
Packit Service 2781ba
	gchar *_fmt = g_strdup_printf args;			\
Packit Service 2781ba
	g_string_append (gstring, _fmt);			\
Packit Service 2781ba
	g_free (_fmt);						\
Packit Service 2781ba
				  } G_STMT_END
Packit Service 2781ba
#define print_buffer(buffer)      print_buffer_internal (gstring, buffer)
Packit Service 2781ba
#define print_linear_buffer_u8(w,h,b)  print_linear_buffer_internal_u8 (gstring,w,h,b)
Packit Service 2781ba
#define print_linear_buffer_float(w,h,b)  print_linear_buffer_internal_float (gstring,w,h,b)
Packit Service 2781ba
#define test_end()                return g_string_free (gstring, FALSE)
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static void print_buffer_internal (GString    *gstring,
Packit Service 2781ba
                                   GeglBuffer *buffer);
Packit Service 2781ba
static void
Packit Service 2781ba
print_linear_buffer_internal_float (GString    *gstring,
Packit Service 2781ba
                                    gint        width,
Packit Service 2781ba
                                    gint        height,
Packit Service 2781ba
                                    gfloat     *buf);
Packit Service 2781ba
static void
Packit Service 2781ba
print_linear_buffer_internal_u8    (GString    *gstring,
Packit Service 2781ba
                                    gint        width,
Packit Service 2781ba
                                    gint        height,
Packit Service 2781ba
                                    guchar     *buf);
Packit Service 2781ba
Packit Service 2781ba
static void checkerboard          (GeglBuffer *buffer,
Packit Service 2781ba
                                   gint        cellsize,
Packit Service 2781ba
                                   gfloat      val1,
Packit Service 2781ba
                                   gfloat      val2);
Packit Service 2781ba
Packit Service 2781ba
static void fill                  (GeglBuffer *buffer,
Packit Service 2781ba
                                   gfloat      value);
Packit Service 2781ba
Packit Service 2781ba
static void vgrad                 (GeglBuffer *buffer);
Packit Service 2781ba
Packit Service 2781ba
static void rectangle             (GeglBuffer *buffer,
Packit Service 2781ba
                                   gint        x,
Packit Service 2781ba
                                   gint        y,
Packit Service 2781ba
                                   gint        width,
Packit Service 2781ba
                                   gint        height,
Packit Service 2781ba
                                   gfloat      value);
Packit Service 2781ba
Packit Service 2781ba
static void fill_rect (GeglBuffer          *buffer,
Packit Service 2781ba
                       const GeglRectangle *roi,
Packit Service 2781ba
                       gfloat               value
Packit Service 2781ba
                       );
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
/***********************************************************************/
Packit Service 2781ba
/**************************************************************************/
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
print_linear_buffer_internal_float (GString    *gstring,
Packit Service 2781ba
                                    gint        width,
Packit Service 2781ba
                                    gint        height,
Packit Service 2781ba
                                    gfloat     *buf)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar *scale[]={" ", "░", "▒", "▓", "█", "█"};
Packit Service 2781ba
  gint x,y;
Packit Service 2781ba
  print (("▛"));
Packit Service 2781ba
  for (x=0;x
Packit Service 2781ba
    print (("▀"));
Packit Service 2781ba
  print (("▜\n"));
Packit Service 2781ba
  for (y=0;y
Packit Service 2781ba
    {
Packit Service 2781ba
      print (("▌"));
Packit Service 2781ba
      for (x=0;x
Packit Service 2781ba
        {
Packit Service 2781ba
          gint val = floor ( buf[y*width+x] * 4 + 0.5);
Packit Service 2781ba
          if (val>4)
Packit Service 2781ba
            val=4;
Packit Service 2781ba
          if (val<0)
Packit Service 2781ba
            val=0;
Packit Service 2781ba
          print (("%s", scale[val]));
Packit Service 2781ba
        }
Packit Service 2781ba
      print (("▐\n"));
Packit Service 2781ba
    }
Packit Service 2781ba
  print (("▙"));
Packit Service 2781ba
  for (x=0;x
Packit Service 2781ba
    print (("▄"));
Packit Service 2781ba
  print (("▟\n"));
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
print_linear_buffer_internal_u8 (GString    *gstring,
Packit Service 2781ba
                                 gint        width,
Packit Service 2781ba
                                 gint        height,
Packit Service 2781ba
                                 guchar     *buf)
Packit Service 2781ba
{
Packit Service 2781ba
  gchar *scale[]={" ", "░", "▒", "▓", "█"};
Packit Service 2781ba
  gint x,y;
Packit Service 2781ba
  print (("▛"));
Packit Service 2781ba
  for (x=0;x
Packit Service 2781ba
    print (("▀"));
Packit Service 2781ba
  print (("▜\n"));
Packit Service 2781ba
  for (y=0;y
Packit Service 2781ba
    {
Packit Service 2781ba
      print (("▌"));
Packit Service 2781ba
      for (x=0;x
Packit Service 2781ba
        print (("%s", scale[ (gint)floor ( buf[y*width+x]/256.0 * 4 + 0.5)]));
Packit Service 2781ba
      print (("▐\n"));
Packit Service 2781ba
    }
Packit Service 2781ba
  print (("▙"));
Packit Service 2781ba
  for (x=0;x
Packit Service 2781ba
    print (("▄"));
Packit Service 2781ba
  print (("▟\n"));
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
print_buffer_internal (GString    *gstring,
Packit Service 2781ba
                       GeglBuffer *buffer)
Packit Service 2781ba
{
Packit Service 2781ba
  gfloat *buf;
Packit Service 2781ba
  gint width, height, x0, y0;
Packit Service 2781ba
  g_object_get (buffer, "x", &x0,
Packit Service 2781ba
                        "y", &y0,
Packit Service 2781ba
                        "width", &width,
Packit Service 2781ba
                        "height", &height,
Packit Service 2781ba
                        NULL);
Packit Service 2781ba
  buf = g_malloc (width*height*sizeof(gfloat));
Packit Service 2781ba
  gegl_buffer_get (buffer, NULL, 1.0, babl_format ("Y float"), buf, 0,
Packit Service 2781ba
                   GEGL_ABYSS_NONE);
Packit Service 2781ba
  print_linear_buffer_internal_float (gstring, width, height, buf);
Packit Service 2781ba
  g_free (buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
fill (GeglBuffer *buffer,
Packit Service 2781ba
      gfloat      value)
Packit Service 2781ba
{
Packit Service 2781ba
  gfloat *buf;
Packit Service 2781ba
  gint x,y;
Packit Service 2781ba
  gint i;
Packit Service 2781ba
  gint width, height, x0, y0;
Packit Service 2781ba
  g_object_get (buffer, "x", &x0,
Packit Service 2781ba
                        "y", &y0,
Packit Service 2781ba
                        "width", &width,
Packit Service 2781ba
                        "height", &height,
Packit Service 2781ba
                        NULL);
Packit Service 2781ba
  buf = g_malloc (width*height*sizeof(gfloat));
Packit Service 2781ba
  gegl_buffer_get (buffer, NULL, 1.0, babl_format ("Y float"), buf, 0,
Packit Service 2781ba
                   GEGL_ABYSS_NONE);
Packit Service 2781ba
Packit Service 2781ba
  i=0;
Packit Service 2781ba
  for (y=0;y
Packit Service 2781ba
    {
Packit Service 2781ba
      for (x=0;x
Packit Service 2781ba
        {
Packit Service 2781ba
          buf[i++]=value;
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  gegl_buffer_set (buffer, NULL, 0, babl_format ("Y float"), buf, GEGL_AUTO_ROWSTRIDE);
Packit Service 2781ba
  g_free (buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void checkerboard          (GeglBuffer *buffer,
Packit Service 2781ba
                                   gint        cellsize,
Packit Service 2781ba
                                   gfloat      val1,
Packit Service 2781ba
                                   gfloat      val2)
Packit Service 2781ba
{
Packit Service 2781ba
  gfloat *buf;
Packit Service 2781ba
  gint x,y;
Packit Service 2781ba
  gint i;
Packit Service 2781ba
  gint width, height, x0, y0;
Packit Service 2781ba
  g_object_get (buffer, "x", &x0,
Packit Service 2781ba
                        "y", &y0,
Packit Service 2781ba
                        "width", &width,
Packit Service 2781ba
                        "height", &height,
Packit Service 2781ba
                        NULL);
Packit Service 2781ba
  buf = g_malloc (width*height*sizeof(gfloat));
Packit Service 2781ba
  gegl_buffer_get (buffer, NULL, 1.0, babl_format ("Y float"), buf, 0,
Packit Service 2781ba
                   GEGL_ABYSS_NONE);
Packit Service 2781ba
Packit Service 2781ba
  i=0;
Packit Service 2781ba
  for (y=0;y
Packit Service 2781ba
    {
Packit Service 2781ba
      for (x=0;x
Packit Service 2781ba
        {
Packit Service 2781ba
          gfloat val=val1;
Packit Service 2781ba
          if ( (x/cellsize) % 2)
Packit Service 2781ba
            {
Packit Service 2781ba
              if ( (y/cellsize) % 2)
Packit Service 2781ba
                {
Packit Service 2781ba
                  val=val2;
Packit Service 2781ba
                }
Packit Service 2781ba
            }
Packit Service 2781ba
          else
Packit Service 2781ba
            {
Packit Service 2781ba
              if ( (y/cellsize) % 2 == 0)
Packit Service 2781ba
                {
Packit Service 2781ba
                  val=val2;
Packit Service 2781ba
                }
Packit Service 2781ba
            }
Packit Service 2781ba
          buf[i++]= val;
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  gegl_buffer_set (buffer, NULL, 0, babl_format ("Y float"), buf, GEGL_AUTO_ROWSTRIDE);
Packit Service 2781ba
Packit Service 2781ba
  g_free (buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void vgrad (GeglBuffer *buffer)
Packit Service 2781ba
{
Packit Service 2781ba
  gfloat *buf;
Packit Service 2781ba
  gint x,y;
Packit Service 2781ba
  gint i;
Packit Service 2781ba
  gint width, height, x0, y0;
Packit Service 2781ba
  g_object_get (buffer, "x", &x0,
Packit Service 2781ba
                        "y", &y0,
Packit Service 2781ba
                        "width", &width,
Packit Service 2781ba
                        "height", &height,
Packit Service 2781ba
                        NULL);
Packit Service 2781ba
  buf = g_malloc (width*height*sizeof(gfloat));
Packit Service 2781ba
  gegl_buffer_get (buffer, NULL, 1.0, babl_format ("Y float"), buf, 0,
Packit Service 2781ba
                   GEGL_ABYSS_NONE);
Packit Service 2781ba
Packit Service 2781ba
  i=0;
Packit Service 2781ba
  for (y=0;y
Packit Service 2781ba
    {
Packit Service 2781ba
      for (x=0;x
Packit Service 2781ba
        {
Packit Service 2781ba
          buf[i++]= (1.0*y)/height;
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
  gegl_buffer_set (buffer, NULL, 0, babl_format ("Y float"), buf, GEGL_AUTO_ROWSTRIDE);
Packit Service 2781ba
  g_free (buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void fill_rect (GeglBuffer          *buffer,
Packit Service 2781ba
                       const GeglRectangle *roi,
Packit Service 2781ba
                       gfloat               value
Packit Service 2781ba
                       )
Packit Service 2781ba
{
Packit Service 2781ba
  GeglBufferIterator *gi;
Packit Service 2781ba
  gi = gegl_buffer_iterator_new (buffer, roi, 0, NULL,
Packit Service 2781ba
                                 GEGL_BUFFER_WRITE, GEGL_ABYSS_NONE);
Packit Service 2781ba
  while (gegl_buffer_iterator_next (gi))
Packit Service 2781ba
    {
Packit Service 2781ba
      gfloat *buf = gi->data[0];
Packit Service 2781ba
      gint    i;
Packit Service 2781ba
      for (i=0; i<gi->length; i++)
Packit Service 2781ba
        {
Packit Service 2781ba
          buf[i]=value;
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void rectangle (GeglBuffer *buffer,
Packit Service 2781ba
                gint        x,
Packit Service 2781ba
                gint        y,
Packit Service 2781ba
                gint        width,
Packit Service 2781ba
                gint        height,
Packit Service 2781ba
                gfloat      value)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglBuffer *sub_buf;
Packit Service 2781ba
  GeglRectangle rect={x,y,width,height};
Packit Service 2781ba
Packit Service 2781ba
  sub_buf = gegl_buffer_create_sub_buffer (buffer, &rect);
Packit Service 2781ba
  fill (sub_buf, value);
Packit Service 2781ba
  g_object_unref (sub_buf);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
#include "buffer-tests.inc"
Packit Service 2781ba
Packit Service 2781ba
gint main (gint argc, gchar **argv)
Packit Service 2781ba
{
Packit Service 2781ba
  gint i;
Packit Service 2781ba
  g_thread_init (NULL);
Packit Service 2781ba
  gegl_init (&argc, &argv);
Packit Service 2781ba
Packit Service 2781ba
  for (i=0; i < G_N_ELEMENTS (tests); i++)
Packit Service 2781ba
    {
Packit Service 2781ba
      gchar *ret;
Packit Service 2781ba
Packit Service 2781ba
      if (argc > 1)
Packit Service 2781ba
        {
Packit Service 2781ba
          /* handle any extra commandline options as a list of tests to
Packit Service 2781ba
           * run and output to standard output
Packit Service 2781ba
           */
Packit Service 2781ba
          gint j;
Packit Service 2781ba
          for (j=1;j
Packit Service 2781ba
            {
Packit Service 2781ba
              if (g_str_equal (argv[j], test_names[i]))
Packit Service 2781ba
                {
Packit Service 2781ba
                  ret=tests[i]();
Packit Service 2781ba
                  printf ("%s", ret);
Packit Service 2781ba
                  g_free (ret);
Packit Service 2781ba
                }
Packit Service 2781ba
            }
Packit Service 2781ba
        }
Packit Service 2781ba
      else
Packit Service 2781ba
        {
Packit Service 2781ba
          gchar output_file[1024];
Packit Service 2781ba
          printf ("%s ", test_names[i]);
Packit Service 2781ba
          ret=tests[i]();
Packit Service 2781ba
          sprintf (output_file, "output/%s.buf", test_names[i]);
Packit Service 2781ba
          g_file_set_contents (output_file, ret, -1, NULL);
Packit Service 2781ba
          g_free (ret);
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  gegl_exit ();
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}