[gimp/goat-invasion] app: add our own GimpOperationNormalMode so we can opt out of premultiply



commit cc20974aedde8856c7e57190acf2f7f52e035381
Author: Michael Natterer <mitch gimp org>
Date:   Sat Mar 24 16:22:02 2012 +0100

    app: add our own GimpOperationNormalMode so we can opt out of premultiply

 app/gegl/Makefile.am               |    2 +
 app/gegl/gimp-gegl-types.h         |    1 +
 app/gegl/gimpoperationnormalmode.c |  159 ++++++++++++++++++++++++++++++++++++
 app/gegl/gimpoperationnormalmode.h |   53 ++++++++++++
 4 files changed, 215 insertions(+), 0 deletions(-)
---
diff --git a/app/gegl/Makefile.am b/app/gegl/Makefile.am
index 1340cc6..f26b8ca 100644
--- a/app/gegl/Makefile.am
+++ b/app/gegl/Makefile.am
@@ -78,6 +78,8 @@ libappgegl_a_sources = \
 	\
 	gimpoperationpointlayermode.c		\
 	gimpoperationpointlayermode.h		\
+	gimpoperationnormalmode.c		\
+	gimpoperationnormalmode.h		\
 	gimpoperationdissolvemode.c     	\
 	gimpoperationdissolvemode.h     	\
 	gimpoperationbehindmode.c       	\
diff --git a/app/gegl/gimp-gegl-types.h b/app/gegl/gimp-gegl-types.h
index 5eddece..a2e9100 100644
--- a/app/gegl/gimp-gegl-types.h
+++ b/app/gegl/gimp-gegl-types.h
@@ -46,6 +46,7 @@ typedef struct _GimpOperationPosterize          GimpOperationPosterize;
 typedef struct _GimpOperationThreshold          GimpOperationThreshold;
 
 typedef struct _GimpOperationPointLayerMode     GimpOperationPointLayerMode;
+typedef struct _GimpOperationNormalMode         GimpOperationNormalMode;
 typedef struct _GimpOperationDissolveMode       GimpOperationDissolveMode;
 typedef struct _GimpOperationBehindMode         GimpOperationBehindMode;
 typedef struct _GimpOperationMultiplyMode       GimpOperationMultiplyMode;
