Blame operations/workshop/external/gluas.c

Packit Service 2781ba
/* This file is an image processing operation for GEGL
Packit Service 2781ba
 *
Packit Service 2781ba
 * GEGL is free software; you can redistribute it and/or
Packit Service 2781ba
 * modify it under the terms of the GNU Lesser General Public
Packit Service 2781ba
 * License as published by the Free Software Foundation; either
Packit Service 2781ba
 * version 3 of the License, or (at your option) any later version.
Packit Service 2781ba
 *
Packit Service 2781ba
 * GEGL is distributed in the hope that it will be useful,
Packit Service 2781ba
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2781ba
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 2781ba
 * Lesser General Public License for more details.
Packit Service 2781ba
 *
Packit Service 2781ba
 * You should have received a copy of the GNU Lesser General Public
Packit Service 2781ba
 * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
Packit Service 2781ba
 *
Packit Service 2781ba
 * Copyright 2004, 2006 Øyvind Kolås <pippin@gimp.org>
Packit Service 2781ba
 */
Packit Service 2781ba
Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
#include <glib/gi18n-lib.h>
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
#ifdef GEGL_CHANT_PROPERTIES
Packit Service 2781ba
Packit Service 2781ba
#define THRESHOLD_SCRIPT \
Packit Service 2781ba
"level = user_value/2\n"\
Packit Service 2781ba
"for y=bound_y0, bound_y1 do\n"\
Packit Service 2781ba
"  for x=bound_x0, bound_x1 do\n"\
Packit Service 2781ba
"    v = get_value (x,y)\n"\
Packit Service 2781ba
"    v = v + get_value (1, x,y)\n"\
Packit Service 2781ba
"    if v>level then\n"\
Packit Service 2781ba
"      v=1.0\n"\
Packit Service 2781ba
"    else\n"\
Packit Service 2781ba
"      v=0.0\n"\
Packit Service 2781ba
"    end\n"\
Packit Service 2781ba
"    set_value (x,y,v)\n"\
Packit Service 2781ba
"  end\n"\
Packit Service 2781ba
"  progress (y/height)\n"\
Packit Service 2781ba
"end"
Packit Service 2781ba
Packit Service 2781ba
gegl_chant_multiline (script, _("Script"), THRESHOLD_SCRIPT,
Packit Service 2781ba
         _("The lua script containing the implementation of this operation."))
Packit Service 2781ba
gegl_chant_file_path (file, _("File"), "", _("a stored lua script on disk implementing an operation."))
Packit Service 2781ba
gegl_chant_double (user_value, _("User value"), -1000.0, 1000.0, 1.0,
Packit Service 2781ba
         _("(appears in the global variable 'user_value' in lua."))
