Blame operations/common/svg-matrix.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 2006 Øyvind Kolås <pippin@gimp.org>
Packit Service 2781ba
 * Copyright 2006 Geert Jordaens <geert.jordaens@telenet.be>
Packit Service 2781ba
 */
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
gegl_chant_string (values, _("Values"), "", _("list of <number>s"))
Packit Service 2781ba
Packit Service 2781ba
#else
Packit Service 2781ba
Packit Service 2781ba
#define GEGL_CHANT_TYPE_POINT_FILTER
Packit Service 2781ba
#define GEGL_CHANT_C_FILE          "svg-matrix.c"
Packit Service 2781ba
Packit Service 2781ba
#include "gegl-chant.h"
Packit Service 2781ba
#include <math.h>
Packit Service 2781ba
#include <stdlib.h>
Packit Service 2781ba
Packit Service 2781ba
static void prepare (GeglOperation *operation)
Packit Service 2781ba
{
Packit Service 2781ba
  const Babl *format = babl_format ("RaGaBaA float");
Packit Service 2781ba
Packit Service 2781ba
  gegl_operation_set_format (operation, "input", format);
Packit Service 2781ba
  gegl_operation_set_format (operation, "output", format);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static gboolean
Packit Service 2781ba
process (GeglOperation       *op,
Packit Service 2781ba
         void                *in_buf,
Packit Service 2781ba
         void                *out_buf,
Packit Service 2781ba
         glong                n_pixels,
Packit Service 2781ba
         const GeglRectangle *roi,
Packit Service 2781ba
         gint                 level)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglChantO *o = GEGL_CHANT_PROPERTIES (op);
Packit Service 2781ba
  gfloat     *in = in_buf;
Packit Service 2781ba
  gfloat     *out = out_buf;
Packit Service 2781ba
  gfloat     *m;
Packit Service 2781ba
Packit Service 2781ba
  gfloat mi[25] = { 1.0, 0.0, 0.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 1.0, 0.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 1.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 0.0, 1.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 0.0, 0.0, 1.0};
Packit Service 2781ba
  gfloat ma[25] = { 1.0, 0.0, 0.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 1.0, 0.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 1.0, 0.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 0.0, 1.0, 0.0,
Packit Service 2781ba
                    0.0, 0.0, 0.0, 0.0, 1.0};
Packit Service 2781ba
  char        *endptr;
Packit Service 2781ba
  gfloat       value;
Packit Service 2781ba
  const gchar  delimiter=',';
Packit Service 2781ba
  const gchar *delimiters=" ";
Packit Service 2781ba
  gchar      **values;
Packit Service 2781ba
  glong        i;
Packit Service 2781ba
Packit Service 2781ba
  m = ma;
Packit Service 2781ba
Packit Service 2781ba
  if (o->values != NULL)
Packit Service 2781ba
    {
Packit Service 2781ba
      g_strstrip(o->values);
Packit Service 2781ba
      g_strdelimit (o->values, delimiters, delimiter);
Packit Service 2781ba
      values = g_strsplit (o->values, ",", 20);
Packit Service 2781ba
      for (i = 0 ; i < 20 ; i++)
Packit Service 2781ba
        if ( values[i] != NULL )
Packit Service 2781ba
          {
Packit Service 2781ba
            value = g_ascii_strtod(values[i], &endptr);
Packit Service 2781ba
            if (endptr != values[i])
Packit Service 2781ba
               ma[i] = value;
Packit Service 2781ba
            else
Packit Service 2781ba
              {
Packit Service 2781ba
                m = mi;
Packit Service 2781ba
                i = 21;
Packit Service 2781ba
              }
Packit Service 2781ba
          }
Packit Service 2781ba
        else
Packit Service 2781ba
          {
Packit Service 2781ba
             m = mi;
Packit Service 2781ba
             i = 21;
Packit Service 2781ba
          }
Packit Service 2781ba
       g_strfreev(values);
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  for (i=0; i
Packit Service 2781ba
    {
Packit Service 2781ba
      out[0] =  m[0]  * in[0] +  m[1]  * in[1] + m[2]  * in[2] + m[3]  * in[3] + m[4];
Packit Service 2781ba
      out[1] =  m[5]  * in[0] +  m[6]  * in[1] + m[7]  * in[2] + m[8]  * in[3] + m[9];
Packit Service 2781ba
      out[2] =  m[10] * in[0] +  m[11] * in[1] + m[12] * in[2] + m[13] * in[3] + m[14];
Packit Service 2781ba
      out[3] =  m[15] * in[0] +  m[16] * in[1] + m[17] * in[2] + m[18] * in[3] + m[19];
Packit Service 2781ba
      in  += 4;
Packit Service 2781ba
      out += 4;
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
  return TRUE;
Packit Service 2781ba
}
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
  GeglOperationPointFilterClass *point_filter_class;
Packit Service 2781ba
Packit Service 2781ba
  operation_class    = GEGL_OPERATION_CLASS (klass);
Packit Service 2781ba
  point_filter_class = GEGL_OPERATION_POINT_FILTER_CLASS (klass);
Packit Service 2781ba
Packit Service 2781ba
  point_filter_class->process = process;
Packit Service 2781ba
  operation_class->prepare = prepare;
Packit Service 2781ba
Packit Service 2781ba
  gegl_operation_class_set_keys (operation_class,
Packit Service 2781ba
    "name"       , "gegl:svg-matrix",
Packit Service 2781ba
    "categories" , "compositors:svgfilter",
Packit Service 2781ba
    "description", _("SVG color matrix operation svg_matrix"),
Packit Service 2781ba
    NULL);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
#endif