diff --git a/app/gegl/gimpoperationnormalmode.c b/app/gegl/gimpoperationnormalmode.c
new file mode 100644
index 0000000..9bd170e
--- /dev/null
+++ b/app/gegl/gimpoperationnormalmode.c
@@ -0,0 +1,159 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationnormalmode.c
+ * Copyright (C) 2012 Michael Natterer <mitch gimp org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <gegl-plugin.h>
+
+#include "gimp-gegl-types.h"
+
+#include "gimpoperationnormalmode.h"
+
+
+static gboolean gimp_operation_normal_parent_process (GeglOperation        *operation,
+                                                      GeglOperationContext *context,
+                                                      const gchar          *output_prop,
+                                                      const GeglRectangle  *result);
+static gboolean gimp_operation_normal_mode_process   (GeglOperation        *operation,
+                                                      void                 *in_buf,
+                                                      void                 *aux_buf,
+                                                      void                 *out_buf,
+                                                      glong                 samples,
+                                                      const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationNormalMode, gimp_operation_normal_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+#define parent_class gimp_operation_normal_mode_parent_class
+
+
+static void
+gimp_operation_normal_mode_class_init (GimpOperationNormalModeClass *klass)
+{
+  GeglOperationClass              *operation_class;
+  GeglOperationPointComposerClass *point_class;
+
+  operation_class = GEGL_OPERATION_CLASS (klass);
+  point_class     = GEGL_OPERATION_POINT_COMPOSER_CLASS (klass);
+
+  operation_class->name        = "gimp:normal-mode";
+  operation_class->description = "GIMP normal mode operation";
+  operation_class->process     = gimp_operation_normal_parent_process;
+
+  point_class->process         = gimp_operation_normal_mode_process;
+}
+
+static void
+gimp_operation_normal_mode_init (GimpOperationNormalMode *self)
+{
+}
+
+static gboolean
+gimp_operation_normal_parent_process (GeglOperation        *operation,
+                                      GeglOperationContext *context,
+                                      const gchar          *output_prop,
+                                      const GeglRectangle  *result)
+{
+  const GeglRectangle *in_extent  = NULL;
+  const GeglRectangle *aux_extent = NULL;
+  gpointer             input, aux;
+
+  /* get the raw values this does not increase the reference count */
+  input = gegl_operation_context_get_object (context, "input");
+  aux   = gegl_operation_context_get_object (context, "aux");
+
+  /* pass the input/aux buffers directly through if they are not
+   * overlapping
+   */
+  if (input)
+    in_extent = gegl_buffer_get_abyss (input);
+
+  if (! input ||
+      (aux && ! gegl_rectangle_intersect (NULL, in_extent, result)))
+    {
+      gegl_operation_context_take_object (context, "output",
+                                          g_object_ref (aux));
+      return TRUE;
+    }
+
+  if (aux)
+    aux_extent = gegl_buffer_get_abyss (aux);
+
+  if (! aux ||
+      (input && ! gegl_rectangle_intersect (NULL, aux_extent, result)))
+    {
+      gegl_operation_context_take_object (context, "output",
+                                          g_object_ref (input));
+      return TRUE;
+    }
+
+  /* chain up, which will create the needed buffers for our actual
+   * process function
+   */
+  return GEGL_OPERATION_CLASS (parent_class)->process (operation, context,
+                                                       output_prop, result);
+}
+
+static gboolean
+gimp_operation_normal_mode_process (GeglOperation       *operation,
+                                    void                *in_buf,
+                                    void                *aux_buf,
+                                    void                *out_buf,
+                                    glong                samples,
+                                    const GeglRectangle *roi)
+{
+  GimpOperationPointLayerMode *point = GIMP_OPERATION_POINT_LAYER_MODE (operation);
+  gfloat                      *in    = in_buf;
+  gfloat                      *aux   = aux_buf;
+  gfloat                      *out   = out_buf;
+
+  if (point->premultiplied)
+    {
+      while (samples--)
+        {
+          out[0] = aux[0] + in[0] * (1.0f - aux[3]);
+          out[1] = aux[1] + in[1] * (1.0f - aux[3]);
+          out[2] = aux[2] + in[2] * (1.0f - aux[3]);
+          out[3] = aux[3] + in[3] - aux[3] * in[3];
+
+          in  += 4;
+          aux += 4;
+          out += 4;
+        }
+    }
+  else
+    {
+      while (samples--)
+        {
+          out[RED]   = in[RED]   * (1.0 - aux[ALPHA]) + aux[RED]   * aux[ALPHA];
+          out[GREEN] = in[GREEN] * (1.0 - aux[ALPHA]) + aux[GREEN] * aux[ALPHA];
+          out[BLUE]  = in[BLUE]  * (1.0 - aux[ALPHA]) + aux[BLUE]  * aux[ALPHA];
+          out[ALPHA] = in[ALPHA] + aux[ALPHA] * (1.0 - in[ALPHA]);
+
+          in  += 4;
+          aux += 4;
+          out += 4;
+        }
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationnormalmode.h b/app/gegl/gimpoperationnormalmode.h
new file mode 100644
index 0000000..b5eadda
--- /dev/null
+++ b/app/gegl/gimpoperationnormalmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationnormalmode.h
+ * Copyright (C) 2012 Michael Natterer <mitch gimp org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GIMP_OPERATION_NORMAL_MODE_H__
+#define __GIMP_OPERATION_NORMAL_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_NORMAL_MODE            (gimp_operation_normal_mode_get_type ())
+#define GIMP_OPERATION_NORMAL_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_NORMAL_MODE, GimpOperationNormalMode))
+#define GIMP_OPERATION_NORMAL_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_NORMAL_MODE, GimpOperationNormalModeClass))
+#define GIMP_IS_OPERATION_NORMAL_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_NORMAL_MODE))
+#define GIMP_IS_OPERATION_NORMAL_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_NORMAL_MODE))
+#define GIMP_OPERATION_NORMAL_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_NORMAL_MODE, GimpOperationNormalModeClass))
+
+
+typedef struct _GimpOperationNormalModeClass GimpOperationNormalModeClass;
+
+struct _GimpOperationNormalMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationNormalModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_normal_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_NORMAL_MODE_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]