Packit Service 2781ba
Packit Service 2781ba
#else
Packit Service 2781ba
Packit Service 2781ba
#define GEGL_CHANT_TYPE_COMPOSER
Packit Service 2781ba
#define GEGL_CHANT_C_FILE       "gluas.c"
Packit Service 2781ba
Packit Service 2781ba
#include "gegl-chant.h"
Packit Service 2781ba
#include <lua.h>
Packit Service 2781ba
#include <lualib.h>
Packit Service 2781ba
#include <lauxlib.h>
Packit Service 2781ba
Packit Service 2781ba
typedef struct Priv
Packit Service 2781ba
{
Packit Service 2781ba
  gint        bpp;
Packit Service 2781ba
  GeglBuffer *in_drawable;
Packit Service 2781ba
  GeglBuffer *aux_drawable;
Packit Service 2781ba
  GeglBuffer *out_drawable;
Packit Service 2781ba
  const Babl *rgba_float;
Packit Service 2781ba
Packit Service 2781ba
  gint        bx1, by1;
Packit Service 2781ba
  gint        bx2, by2;    /* mask bounds */
Packit Service 2781ba
Packit Service 2781ba
  gint        width;
Packit Service 2781ba
  gint        height;
Packit Service 2781ba
Packit Service 2781ba
  lua_State  *L;
Packit Service 2781ba
}
Packit Service 2781ba
Priv;
Packit Service 2781ba
Packit Service 2781ba
#define TILE_CACHE_SIZE   16
Packit Service 2781ba
#define SCALE_WIDTH      125
Packit Service 2781ba
#define ENTRY_WIDTH       50
Packit Service 2781ba
Packit Service 2781ba
static int l_set_rgba  (lua_State * lua);
Packit Service 2781ba
static int l_get_rgba  (lua_State * lua);
Packit Service 2781ba
static int l_set_rgb   (lua_State * lua);
Packit Service 2781ba
static int l_get_rgb   (lua_State * lua);
Packit Service 2781ba
static int l_set_hsl   (lua_State * lua);
Packit Service 2781ba
static int l_get_hsl   (lua_State * lua);
Packit Service 2781ba
static int l_set_hsv   (lua_State * lua);
Packit Service 2781ba
static int l_get_hsv   (lua_State * lua);
Packit Service 2781ba
static int l_set_value (lua_State * lua);
Packit Service 2781ba
static int l_get_value (lua_State * lua);
Packit Service 2781ba
static int l_set_alpha (lua_State * lua);
Packit Service 2781ba
static int l_get_alpha (lua_State * lua);
Packit Service 2781ba
static int l_set_lab   (lua_State * lua);
Packit Service 2781ba
static int l_get_lab   (lua_State * lua);
Packit Service 2781ba
static int l_in_width  (lua_State * lua);
Packit Service 2781ba
static int l_in_height (lua_State * lua);
Packit Service 2781ba
Packit Service 2781ba
static int l_progress  (lua_State * lua);
Packit Service 2781ba
static int l_flush     (lua_State * lua);
Packit Service 2781ba
static int l_print     (lua_State * lua);
Packit Service 2781ba
Packit Service 2781ba
static const luaL_reg gluas_functions[] =
Packit Service 2781ba
{
Packit Service 2781ba
    {"set_rgba",    l_set_rgba},
Packit Service 2781ba
    {"get_rgba",    l_get_rgba},
Packit Service 2781ba
    {"set_rgb",     l_set_rgb},
Packit Service 2781ba
    {"get_rgb",     l_get_rgb},
Packit Service 2781ba
    {"set_hsl",     l_set_hsl},
Packit Service 2781ba
    {"get_hsl",     l_get_hsl},
Packit Service 2781ba
    {"set_hsv",     l_set_hsv},
Packit Service 2781ba
    {"get_hsv",     l_get_hsv},
Packit Service 2781ba
    {"set_lab",     l_set_lab},
Packit Service 2781ba
    {"get_lab",     l_get_lab},
Packit Service 2781ba
    {"set_value",   l_set_value},
Packit Service 2781ba
    {"get_value",   l_get_value},
Packit Service 2781ba
    {"set_alpha",   l_set_alpha},
Packit Service 2781ba
    {"get_alpha",   l_get_alpha},
Packit Service 2781ba
    {"in_width",    l_in_width},
Packit Service 2781ba
    {"in_height",   l_in_height},
Packit Service 2781ba
    {"progress",    l_progress},
Packit Service 2781ba
    {"flush",       l_flush},
Packit Service 2781ba
    {"print",       l_print},
Packit Service 2781ba
    {NULL,          NULL}
Packit Service 2781ba
};
Packit Service 2781ba
static void
Packit Service 2781ba
register_functions (lua_State      *L,
Packit Service 2781ba
                    const luaL_reg *l)
Packit Service 2781ba
{
Packit Service 2781ba
  for (;l->name; l++)
Packit Service 2781ba
    lua_register (L, l->name, l->func);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
drawable_lua_process (GeglOperation       *op,
Packit Service 2781ba
                      GeglBuffer          *drawable,
Packit Service 2781ba
                      GeglBuffer          *aux,
Packit Service 2781ba
                      GeglBuffer          *result,
Packit Service 2781ba
                      const GeglRectangle *roi,
Packit Service 2781ba
                      const gchar         *file,
Packit Service 2781ba
                      const gchar         *buffer,
Packit Service 2781ba
                      gdouble              user_value)
Packit Service 2781ba
{
Packit Service 2781ba
    /*GimpRGB    background;*/
Packit Service 2781ba
Packit Service 2781ba
    GeglRectangle *in_rect = gegl_operation_source_get_bounding_box (GEGL_OPERATION (op),
Packit Service 2781ba
                                                                       "input");
Packit Service 2781ba
Packit Service 2781ba
    lua_State *L;
Packit Service 2781ba
    Priv p;
Packit Service 2781ba
Packit Service 2781ba
    L = lua_open ();
Packit Service 2781ba
    luaL_openlibs (L);
Packit Service 2781ba
Packit Service 2781ba
    register_functions (L, gluas_functions);
Packit Service 2781ba
Packit Service 2781ba
    p.rgba_float = babl_format ("RGBA float");
Packit Service 2781ba
    p.L = L;
Packit Service 2781ba
    p.width = in_rect->width;
Packit Service 2781ba
    p.height = in_rect->height;
Packit Service 2781ba
Packit Service 2781ba
    p.bx1 = roi->x;
Packit Service 2781ba
    p.by1 = roi->y;
Packit Service 2781ba
    p.bx2 = roi->x + roi->width;
Packit Service 2781ba
    p.by2 = roi->y + roi->height;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushnumber (L, (double) user_value);
Packit Service 2781ba
    lua_setglobal (L, "user_value");
Packit Service 2781ba
    lua_pushnumber (L, (double) p.width);
Packit Service 2781ba
    lua_setglobal (L, "width");
Packit Service 2781ba
    lua_pushnumber (L, (double) p.height);
Packit Service 2781ba
    lua_setglobal (L, "height");
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (L, "priv");
Packit Service 2781ba
    lua_pushlightuserdata (L, &p);
Packit Service 2781ba
    lua_settable (L, LUA_REGISTRYINDEX);
Packit Service 2781ba
Packit Service 2781ba
    p.in_drawable = drawable;
Packit Service 2781ba
    p.aux_drawable = aux;
Packit Service 2781ba
    p.out_drawable = result;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushnumber (L, (double) p.bx1);
Packit Service 2781ba
    lua_setglobal (L, "bound_x0");
Packit Service 2781ba
    lua_pushnumber (L, (double) p.bx2);
Packit Service 2781ba
    lua_setglobal (L, "bound_x1");
Packit Service 2781ba
    lua_pushnumber (L, (double) p.by1);
Packit Service 2781ba
    lua_setglobal (L, "bound_y0");
Packit Service 2781ba
    lua_pushnumber (L, (double) p.by2);
Packit Service 2781ba
    lua_setglobal (L, "bound_y1");
Packit Service 2781ba
Packit Service 2781ba
        {
Packit Service 2781ba
      gint status = 0;
Packit Service 2781ba
Packit Service 2781ba
      luaL_loadstring (L, "os.setlocale ('C', 'numeric')");
Packit Service 2781ba
Packit Service 2781ba
      if (file && file[0]!='\0')
Packit Service 2781ba
        status = luaL_loadfile (L, file);
Packit Service 2781ba
      else if (buffer)
Packit Service 2781ba
        status = luaL_loadbuffer (L, buffer, strlen (buffer), "buffer");
Packit Service 2781ba
Packit Service 2781ba
      if (status == 0)
Packit Service 2781ba
        status = lua_pcall (L, 0, LUA_MULTRET, 0);
Packit Service 2781ba
Packit Service 2781ba
      if (status != 0)
Packit Service 2781ba
        g_warning ("lua error: %s", lua_tostring (L, -1));
Packit Service 2781ba
    }
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
void
Packit Service 2781ba
drawable_lua_do_file (GeglBuffer    *drawable,
Packit Service 2781ba
                      GeglBuffer    *result,
Packit Service 2781ba
                      GeglRectangle *roi,
Packit Service 2781ba
                      const gchar   *file,
Packit Service 2781ba
                      gdouble        user_value)
Packit Service 2781ba
{
Packit Service 2781ba
  drawable_lua_process (drawable, result, roi, file, NULL, user_value);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
void
Packit Service 2781ba
drawable_lua_do_buffer (GeglBuffer    *drawable,
Packit Service 2781ba
                        GeglBuffer    *result,
Packit Service 2781ba
                        GeglRectangle *roi,
Packit Service 2781ba
                        const gchar   *buffer,
Packit Service 2781ba
                        gdouble        user_value)
Packit Service 2781ba
{
Packit Service 2781ba
  drawable_lua_process (drawable, result, roi, NULL, buffer, user_value);
Packit Service 2781ba
}
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
static void inline
Packit Service 2781ba
get_rgba_pixel (void       *data,
Packit Service 2781ba
                int         img_no,
Packit Service 2781ba
                int         x,
Packit Service 2781ba
                int         y,
Packit Service 2781ba
                lua_Number  pixel[4])
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  gfloat buf[4];
Packit Service 2781ba
Packit Service 2781ba
  p = data;
Packit Service 2781ba
Packit Service 2781ba
  if (img_no == 0)
Packit Service 2781ba
    {
Packit Service 2781ba
      gint i;
Packit Service 2781ba
      if (!p->in_drawable)
Packit Service 2781ba
        return;
Packit Service 2781ba
      gegl_buffer_sample (p->in_drawable, x, y, NULL, buf,
Packit Service 2781ba
                          p->rgba_float,
Packit Service 2781ba
                          GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
Packit Service 2781ba
      for (i = 0; i < 4; i++)
Packit Service 2781ba
        pixel[i] = buf[i];
Packit Service 2781ba
    }
Packit Service 2781ba
  else if (img_no == 1)
Packit Service 2781ba
    {
Packit Service 2781ba
      gint i;
Packit Service 2781ba
      if (!p->aux_drawable)
Packit Service 2781ba
        return;
Packit Service 2781ba
      gegl_buffer_sample (p->aux_drawable, x, y, NULL, buf,
Packit Service 2781ba
                          p->rgba_float,
Packit Service 2781ba
                          GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
Packit Service 2781ba
      for (i = 0; i < 4; i++)
Packit Service 2781ba
        pixel[i] = buf[i];
Packit Service 2781ba
    }
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void inline
Packit Service 2781ba
set_rgba_pixel (void       *data,
Packit Service 2781ba
                int         x,
Packit Service 2781ba
                int         y,
Packit Service 2781ba
                lua_Number  pixel[4])
Packit Service 2781ba
{
Packit Service 2781ba
  Priv   *p;
Packit Service 2781ba
  GeglRectangle roi = {x,y,1,1};
Packit Service 2781ba
  gint    i;
Packit Service 2781ba
  gfloat  buf[4];
Packit Service 2781ba
Packit Service 2781ba
  p = data;
Packit Service 2781ba
Packit Service 2781ba
  /*FIXME: */
Packit Service 2781ba
  if (x < p->bx1 || y < p->by1 || x > p->bx2 || y > p->by2)
Packit Service 2781ba
      return;     /* outside selection, ignore */
Packit Service 2781ba
#if 0
Packit Service 2781ba
  if (x < 0 || y < 0 || x >= p->width || y >= p->height)
Packit Service 2781ba
      return;    /* out of drawable bounds */
Packit Service 2781ba
#endif
Packit Service 2781ba
  for (i = 0; i < 4; i++)
Packit Service 2781ba
    {
Packit Service 2781ba
      buf[i]=pixel[i];
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
 gegl_buffer_set (p->out_drawable, &roi,
Packit Service 2781ba
                  0, p->rgba_float, buf,
Packit Service 2781ba
                  GEGL_AUTO_ROWSTRIDE);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int
Packit Service 2781ba
l_in_width (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring(lua, "priv");
Packit Service 2781ba
  lua_gettable(lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata(lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
  lua_pushnumber(lua, (double)p->width);
Packit Service 2781ba
  return 1;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int
Packit Service 2781ba
l_in_height(lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring(lua, "priv");
Packit Service 2781ba
  lua_gettable(lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata(lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
  lua_pushnumber(lua, (double)p->height);
Packit Service 2781ba
Packit Service 2781ba
  return 1;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int
Packit Service 2781ba
l_flush (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring(lua, "priv");
Packit Service 2781ba
  lua_gettable(lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int
Packit Service 2781ba
l_progress(lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  lua_Number percent;
Packit Service 2781ba
Packit Service 2781ba
  if (!lua_gettop(lua))
Packit Service 2781ba
    return 0;
Packit Service 2781ba
  percent = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
  g_warning ("progress,.. %f", percent);
Packit Service 2781ba
  gimp_progress_update((double) percent);
Packit Service 2781ba
#endif
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int
Packit Service 2781ba
l_print (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  if (!lua_gettop(lua))
Packit Service 2781ba
    return 0;
Packit Service 2781ba
  g_print ("%s\n", lua_tostring(lua, -1));
Packit Service 2781ba
Packit Service 2781ba
  return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static int l_set_rgba (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 6)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_rgba (x, y, r, g, b, a)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x        = lua_tonumber (lua, -6);
Packit Service 2781ba
    y        = lua_tonumber (lua, -5);
Packit Service 2781ba
    pixel[0] = lua_tonumber (lua, -4);
Packit Service 2781ba
    pixel[1] = lua_tonumber (lua, -3);
Packit Service 2781ba
    pixel[2] = lua_tonumber (lua, -2);
Packit Service 2781ba
    pixel[3] = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_rgba (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_rgba (x, y)\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
  lua_pushnumber (lua, pixel[0]);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[1]);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[2]);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[3]);
Packit Service 2781ba
Packit Service 2781ba
  return 4;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_rgb (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 5)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_rgb (x, y, r, g, b)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -5);
Packit Service 2781ba
    y = lua_tonumber (lua, -4);
Packit Service 2781ba
Packit Service 2781ba
    pixel[0] = lua_tonumber (lua, -3);
Packit Service 2781ba
    pixel[1] = lua_tonumber (lua, -2);
Packit Service 2781ba
    pixel[2] = lua_tonumber (lua, -1);
Packit Service 2781ba
    pixel[3] = 1.0;
Packit Service 2781ba
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_rgb (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_rgb (x, y, [, image_no])\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
  lua_pushnumber (lua, pixel[0]);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[1]);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[2]);
Packit Service 2781ba
Packit Service 2781ba
  return 3;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_value (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number x, y, v;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 3)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_value (x, y, value)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -3);
Packit Service 2781ba
    y = lua_tonumber (lua, -2);
Packit Service 2781ba
    v = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    pixel[0] = pixel[1] = pixel[2] = v;
Packit Service 2781ba
    pixel[3] = 1.0;
Packit Service 2781ba
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
int l_get_value (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
  lua_Number x,y;
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_value (x, y [, image_no])\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
  lua_pushnumber (lua, (pixel[0]+pixel[1]+pixel[2]) * (1.0/3));
Packit Service 2781ba
Packit Service 2781ba
  return 1;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_alpha (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y, a;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 3)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_alpha (x, y, a)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -3);
Packit Service 2781ba
    y = lua_tonumber (lua, -2);
Packit Service 2781ba
    a = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, 0, x, y, pixel);
Packit Service 2781ba
    pixel[3] = a;
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_alpha (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_alpha (x, y [,image])\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
  lua_pushnumber (lua, pixel[3]);
Packit Service 2781ba
Packit Service 2781ba
  return 1;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_lab (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y, l, a, b;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 5)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_lab (x, y, l, a, b)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -5);
Packit Service 2781ba
    y = lua_tonumber (lua, -4);
Packit Service 2781ba
    l = lua_tonumber (lua, -3);
Packit Service 2781ba
    a = lua_tonumber (lua, -2);
Packit Service 2781ba
    b = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    /* pixel assumed to be of type double */
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, 0, x, y, pixel);
Packit Service 2781ba
#if 0
Packit Service 2781ba
    cpercep_space_to_rgb (l, a, b, &(pixel[0]), &(pixel[1]), &(pixel[2]));
Packit Service 2781ba
      {
Packit Service 2781ba
      int i;
Packit Service 2781ba
      for (i=0;i<3;i++)
Packit Service 2781ba
        pixel[i] *= (1.0/255.0);
Packit Service 2781ba
      }
Packit Service 2781ba
#endif
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_lab (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
  /*double lab_pixel[3];*/
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_rgb (x, y, [, image_no])\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
  get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
  cpercep_rgb_to_space (pixel[0] * 255.0,
Packit Service 2781ba
                        pixel[1] * 255.0,
Packit Service 2781ba
                        pixel[2] * 255.0,
Packit Service 2781ba
Packit Service 2781ba
                        &(lab_pixel[0]),
Packit Service 2781ba
                        &(lab_pixel[1]),
Packit Service 2781ba
                        &(lab_pixel[2]));
Packit Service 2781ba
Packit Service 2781ba
  lua_pushnumber (lua, lab_pixel[0]);
Packit Service 2781ba
  lua_pushnumber (lua, lab_pixel[1]);
Packit Service 2781ba
  lua_pushnumber (lua, lab_pixel[2]);
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
  return 3;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_hsl (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y, h, s, l;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 5)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_lab (x, y, l, a, b)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -5);
Packit Service 2781ba
    y = lua_tonumber (lua, -4);
Packit Service 2781ba
    h = lua_tonumber (lua, -3);
Packit Service 2781ba
    s = lua_tonumber (lua, -2);
Packit Service 2781ba
    l = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, 0, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
    {
Packit Service 2781ba
      GimpRGB rgb;
Packit Service 2781ba
      GimpHSL hsl;
Packit Service 2781ba
Packit Service 2781ba
      hsl.h = h;
Packit Service 2781ba
      hsl.s = s;
Packit Service 2781ba
      hsl.l = l;
Packit Service 2781ba
Packit Service 2781ba
      gimp_hsl_to_rgb (&hsl, &rgb);
Packit Service 2781ba
Packit Service 2781ba
      pixel[0]=rgb.r;
Packit Service 2781ba
      pixel[1]=rgb.g;
Packit Service 2781ba
      pixel[2]=rgb.b;
Packit Service 2781ba
    }
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_hsl (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_rgb ([image_no,] x, y)\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
    {
Packit Service 2781ba
      GimpRGB rgb;
Packit Service 2781ba
      GimpHSL hsl;
Packit Service 2781ba
Packit Service 2781ba
      rgb.r = pixel[0];
Packit Service 2781ba
      rgb.g = pixel[1];
Packit Service 2781ba
      rgb.b = pixel[2];
Packit Service 2781ba
Packit Service 2781ba
      gimp_rgb_to_hsl (&rgb, &hsl);
Packit Service 2781ba
Packit Service 2781ba
      lua_pushnumber (lua, hsl.h );
Packit Service 2781ba
      lua_pushnumber (lua, hsl.s );
Packit Service 2781ba
      lua_pushnumber (lua, hsl.l );
Packit Service 2781ba
    }
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
  return 3;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_set_hsv (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
    Priv *p;
Packit Service 2781ba
    lua_Number pixel[4];
Packit Service 2781ba
    lua_Number x, y, h, s, v;
Packit Service 2781ba
Packit Service 2781ba
    lua_pushstring (lua, "priv");
Packit Service 2781ba
    lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
    p = lua_touserdata (lua, -1);
Packit Service 2781ba
    lua_pop (lua, 1);
Packit Service 2781ba
Packit Service 2781ba
    if (lua_gettop (lua) != 5)
Packit Service 2781ba
      {
Packit Service 2781ba
        lua_pushstring(lua,
Packit Service 2781ba
                       "incorrect number of arguments to set_lab (x, y, l, a, b)\n");
Packit Service 2781ba
        lua_error (lua);
Packit Service 2781ba
        return 0;
Packit Service 2781ba
      }
Packit Service 2781ba
Packit Service 2781ba
    x = lua_tonumber (lua, -5);
Packit Service 2781ba
    y = lua_tonumber (lua, -4);
Packit Service 2781ba
    h = lua_tonumber (lua, -3);
Packit Service 2781ba
    s = lua_tonumber (lua, -2);
Packit Service 2781ba
    v = lua_tonumber (lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, 0, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
    {
Packit Service 2781ba
      GimpRGB rgb;
Packit Service 2781ba
      GimpHSV hsv;
Packit Service 2781ba
Packit Service 2781ba
      hsv.h = h;
Packit Service 2781ba
      hsv.s = s;
Packit Service 2781ba
      hsv.v = v;
Packit Service 2781ba
Packit Service 2781ba
      gimp_hsv_to_rgb (&hsv, &rgb);
Packit Service 2781ba
Packit Service 2781ba
      pixel[0]=rgb.r;
Packit Service 2781ba
      pixel[1]=rgb.g;
Packit Service 2781ba
      pixel[2]=rgb.b;
Packit Service 2781ba
    }
Packit Service 2781ba
#endif
Packit Service 2781ba
Packit Service 2781ba
    set_rgba_pixel (p, x, y, pixel);
Packit Service 2781ba
    return 0;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static int l_get_hsv (lua_State * lua)
Packit Service 2781ba
{
Packit Service 2781ba
  Priv *p;
Packit Service 2781ba
  lua_Number x, y;
Packit Service 2781ba
  lua_Number img_no = 0;
Packit Service 2781ba
Packit Service 2781ba
  lua_Number pixel[4];
Packit Service 2781ba
Packit Service 2781ba
  lua_pushstring (lua, "priv");
Packit Service 2781ba
  lua_gettable (lua, LUA_REGISTRYINDEX);
Packit Service 2781ba
  p = lua_touserdata (lua, -1);
Packit Service 2781ba
  lua_pop(lua, 1);
Packit Service 2781ba
Packit Service 2781ba
  switch (lua_gettop (lua))
Packit Service 2781ba
    {
Packit Service 2781ba
    case 3:
Packit Service 2781ba
      img_no = lua_tonumber(lua, -3);
Packit Service 2781ba
      break;
Packit Service 2781ba
    case 2:
Packit Service 2781ba
      img_no = 0;
Packit Service 2781ba
      break;
Packit Service 2781ba
    default:
Packit Service 2781ba
      lua_pushstring (lua, "incorrect number of arguments to get_rgb ([image_no,] x, y)\n");
Packit Service 2781ba
      lua_error (lua);
Packit Service 2781ba
      break;
Packit Service 2781ba
  }
Packit Service 2781ba
  x = lua_tonumber(lua, -2);
Packit Service 2781ba
  y = lua_tonumber(lua, -1);
Packit Service 2781ba
Packit Service 2781ba
    get_rgba_pixel (p, img_no, x, y, pixel);
Packit Service 2781ba
Packit Service 2781ba
#if 0
Packit Service 2781ba
    {
Packit Service 2781ba
      GimpRGB rgb;
Packit Service 2781ba
      GimpHSV hsv;
Packit Service 2781ba
Packit Service 2781ba
      rgb.r = pixel[0];
Packit Service 2781ba
      rgb.g = pixel[1];
Packit Service 2781ba
      rgb.b = pixel[2];
Packit Service 2781ba
Packit Service 2781ba
      gimp_rgb_to_hsv (&rgb, &hsv;;
Packit Service 2781ba
Packit Service 2781ba
      lua_pushnumber (lua, hsv.h );
Packit Service 2781ba
      lua_pushnumber (lua, hsv.s );
Packit Service 2781ba
      lua_pushnumber (lua, hsv.v );
Packit Service 2781ba
    }
Packit Service 2781ba
#endif
Packit Service 2781ba
  return 3;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
prepare (GeglOperation *operation)
Packit Service 2781ba
{
Packit Service 2781ba
  gegl_operation_set_format (operation, "input", babl_format ("RGBA float"));
Packit Service 2781ba
  gegl_operation_set_format (operation, "aux", babl_format ("RGBA float"));
Packit Service 2781ba
  gegl_operation_set_format (operation, "output", babl_format ("RGBA float"));
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static GeglRectangle
Packit Service 2781ba
get_bounding_box (GeglOperation *operation)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglRectangle  result = {0,0,0,0};
Packit Service 2781ba
  GeglRectangle *in_rect = gegl_operation_source_get_bounding_box (operation,
Packit Service 2781ba
                                                                     "input");
Packit Service 2781ba
  if (!in_rect)
Packit Service 2781ba
    return result;
Packit Service 2781ba
Packit Service 2781ba
  result = *in_rect;
Packit Service 2781ba
  return result;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static gboolean
Packit Service 2781ba
process (GeglOperation       *operation,
Packit Service 2781ba
         GeglBuffer          *input,
Packit Service 2781ba
         GeglBuffer          *aux,
Packit Service 2781ba
         GeglBuffer          *output,
Packit Service 2781ba
         const GeglRectangle *result,
Packit Service 2781ba
         gint                 level)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglChantO *o = GEGL_CHANT_PROPERTIES (operation);
Packit Service 2781ba
Packit Service 2781ba
  if (o->file && g_file_test (o->file, G_FILE_TEST_IS_REGULAR))
Packit Service 2781ba
    {
Packit Service 2781ba
      drawable_lua_process (operation, input, aux, output, result, o->file, NULL, o->user_value);
Packit Service 2781ba
    }
Packit Service 2781ba
  else
Packit Service 2781ba
    {
Packit Service 2781ba
      drawable_lua_process (operation, input, aux, output, result, NULL, o->script, o->user_value);
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  return TRUE;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static GeglRectangle
Packit Service 2781ba
get_required_for_output (GeglOperation        *operation,
Packit Service 2781ba
                         const gchar         *input_pad,
Packit Service 2781ba
                         const GeglRectangle *roi)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglRectangle result = *gegl_operation_source_get_bounding_box (operation, "input");
Packit Service 2781ba
  return result;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
gegl_chant_class_init (GeglChantClass *klass)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglOperationClass         *operation_class;
Packit Service 2781ba
  GeglOperationComposerClass *composer_class;
Packit Service 2781ba
Packit Service 2781ba
  operation_class = GEGL_OPERATION_CLASS (klass);
Packit Service 2781ba
  composer_class  = GEGL_OPERATION_COMPOSER_CLASS (klass);
Packit Service 2781ba
Packit Service 2781ba
  composer_class->process = process;
Packit Service 2781ba
  operation_class->prepare = prepare;
Packit Service 2781ba
  operation_class->get_bounding_box = get_bounding_box;
Packit Service 2781ba
  operation_class->get_required_for_output = get_required_for_output;
Packit Service 2781ba
Packit Service 2781ba
  gegl_operation_class_set_keys (operation_class,
Packit Service 2781ba
  "name"        , "gegl:gluas",
Packit Service 2781ba
  "categories"  , "script:misc",
Packit Service 2781ba
  "description" ,
Packit Service 2781ba
        _("A general purpose filter/composer implementation proxy for the"
Packit Service 2781ba
          " lua programming language."),
Packit Service 2781ba
        NULL);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
#endif