[gimp] app: add back individual operation classes for the layer modes



commit 9f6827be7c626f94148f605d85be29ad490672cc
Author: Michael Natterer <mitch gimp org>
Date:   Wed Dec 30 15:18:44 2009 +0100

    app: add back individual operation classes for the layer modes
    
    They are derived from GimpOperationPointLayerMode and are completely
    empty and unused, but can be filled with code and enabled one-by-one
    now.

 app/gegl/Makefile.am                     |   52 +++++++++++++++++-
 app/gegl/gimp-gegl-types.h               |   25 +++++++++
 app/gegl/gimp-gegl-utils.c               |   38 +++++++++++++
 app/gegl/gimp-gegl-utils.h               |    2 +
 app/gegl/gimp-gegl.c                     |   50 +++++++++++++++++
 app/gegl/gimpoperationadditionmode.c     |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationadditionmode.h     |   53 ++++++++++++++++++
 app/gegl/gimpoperationantierasemode.c    |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationantierasemode.h    |   53 ++++++++++++++++++
 app/gegl/gimpoperationbehindmode.c       |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationbehindmode.h       |   53 ++++++++++++++++++
 app/gegl/gimpoperationburnmode.c         |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationburnmode.h         |   53 ++++++++++++++++++
 app/gegl/gimpoperationcolorerasemode.c   |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationcolorerasemode.h   |   53 ++++++++++++++++++
 app/gegl/gimpoperationcolormode.c        |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationcolormode.h        |   53 ++++++++++++++++++
 app/gegl/gimpoperationdarkenonlymode.c   |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationdarkenonlymode.h   |   53 ++++++++++++++++++
 app/gegl/gimpoperationdifferencemode.c   |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationdifferencemode.h   |   53 ++++++++++++++++++
 app/gegl/gimpoperationdissolvemode.c     |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationdissolvemode.h     |   53 ++++++++++++++++++
 app/gegl/gimpoperationdividemode.c       |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationdividemode.h       |   53 ++++++++++++++++++
 app/gegl/gimpoperationdodgemode.c        |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationdodgemode.h        |   53 ++++++++++++++++++
 app/gegl/gimpoperationerasemode.c        |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationerasemode.h        |   53 ++++++++++++++++++
 app/gegl/gimpoperationgrainextractmode.c |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationgrainextractmode.h |   53 ++++++++++++++++++
 app/gegl/gimpoperationgrainmergemode.c   |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationgrainmergemode.h   |   53 ++++++++++++++++++
 app/gegl/gimpoperationhardlightmode.c    |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationhardlightmode.h    |   53 ++++++++++++++++++
 app/gegl/gimpoperationhuemode.c          |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationhuemode.h          |   53 ++++++++++++++++++
 app/gegl/gimpoperationlightenonlymode.c  |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationlightenonlymode.h  |   53 ++++++++++++++++++
 app/gegl/gimpoperationmultiplymode.c     |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationmultiplymode.h     |   53 ++++++++++++++++++
 app/gegl/gimpoperationoverlaymode.c      |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationoverlaymode.h      |   53 ++++++++++++++++++
 app/gegl/gimpoperationreplacemode.c      |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationreplacemode.h      |   53 ++++++++++++++++++
 app/gegl/gimpoperationsaturationmode.c   |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationsaturationmode.h   |   53 ++++++++++++++++++
 app/gegl/gimpoperationscreenmode.c       |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationscreenmode.h       |   53 ++++++++++++++++++
 app/gegl/gimpoperationsoftlightmode.c    |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationsoftlightmode.h    |   53 ++++++++++++++++++
 app/gegl/gimpoperationsubtractmode.c     |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationsubtractmode.h     |   53 ++++++++++++++++++
 app/gegl/gimpoperationvaluemode.c        |   88 ++++++++++++++++++++++++++++++
 app/gegl/gimpoperationvaluemode.h        |   53 ++++++++++++++++++
 55 files changed, 3691 insertions(+), 1 deletions(-)
---
diff --git a/app/gegl/Makefile.am b/app/gegl/Makefile.am
index 8e505c2..0936761 100644
--- a/app/gegl/Makefile.am
+++ b/app/gegl/Makefile.am
@@ -65,4 +65,54 @@ libappgegl_a_SOURCES = \
 	gimpoperationthreshold.h	\
 	\
 	gimpoperationpointlayermode.c	\
-	gimpoperationpointlayermode.h
+	gimpoperationpointlayermode.h	\
+	gimpoperationdissolvemode.c     \
+	gimpoperationdissolvemode.h     \
+	gimpoperationbehindmode.c       \
+	gimpoperationbehindmode.h       \
+	gimpoperationmultiplymode.c     \
+	gimpoperationmultiplymode.h     \
+	gimpoperationscreenmode.c       \
+	gimpoperationscreenmode.h       \
+	gimpoperationoverlaymode.c      \
+	gimpoperationoverlaymode.h      \
+	gimpoperationdifferencemode.c   \
+	gimpoperationdifferencemode.h   \
+	gimpoperationadditionmode.c     \
+	gimpoperationadditionmode.h     \
+	gimpoperationsubtractmode.c     \
+	gimpoperationsubtractmode.h     \
+	gimpoperationdarkenonlymode.c   \
+	gimpoperationdarkenonlymode.h   \
+	gimpoperationlightenonlymode.c  \
+	gimpoperationlightenonlymode.h  \
+	gimpoperationhuemode.c          \
+	gimpoperationhuemode.h          \
+	gimpoperationsaturationmode.c   \
+	gimpoperationsaturationmode.h   \
+	gimpoperationcolormode.c        \
+	gimpoperationcolormode.h        \
+	gimpoperationvaluemode.c        \
+	gimpoperationvaluemode.h        \
+	gimpoperationdividemode.c       \
+	gimpoperationdividemode.h       \
+	gimpoperationdodgemode.c        \
+	gimpoperationdodgemode.h        \
+	gimpoperationburnmode.c         \
+	gimpoperationburnmode.h         \
+	gimpoperationhardlightmode.c    \
+	gimpoperationhardlightmode.h    \
+	gimpoperationsoftlightmode.c    \
+	gimpoperationsoftlightmode.h    \
+	gimpoperationgrainextractmode.c \
+	gimpoperationgrainextractmode.h \
+	gimpoperationgrainmergemode.c   \
+	gimpoperationgrainmergemode.h   \
+	gimpoperationcolorerasemode.c   \
+	gimpoperationcolorerasemode.h   \
+	gimpoperationerasemode.c        \
+	gimpoperationerasemode.h        \
+	gimpoperationreplacemode.c      \
+	gimpoperationreplacemode.h      \
+	gimpoperationantierasemode.c    \
+	gimpoperationantierasemode.h
diff --git a/app/gegl/gimp-gegl-types.h b/app/gegl/gimp-gegl-types.h
index d146c50..dcf18c2 100644
--- a/app/gegl/gimp-gegl-types.h
+++ b/app/gegl/gimp-gegl-types.h
@@ -39,6 +39,31 @@ typedef struct _GimpOperationPosterize        GimpOperationPosterize;
 typedef struct _GimpOperationThreshold        GimpOperationThreshold;
 
 typedef struct _GimpOperationPointLayerMode   GimpOperationPointLayerMode;
+typedef struct _GimpOperationDissolveMode     GimpOperationDissolveMode;
+typedef struct _GimpOperationBehindMode       GimpOperationBehindMode;
+typedef struct _GimpOperationMultiplyMode     GimpOperationMultiplyMode;
+typedef struct _GimpOperationScreenMode       GimpOperationScreenMode;
+typedef struct _GimpOperationOverlayMode      GimpOperationOverlayMode;
+typedef struct _GimpOperationDifferenceMode   GimpOperationDifferenceMode;
+typedef struct _GimpOperationAdditionMode     GimpOperationAdditionMode;
+typedef struct _GimpOperationSubtractMode     GimpOperationSubtractMode;
+typedef struct _GimpOperationDarkenOnlyMode   GimpOperationDarkenOnlyMode;
+typedef struct _GimpOperationLightenOnlyMode  GimpOperationLightenOnlyMode;
+typedef struct _GimpOperationHueMode          GimpOperationHueMode;
+typedef struct _GimpOperationSaturationMode   GimpOperationSaturationMode;
+typedef struct _GimpOperationColorMode        GimpOperationColorMode;
+typedef struct _GimpOperationValueMode        GimpOperationValueMode;
+typedef struct _GimpOperationDivideMode       GimpOperationDivideMode;
+typedef struct _GimpOperationDodgeMode        GimpOperationDodgeMode;
+typedef struct _GimpOperationBurnMode         GimpOperationBurnMode;
+typedef struct _GimpOperationHardlightMode    GimpOperationHardlightMode;
+typedef struct _GimpOperationSoftlightMode    GimpOperationSoftlightMode;
+typedef struct _GimpOperationGrainExtractMode GimpOperationGrainExtractMode;
+typedef struct _GimpOperationGrainMergeMode   GimpOperationGrainMergeMode;
+typedef struct _GimpOperationColorEraseMode   GimpOperationColorEraseMode;
+typedef struct _GimpOperationEraseMode        GimpOperationEraseMode;
+typedef struct _GimpOperationReplaceMode      GimpOperationReplaceMode;
+typedef struct _GimpOperationAntiEraseMode    GimpOperationAntiEraseMode;
 
 
 /*  operation config objects  */
diff --git a/app/gegl/gimp-gegl-utils.c b/app/gegl/gimp-gegl-utils.c
index e0838d5..8b08766 100644
--- a/app/gegl/gimp-gegl-utils.c
+++ b/app/gegl/gimp-gegl-utils.c
@@ -114,3 +114,41 @@ gimp_buffer_to_tiles (GeglBuffer *buffer)
 
   return new_tiles;
 }
+
+const gchar *
+gimp_layer_mode_to_gegl_operation (GimpLayerModeEffects mode)
+{
+  switch (mode)
+    {
+    case GIMP_NORMAL_MODE:        return "gegl:over";
+    case GIMP_DISSOLVE_MODE:      return "gimp:dissolve-mode";
+    case GIMP_BEHIND_MODE:        return "gimp:behind-mode";
+    case GIMP_MULTIPLY_MODE:      return "gimp:multiply-mode";
+    case GIMP_SCREEN_MODE:        return "gimp:screen-mode";
+    case GIMP_OVERLAY_MODE:       return "gimp:overlay-mode";
+    case GIMP_DIFFERENCE_MODE:    return "gimp:difference-mode";
+    case GIMP_ADDITION_MODE:      return "gimp:addition-mode";
+    case GIMP_SUBTRACT_MODE:      return "gimp:subtract-mode";
+    case GIMP_DARKEN_ONLY_MODE:   return "gimp:darken-mode";
+    case GIMP_LIGHTEN_ONLY_MODE:  return "gimp:lighten-mode";
+    case GIMP_HUE_MODE:           return "gimp:hue-mode";
+    case GIMP_SATURATION_MODE:    return "gimp:saturation-mode";
+    case GIMP_COLOR_MODE:         return "gimp:color-mode";
+    case GIMP_VALUE_MODE:         return "gimp:value-mode";
+    case GIMP_DIVIDE_MODE:        return "gimp:divide-mode";
+    case GIMP_DODGE_MODE:         return "gimp:dodge-mode";
+    case GIMP_BURN_MODE:          return "gimp:burn-mode";
+    case GIMP_HARDLIGHT_MODE:     return "gimp:hardlight-mode";
+    case GIMP_SOFTLIGHT_MODE:     return "gimp:softlight-mode";
+    case GIMP_GRAIN_EXTRACT_MODE: return "gimp:grain-extract-mode";
+    case GIMP_GRAIN_MERGE_MODE:   return "gimp:grain-merge-mode";
+    case GIMP_COLOR_ERASE_MODE:   return "gimp:color-erase-mode";
+    case GIMP_ERASE_MODE:         return "gimp:erase-mode";
+    case GIMP_REPLACE_MODE:       return "gimp:replace-mode";
+    case GIMP_ANTI_ERASE_MODE:    return "gimp:anti-erase-mode";
+    default:
+      break;
+    }
+
+  return "gegl:over";
+}
diff --git a/app/gegl/gimp-gegl-utils.h b/app/gegl/gimp-gegl-utils.h
index 75446cb..5d5fc3b 100644
--- a/app/gegl/gimp-gegl-utils.h
+++ b/app/gegl/gimp-gegl-utils.h
@@ -27,5 +27,7 @@ const Babl  * gimp_bpp_to_babl_format           (guint                bpp,
 
 TileManager * gimp_buffer_to_tiles              (GeglBuffer          *buffer);
 
+const gchar * gimp_layer_mode_to_gegl_operation (GimpLayerModeEffects mode) G_GNUC_CONST;
+
 
 #endif /* __GIMP_GEGL_UTILS_H__ */
diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c
index feda36c..7d7b86b 100644
--- a/app/gegl/gimp-gegl.c
+++ b/app/gegl/gimp-gegl.c
@@ -43,6 +43,31 @@
 #include "gimpoperationtilesource.h"
 
 #include "gimpoperationpointlayermode.h"
+#include "gimpoperationdissolvemode.h"
+#include "gimpoperationbehindmode.h"
+#include "gimpoperationmultiplymode.h"
+#include "gimpoperationscreenmode.h"
+#include "gimpoperationoverlaymode.h"
+#include "gimpoperationdifferencemode.h"
+#include "gimpoperationadditionmode.h"
+#include "gimpoperationsubtractmode.h"
+#include "gimpoperationdarkenonlymode.h"
+#include "gimpoperationlightenonlymode.h"
+#include "gimpoperationhuemode.h"
+#include "gimpoperationsaturationmode.h"
+#include "gimpoperationcolormode.h"
+#include "gimpoperationvaluemode.h"
+#include "gimpoperationdividemode.h"
+#include "gimpoperationdodgemode.h"
+#include "gimpoperationburnmode.h"
+#include "gimpoperationhardlightmode.h"
+#include "gimpoperationsoftlightmode.h"
+#include "gimpoperationgrainextractmode.h"
+#include "gimpoperationgrainmergemode.h"
+#include "gimpoperationcolorerasemode.h"
+#include "gimpoperationerasemode.h"
+#include "gimpoperationreplacemode.h"
+#include "gimpoperationantierasemode.h"
 
 
 static void  gimp_gegl_notify_tile_cache_size (GimpBaseConfig *config);
@@ -80,6 +105,31 @@ gimp_gegl_init (Gimp *gimp)
   g_type_class_ref (GIMP_TYPE_OPERATION_THRESHOLD);
 
   g_type_class_ref (GIMP_TYPE_OPERATION_POINT_LAYER_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_DISSOLVE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_BEHIND_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_MULTIPLY_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_SCREEN_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_OVERLAY_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_DIFFERENCE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_ADDITION_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_SUBTRACT_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_HUE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_SATURATION_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_COLOR_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_VALUE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_DIVIDE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_DODGE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_BURN_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_HARDLIGHT_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_SOFTLIGHT_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_COLOR_ERASE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_ERASE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_REPLACE_MODE);
+  g_type_class_ref (GIMP_TYPE_OPERATION_ANTI_ERASE_MODE);
 }
 
 static void
diff --git a/app/gegl/gimpoperationadditionmode.c b/app/gegl/gimpoperationadditionmode.c
new file mode 100644
index 0000000..645d5e8
--- /dev/null
+++ b/app/gegl/gimpoperationadditionmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationadditionmode.c
+ * Copyright (C) 2008 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 "gimpoperationadditionmode.h"
+
+
+static gboolean gimp_operation_addition_mode_process (GeglOperation       *operation,
+                                                      void                *in_buf,
+                                                      void                *aux_buf,
+                                                      void                *out_buf,
+                                                      glong                samples,
+                                                      const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationAdditionMode, gimp_operation_addition_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_addition_mode_class_init (GimpOperationAdditionModeClass *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:addition-mode";
+  operation_class->description = "GIMP addition mode operation";
+
+  point_class->process         = gimp_operation_addition_mode_process;
+}
+
+static void
+gimp_operation_addition_mode_init (GimpOperationAdditionMode *self)
+{
+}
+
+static gboolean
+gimp_operation_addition_mode_process (GeglOperation       *operation,
+                                      void                *in_buf,
+                                      void                *aux_buf,
+                                      void                *out_buf,
+                                      glong                samples,
+                                      const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationadditionmode.h b/app/gegl/gimpoperationadditionmode.h
new file mode 100644
index 0000000..34b8dbb
--- /dev/null
+++ b/app/gegl/gimpoperationadditionmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationadditionmode.h
+ * Copyright (C) 2008 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_ADDITION_MODE_H__
+#define __GIMP_OPERATION_ADDITION_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_ADDITION_MODE            (gimp_operation_addition_mode_get_type ())
+#define GIMP_OPERATION_ADDITION_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ADDITION_MODE, GimpOperationAdditionMode))
+#define GIMP_OPERATION_ADDITION_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_ADDITION_MODE, GimpOperationAdditionModeClass))
+#define GIMP_IS_OPERATION_ADDITION_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ADDITION_MODE))
+#define GIMP_IS_OPERATION_ADDITION_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_ADDITION_MODE))
+#define GIMP_OPERATION_ADDITION_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_ADDITION_MODE, GimpOperationAdditionModeClass))
+
+
+typedef struct _GimpOperationAdditionModeClass GimpOperationAdditionModeClass;
+
+struct _GimpOperationAdditionMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationAdditionModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_addition_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_ADDITION_MODE_H__ */
diff --git a/app/gegl/gimpoperationantierasemode.c b/app/gegl/gimpoperationantierasemode.c
new file mode 100644
index 0000000..132d861
--- /dev/null
+++ b/app/gegl/gimpoperationantierasemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationantierasemode.c
+ * Copyright (C) 2008 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 "gimpoperationantierasemode.h"
+
+
+static gboolean gimp_operation_anti_erase_mode_process (GeglOperation       *operation,
+                                                        void                *in_buf,
+                                                        void                *aux_buf,
+                                                        void                *out_buf,
+                                                        glong                samples,
+                                                        const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationAntiEraseMode, gimp_operation_anti_erase_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_anti_erase_mode_class_init (GimpOperationAntiEraseModeClass *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:anti-erase-mode";
+  operation_class->description = "GIMP anti erase mode operation";
+
+  point_class->process         = gimp_operation_anti_erase_mode_process;
+}
+
+static void
+gimp_operation_anti_erase_mode_init (GimpOperationAntiEraseMode *self)
+{
+}
+
+static gboolean
+gimp_operation_anti_erase_mode_process (GeglOperation       *operation,
+                                        void                *in_buf,
+                                        void                *aux_buf,
+                                        void                *out_buf,
+                                        glong                samples,
+                                        const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationantierasemode.h b/app/gegl/gimpoperationantierasemode.h
new file mode 100644
index 0000000..fafdff7
--- /dev/null
+++ b/app/gegl/gimpoperationantierasemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationanti_erasemode.h
+ * Copyright (C) 2008 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_ANTI_ERASE_MODE_H__
+#define __GIMP_OPERATION_ANTI_ERASE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_ANTI_ERASE_MODE            (gimp_operation_anti_erase_mode_get_type ())
+#define GIMP_OPERATION_ANTI_ERASE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseMode))
+#define GIMP_OPERATION_ANTI_ERASE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseModeClass))
+#define GIMP_IS_OPERATION_ANTI_ERASE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ANTI_ERASE_MODE))
+#define GIMP_IS_OPERATION_ANTI_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_ANTI_ERASE_MODE))
+#define GIMP_OPERATION_ANTI_ERASE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_ANTI_ERASE_MODE, GimpOperationAntiEraseModeClass))
+
+
+typedef struct _GimpOperationAntiEraseModeClass GimpOperationAntiEraseModeClass;
+
+struct _GimpOperationAntiEraseMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationAntiEraseModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_anti_erase_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_ANTI_ERASE_MODE_H__ */
diff --git a/app/gegl/gimpoperationbehindmode.c b/app/gegl/gimpoperationbehindmode.c
new file mode 100644
index 0000000..cf97a07
--- /dev/null
+++ b/app/gegl/gimpoperationbehindmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationbehindmode.c
+ * Copyright (C) 2008 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 "gimpoperationbehindmode.h"
+
+
+static gboolean gimp_operation_behind_mode_process (GeglOperation       *operation,
+                                                    void                *in_buf,
+                                                    void                *aux_buf,
+                                                    void                *out_buf,
+                                                    glong                samples,
+                                                    const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationBehindMode, gimp_operation_behind_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_behind_mode_class_init (GimpOperationBehindModeClass *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:behind-mode";
+  operation_class->description = "GIMP behind mode operation";
+
+  point_class->process         = gimp_operation_behind_mode_process;
+}
+
+static void
+gimp_operation_behind_mode_init (GimpOperationBehindMode *self)
+{
+}
+
+static gboolean
+gimp_operation_behind_mode_process (GeglOperation       *operation,
+                                    void                *in_buf,
+                                    void                *aux_buf,
+                                    void                *out_buf,
+                                    glong                samples,
+                                    const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationbehindmode.h b/app/gegl/gimpoperationbehindmode.h
new file mode 100644
index 0000000..a039bb8
--- /dev/null
+++ b/app/gegl/gimpoperationbehindmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationbehindmode.h
+ * Copyright (C) 2008 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_BEHIND_MODE_H__
+#define __GIMP_OPERATION_BEHIND_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_BEHIND_MODE            (gimp_operation_behind_mode_get_type ())
+#define GIMP_OPERATION_BEHIND_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_BEHIND_MODE, GimpOperationBehindMode))
+#define GIMP_OPERATION_BEHIND_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_BEHIND_MODE, GimpOperationBehindModeClass))
+#define GIMP_IS_OPERATION_BEHIND_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_BEHIND_MODE))
+#define GIMP_IS_OPERATION_BEHIND_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_BEHIND_MODE))
+#define GIMP_OPERATION_BEHIND_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_BEHIND_MODE, GimpOperationBehindModeClass))
+
+
+typedef struct _GimpOperationBehindModeClass GimpOperationBehindModeClass;
+
+struct _GimpOperationBehindMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationBehindModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_behind_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_BEHIND_MODE_H__ */
diff --git a/app/gegl/gimpoperationburnmode.c b/app/gegl/gimpoperationburnmode.c
new file mode 100644
index 0000000..6325ab4
--- /dev/null
+++ b/app/gegl/gimpoperationburnmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationburnmode.c
+ * Copyright (C) 2008 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 "gimpoperationburnmode.h"
+
+
+static gboolean gimp_operation_burn_mode_process (GeglOperation       *operation,
+                                                  void                *in_buf,
+                                                  void                *aux_buf,
+                                                  void                *out_buf,
+                                                  glong                samples,
+                                                  const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationBurnMode, gimp_operation_burn_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_burn_mode_class_init (GimpOperationBurnModeClass *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:burn-mode";
+  operation_class->description = "GIMP burn mode operation";
+
+  point_class->process         = gimp_operation_burn_mode_process;
+}
+
+static void
+gimp_operation_burn_mode_init (GimpOperationBurnMode *self)
+{
+}
+
+static gboolean
+gimp_operation_burn_mode_process (GeglOperation       *operation,
+                                  void                *in_buf,
+                                  void                *aux_buf,
+                                  void                *out_buf,
+                                  glong                samples,
+                                  const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationburnmode.h b/app/gegl/gimpoperationburnmode.h
new file mode 100644
index 0000000..c9c845a
--- /dev/null
+++ b/app/gegl/gimpoperationburnmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationburnmode.h
+ * Copyright (C) 2008 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_BURN_MODE_H__
+#define __GIMP_OPERATION_BURN_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_BURN_MODE            (gimp_operation_burn_mode_get_type ())
+#define GIMP_OPERATION_BURN_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_BURN_MODE, GimpOperationBurnMode))
+#define GIMP_OPERATION_BURN_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_BURN_MODE, GimpOperationBurnModeClass))
+#define GIMP_IS_OPERATION_BURN_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_BURN_MODE))
+#define GIMP_IS_OPERATION_BURN_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_BURN_MODE))
+#define GIMP_OPERATION_BURN_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_BURN_MODE, GimpOperationBurnModeClass))
+
+
+typedef struct _GimpOperationBurnModeClass GimpOperationBurnModeClass;
+
+struct _GimpOperationBurnMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationBurnModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_burn_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_BURN_MODE_H__ */
diff --git a/app/gegl/gimpoperationcolorerasemode.c b/app/gegl/gimpoperationcolorerasemode.c
new file mode 100644
index 0000000..f1cf0ab
--- /dev/null
+++ b/app/gegl/gimpoperationcolorerasemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationcolorerasemode.c
+ * Copyright (C) 2008 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 "gimpoperationcolorerasemode.h"
+
+
+static gboolean gimp_operation_color_erase_mode_process (GeglOperation       *operation,
+                                                         void                *in_buf,
+                                                         void                *aux_buf,
+                                                         void                *out_buf,
+                                                         glong                samples,
+                                                         const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationColorEraseMode, gimp_operation_color_erase_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_color_erase_mode_class_init (GimpOperationColorEraseModeClass *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:color-erase-mode";
+  operation_class->description = "GIMP color erase mode operation";
+
+  point_class->process         = gimp_operation_color_erase_mode_process;
+}
+
+static void
+gimp_operation_color_erase_mode_init (GimpOperationColorEraseMode *self)
+{
+}
+
+static gboolean
+gimp_operation_color_erase_mode_process (GeglOperation       *operation,
+                                         void                *in_buf,
+                                         void                *aux_buf,
+                                         void                *out_buf,
+                                         glong                samples,
+                                         const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationcolorerasemode.h b/app/gegl/gimpoperationcolorerasemode.h
new file mode 100644
index 0000000..887eca3
--- /dev/null
+++ b/app/gegl/gimpoperationcolorerasemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationcolor_erasemode.h
+ * Copyright (C) 2008 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_COLOR_ERASE_MODE_H__
+#define __GIMP_OPERATION_COLOR_ERASE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_COLOR_ERASE_MODE            (gimp_operation_color_erase_mode_get_type ())
+#define GIMP_OPERATION_COLOR_ERASE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_COLOR_ERASE_MODE, GimpOperationColorEraseMode))
+#define GIMP_OPERATION_COLOR_ERASE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_COLOR_ERASE_MODE, GimpOperationColorEraseModeClass))
+#define GIMP_IS_OPERATION_COLOR_ERASE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_COLOR_ERASE_MODE))
+#define GIMP_IS_OPERATION_COLOR_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_COLOR_ERASE_MODE))
+#define GIMP_OPERATION_COLOR_ERASE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_COLOR_ERASE_MODE, GimpOperationColorEraseModeClass))
+
+
+typedef struct _GimpOperationColorEraseModeClass GimpOperationColorEraseModeClass;
+
+struct _GimpOperationColorEraseMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationColorEraseModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_color_erase_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_COLOR_ERASE_MODE_H__ */
diff --git a/app/gegl/gimpoperationcolormode.c b/app/gegl/gimpoperationcolormode.c
new file mode 100644
index 0000000..26e5d0c
--- /dev/null
+++ b/app/gegl/gimpoperationcolormode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationcolormode.c
+ * Copyright (C) 2008 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 "gimpoperationcolormode.h"
+
+
+static gboolean gimp_operation_color_mode_process (GeglOperation       *operation,
+                                                   void                *in_buf,
+                                                   void                *aux_buf,
+                                                   void                *out_buf,
+                                                   glong                samples,
+                                                   const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationColorMode, gimp_operation_color_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_color_mode_class_init (GimpOperationColorModeClass *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:color-mode";
+  operation_class->description = "GIMP color mode operation";
+
+  point_class->process         = gimp_operation_color_mode_process;
+}
+
+static void
+gimp_operation_color_mode_init (GimpOperationColorMode *self)
+{
+}
+
+static gboolean
+gimp_operation_color_mode_process (GeglOperation       *operation,
+                                   void                *in_buf,
+                                   void                *aux_buf,
+                                   void                *out_buf,
+                                   glong                samples,
+                                   const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationcolormode.h b/app/gegl/gimpoperationcolormode.h
new file mode 100644
index 0000000..4c29c2a
--- /dev/null
+++ b/app/gegl/gimpoperationcolormode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationcolormode.h
+ * Copyright (C) 2008 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_COLOR_MODE_H__
+#define __GIMP_OPERATION_COLOR_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_COLOR_MODE            (gimp_operation_color_mode_get_type ())
+#define GIMP_OPERATION_COLOR_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_COLOR_MODE, GimpOperationColorMode))
+#define GIMP_OPERATION_COLOR_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_COLOR_MODE, GimpOperationColorModeClass))
+#define GIMP_IS_OPERATION_COLOR_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_COLOR_MODE))
+#define GIMP_IS_OPERATION_COLOR_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_COLOR_MODE))
+#define GIMP_OPERATION_COLOR_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_COLOR_MODE, GimpOperationColorModeClass))
+
+
+typedef struct _GimpOperationColorModeClass GimpOperationColorModeClass;
+
+struct _GimpOperationColorMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationColorModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_color_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_COLOR_MODE_H__ */
diff --git a/app/gegl/gimpoperationdarkenonlymode.c b/app/gegl/gimpoperationdarkenonlymode.c
new file mode 100644
index 0000000..acd9265
--- /dev/null
+++ b/app/gegl/gimpoperationdarkenonlymode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdarkenonlymode.c
+ * Copyright (C) 2008 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 "gimpoperationdarkenonlymode.h"
+
+
+static gboolean gimp_operation_darken_only_mode_process (GeglOperation       *operation,
+                                                         void                *in_buf,
+                                                         void                *aux_buf,
+                                                         void                *out_buf,
+                                                         glong                samples,
+                                                         const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationDarkenOnlyMode, gimp_operation_darken_only_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_darken_only_mode_class_init (GimpOperationDarkenOnlyModeClass *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:darken-only-mode";
+  operation_class->description = "GIMP darken only mode operation";
+
+  point_class->process         = gimp_operation_darken_only_mode_process;
+}
+
+static void
+gimp_operation_darken_only_mode_init (GimpOperationDarkenOnlyMode *self)
+{
+}
+
+static gboolean
+gimp_operation_darken_only_mode_process (GeglOperation       *operation,
+                                         void                *in_buf,
+                                         void                *aux_buf,
+                                         void                *out_buf,
+                                         glong                samples,
+                                         const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationdarkenonlymode.h b/app/gegl/gimpoperationdarkenonlymode.h
new file mode 100644
index 0000000..54a982c
--- /dev/null
+++ b/app/gegl/gimpoperationdarkenonlymode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdarken_onlymode.h
+ * Copyright (C) 2008 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_DARKEN_ONLY_MODE_H__
+#define __GIMP_OPERATION_DARKEN_ONLY_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE            (gimp_operation_darken_only_mode_get_type ())
+#define GIMP_OPERATION_DARKEN_ONLY_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE, GimpOperationDarkenOnlyMode))
+#define GIMP_OPERATION_DARKEN_ONLY_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE, GimpOperationDarkenOnlyModeClass))
+#define GIMP_IS_OPERATION_DARKEN_ONLY_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE))
+#define GIMP_IS_OPERATION_DARKEN_ONLY_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE))
+#define GIMP_OPERATION_DARKEN_ONLY_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_DARKEN_ONLY_MODE, GimpOperationDarkenOnlyModeClass))
+
+
+typedef struct _GimpOperationDarkenOnlyModeClass GimpOperationDarkenOnlyModeClass;
+
+struct _GimpOperationDarkenOnlyMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationDarkenOnlyModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_darken_only_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_DARKEN_ONLY_MODE_H__ */
diff --git a/app/gegl/gimpoperationdifferencemode.c b/app/gegl/gimpoperationdifferencemode.c
new file mode 100644
index 0000000..b6c7ff1
--- /dev/null
+++ b/app/gegl/gimpoperationdifferencemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdifferencemode.c
+ * Copyright (C) 2008 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 "gimpoperationdifferencemode.h"
+
+
+static gboolean gimp_operation_difference_mode_process (GeglOperation       *operation,
+                                                        void                *in_buf,
+                                                        void                *aux_buf,
+                                                        void                *out_buf,
+                                                        glong                samples,
+                                                        const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationDifferenceMode, gimp_operation_difference_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_difference_mode_class_init (GimpOperationDifferenceModeClass *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:difference-mode";
+  operation_class->description = "GIMP difference mode operation";
+
+  point_class->process         = gimp_operation_difference_mode_process;
+}
+
+static void
+gimp_operation_difference_mode_init (GimpOperationDifferenceMode *self)
+{
+}
+
+static gboolean
+gimp_operation_difference_mode_process (GeglOperation       *operation,
+                                        void                *in_buf,
+                                        void                *aux_buf,
+                                        void                *out_buf,
+                                        glong                samples,
+                                        const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationdifferencemode.h b/app/gegl/gimpoperationdifferencemode.h
new file mode 100644
index 0000000..f6af20d
--- /dev/null
+++ b/app/gegl/gimpoperationdifferencemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdifferencemode.h
+ * Copyright (C) 2008 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_DIFFERENCE_MODE_H__
+#define __GIMP_OPERATION_DIFFERENCE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_DIFFERENCE_MODE            (gimp_operation_difference_mode_get_type ())
+#define GIMP_OPERATION_DIFFERENCE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_DIFFERENCE_MODE, GimpOperationDifferenceMode))
+#define GIMP_OPERATION_DIFFERENCE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_DIFFERENCE_MODE, GimpOperationDifferenceModeClass))
+#define GIMP_IS_OPERATION_DIFFERENCE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_DIFFERENCE_MODE))
+#define GIMP_IS_OPERATION_DIFFERENCE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_DIFFERENCE_MODE))
+#define GIMP_OPERATION_DIFFERENCE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_DIFFERENCE_MODE, GimpOperationDifferenceModeClass))
+
+
+typedef struct _GimpOperationDifferenceModeClass GimpOperationDifferenceModeClass;
+
+struct _GimpOperationDifferenceMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationDifferenceModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_difference_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_DIFFERENCE_MODE_H__ */
diff --git a/app/gegl/gimpoperationdissolvemode.c b/app/gegl/gimpoperationdissolvemode.c
new file mode 100644
index 0000000..5cb61bf
--- /dev/null
+++ b/app/gegl/gimpoperationdissolvemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdissolvemode.c
+ * Copyright (C) 2008 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 "gimpoperationdissolvemode.h"
+
+
+static gboolean gimp_operation_dissolve_mode_process (GeglOperation       *operation,
+                                                      void                *in_buf,
+                                                      void                *aux_buf,
+                                                      void                *out_buf,
+                                                      glong                samples,
+                                                      const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationDissolveMode, gimp_operation_dissolve_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_dissolve_mode_class_init (GimpOperationDissolveModeClass *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:dissolve-mode";
+  operation_class->description = "GIMP dissolve mode operation";
+
+  point_class->process         = gimp_operation_dissolve_mode_process;
+}
+
+static void
+gimp_operation_dissolve_mode_init (GimpOperationDissolveMode *self)
+{
+}
+
+static gboolean
+gimp_operation_dissolve_mode_process (GeglOperation       *operation,
+                                      void                *in_buf,
+                                      void                *aux_buf,
+                                      void                *out_buf,
+                                      glong                samples,
+                                      const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationdissolvemode.h b/app/gegl/gimpoperationdissolvemode.h
new file mode 100644
index 0000000..0979f0a
--- /dev/null
+++ b/app/gegl/gimpoperationdissolvemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdissolvemode.h
+ * Copyright (C) 2008 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_DISSOLVE_MODE_H__
+#define __GIMP_OPERATION_DISSOLVE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_DISSOLVE_MODE            (gimp_operation_dissolve_mode_get_type ())
+#define GIMP_OPERATION_DISSOLVE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_DISSOLVE_MODE, GimpOperationDissolveMode))
+#define GIMP_OPERATION_DISSOLVE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_DISSOLVE_MODE, GimpOperationDissolveModeClass))
+#define GIMP_IS_OPERATION_DISSOLVE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_DISSOLVE_MODE))
+#define GIMP_IS_OPERATION_DISSOLVE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_DISSOLVE_MODE))
+#define GIMP_OPERATION_DISSOLVE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_DISSOLVE_MODE, GimpOperationDissolveModeClass))
+
+
+typedef struct _GimpOperationDissolveModeClass GimpOperationDissolveModeClass;
+
+struct _GimpOperationDissolveMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationDissolveModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_dissolve_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_DISSOLVE_MODE_H__ */
diff --git a/app/gegl/gimpoperationdividemode.c b/app/gegl/gimpoperationdividemode.c
new file mode 100644
index 0000000..0f578f1
--- /dev/null
+++ b/app/gegl/gimpoperationdividemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdividemode.c
+ * Copyright (C) 2008 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 "gimpoperationdividemode.h"
+
+
+static gboolean gimp_operation_divide_mode_process (GeglOperation       *operation,
+                                                    void                *in_buf,
+                                                    void                *aux_buf,
+                                                    void                *out_buf,
+                                                    glong                samples,
+                                                    const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationDivideMode, gimp_operation_divide_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_divide_mode_class_init (GimpOperationDivideModeClass *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:divide-mode";
+  operation_class->description = "GIMP divide mode operation";
+
+  point_class->process         = gimp_operation_divide_mode_process;
+}
+
+static void
+gimp_operation_divide_mode_init (GimpOperationDivideMode *self)
+{
+}
+
+static gboolean
+gimp_operation_divide_mode_process (GeglOperation       *operation,
+                                    void                *in_buf,
+                                    void                *aux_buf,
+                                    void                *out_buf,
+                                    glong                samples,
+                                    const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationdividemode.h b/app/gegl/gimpoperationdividemode.h
new file mode 100644
index 0000000..f1c23fd
--- /dev/null
+++ b/app/gegl/gimpoperationdividemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdividemode.h
+ * Copyright (C) 2008 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_DIVIDE_MODE_H__
+#define __GIMP_OPERATION_DIVIDE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_DIVIDE_MODE            (gimp_operation_divide_mode_get_type ())
+#define GIMP_OPERATION_DIVIDE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_DIVIDE_MODE, GimpOperationDivideMode))
+#define GIMP_OPERATION_DIVIDE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_DIVIDE_MODE, GimpOperationDivideModeClass))
+#define GIMP_IS_OPERATION_DIVIDE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_DIVIDE_MODE))
+#define GIMP_IS_OPERATION_DIVIDE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_DIVIDE_MODE))
+#define GIMP_OPERATION_DIVIDE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_DIVIDE_MODE, GimpOperationDivideModeClass))
+
+
+typedef struct _GimpOperationDivideModeClass GimpOperationDivideModeClass;
+
+struct _GimpOperationDivideMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationDivideModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_divide_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_DIVIDE_MODE_H__ */
diff --git a/app/gegl/gimpoperationdodgemode.c b/app/gegl/gimpoperationdodgemode.c
new file mode 100644
index 0000000..92dde2d
--- /dev/null
+++ b/app/gegl/gimpoperationdodgemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdodgemode.c
+ * Copyright (C) 2008 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 "gimpoperationdodgemode.h"
+
+
+static gboolean gimp_operation_dodge_mode_process (GeglOperation       *operation,
+                                                   void                *in_buf,
+                                                   void                *aux_buf,
+                                                   void                *out_buf,
+                                                   glong                samples,
+                                                   const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationDodgeMode, gimp_operation_dodge_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_dodge_mode_class_init (GimpOperationDodgeModeClass *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:dodge-mode";
+  operation_class->description = "GIMP dodge mode operation";
+
+  point_class->process         = gimp_operation_dodge_mode_process;
+}
+
+static void
+gimp_operation_dodge_mode_init (GimpOperationDodgeMode *self)
+{
+}
+
+static gboolean
+gimp_operation_dodge_mode_process (GeglOperation       *operation,
+                                   void                *in_buf,
+                                   void                *aux_buf,
+                                   void                *out_buf,
+                                   glong                samples,
+                                   const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationdodgemode.h b/app/gegl/gimpoperationdodgemode.h
new file mode 100644
index 0000000..0ffa35f
--- /dev/null
+++ b/app/gegl/gimpoperationdodgemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationdodgemode.h
+ * Copyright (C) 2008 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_DODGE_MODE_H__
+#define __GIMP_OPERATION_DODGE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_DODGE_MODE            (gimp_operation_dodge_mode_get_type ())
+#define GIMP_OPERATION_DODGE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_DODGE_MODE, GimpOperationDodgeMode))
+#define GIMP_OPERATION_DODGE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_DODGE_MODE, GimpOperationDodgeModeClass))
+#define GIMP_IS_OPERATION_DODGE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_DODGE_MODE))
+#define GIMP_IS_OPERATION_DODGE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_DODGE_MODE))
+#define GIMP_OPERATION_DODGE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_DODGE_MODE, GimpOperationDodgeModeClass))
+
+
+typedef struct _GimpOperationDodgeModeClass GimpOperationDodgeModeClass;
+
+struct _GimpOperationDodgeMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationDodgeModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_dodge_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_DODGE_MODE_H__ */
diff --git a/app/gegl/gimpoperationerasemode.c b/app/gegl/gimpoperationerasemode.c
new file mode 100644
index 0000000..71dff2b
--- /dev/null
+++ b/app/gegl/gimpoperationerasemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationerasemode.c
+ * Copyright (C) 2008 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 "gimpoperationerasemode.h"
+
+
+static gboolean gimp_operation_erase_mode_process (GeglOperation       *operation,
+                                                   void                *in_buf,
+                                                   void                *aux_buf,
+                                                   void                *out_buf,
+                                                   glong                samples,
+                                                   const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationEraseMode, gimp_operation_erase_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_erase_mode_class_init (GimpOperationEraseModeClass *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:erase-mode";
+  operation_class->description = "GIMP erase mode operation";
+
+  point_class->process         = gimp_operation_erase_mode_process;
+}
+
+static void
+gimp_operation_erase_mode_init (GimpOperationEraseMode *self)
+{
+}
+
+static gboolean
+gimp_operation_erase_mode_process (GeglOperation       *operation,
+                                   void                *in_buf,
+                                   void                *aux_buf,
+                                   void                *out_buf,
+                                   glong                samples,
+                                   const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationerasemode.h b/app/gegl/gimpoperationerasemode.h
new file mode 100644
index 0000000..a851ace
--- /dev/null
+++ b/app/gegl/gimpoperationerasemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationerasemode.h
+ * Copyright (C) 2008 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_ERASE_MODE_H__
+#define __GIMP_OPERATION_ERASE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_ERASE_MODE            (gimp_operation_erase_mode_get_type ())
+#define GIMP_OPERATION_ERASE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseMode))
+#define GIMP_OPERATION_ERASE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseModeClass))
+#define GIMP_IS_OPERATION_ERASE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_ERASE_MODE))
+#define GIMP_IS_OPERATION_ERASE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_ERASE_MODE))
+#define GIMP_OPERATION_ERASE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_ERASE_MODE, GimpOperationEraseModeClass))
+
+
+typedef struct _GimpOperationEraseModeClass GimpOperationEraseModeClass;
+
+struct _GimpOperationEraseMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationEraseModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_erase_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_ERASE_MODE_H__ */
diff --git a/app/gegl/gimpoperationgrainextractmode.c b/app/gegl/gimpoperationgrainextractmode.c
new file mode 100644
index 0000000..e7d2e23
--- /dev/null
+++ b/app/gegl/gimpoperationgrainextractmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationgrainextractmode.c
+ * Copyright (C) 2008 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 "gimpoperationgrainextractmode.h"
+
+
+static gboolean gimp_operation_grain_extract_mode_process (GeglOperation       *operation,
+                                                           void                *in_buf,
+                                                           void                *aux_buf,
+                                                           void                *out_buf,
+                                                           glong                samples,
+                                                           const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationGrainExtractMode, gimp_operation_grain_extract_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_grain_extract_mode_class_init (GimpOperationGrainExtractModeClass *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:grain-extract-mode";
+  operation_class->description = "GIMP grain extract mode operation";
+
+  point_class->process         = gimp_operation_grain_extract_mode_process;
+}
+
+static void
+gimp_operation_grain_extract_mode_init (GimpOperationGrainExtractMode *self)
+{
+}
+
+static gboolean
+gimp_operation_grain_extract_mode_process (GeglOperation       *operation,
+                                           void                *in_buf,
+                                           void                *aux_buf,
+                                           void                *out_buf,
+                                           glong                samples,
+                                           const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationgrainextractmode.h b/app/gegl/gimpoperationgrainextractmode.h
new file mode 100644
index 0000000..5ad1fea
--- /dev/null
+++ b/app/gegl/gimpoperationgrainextractmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationgrain_extractmode.h
+ * Copyright (C) 2008 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_GRAIN_EXTRACT_MODE_H__
+#define __GIMP_OPERATION_GRAIN_EXTRACT_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE            (gimp_operation_grain_extract_mode_get_type ())
+#define GIMP_OPERATION_GRAIN_EXTRACT_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE, GimpOperationGrainExtractMode))
+#define GIMP_OPERATION_GRAIN_EXTRACT_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE, GimpOperationGrainExtractModeClass))
+#define GIMP_IS_OPERATION_GRAIN_EXTRACT_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE))
+#define GIMP_IS_OPERATION_GRAIN_EXTRACT_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE))
+#define GIMP_OPERATION_GRAIN_EXTRACT_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_GRAIN_EXTRACT_MODE, GimpOperationGrainExtractModeClass))
+
+
+typedef struct _GimpOperationGrainExtractModeClass GimpOperationGrainExtractModeClass;
+
+struct _GimpOperationGrainExtractMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationGrainExtractModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_grain_extract_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_GRAIN_EXTRACT_MODE_H__ */
diff --git a/app/gegl/gimpoperationgrainmergemode.c b/app/gegl/gimpoperationgrainmergemode.c
new file mode 100644
index 0000000..bef4b4b
--- /dev/null
+++ b/app/gegl/gimpoperationgrainmergemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationgrainmergemode.c
+ * Copyright (C) 2008 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 "gimpoperationgrainmergemode.h"
+
+
+static gboolean gimp_operation_grain_merge_mode_process (GeglOperation       *operation,
+                                                         void                *in_buf,
+                                                         void                *aux_buf,
+                                                         void                *out_buf,
+                                                         glong                samples,
+                                                         const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationGrainMergeMode, gimp_operation_grain_merge_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_grain_merge_mode_class_init (GimpOperationGrainMergeModeClass *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:grain-merge-mode";
+  operation_class->description = "GIMP grain merge mode operation";
+
+  point_class->process         = gimp_operation_grain_merge_mode_process;
+}
+
+static void
+gimp_operation_grain_merge_mode_init (GimpOperationGrainMergeMode *self)
+{
+}
+
+static gboolean
+gimp_operation_grain_merge_mode_process (GeglOperation       *operation,
+                                         void                *in_buf,
+                                         void                *aux_buf,
+                                         void                *out_buf,
+                                         glong                samples,
+                                         const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationgrainmergemode.h b/app/gegl/gimpoperationgrainmergemode.h
new file mode 100644
index 0000000..e77c72c
--- /dev/null
+++ b/app/gegl/gimpoperationgrainmergemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationgrain_mergemode.h
+ * Copyright (C) 2008 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_GRAIN_MERGE_MODE_H__
+#define __GIMP_OPERATION_GRAIN_MERGE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE            (gimp_operation_grain_merge_mode_get_type ())
+#define GIMP_OPERATION_GRAIN_MERGE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE, GimpOperationGrainMergeMode))
+#define GIMP_OPERATION_GRAIN_MERGE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE, GimpOperationGrainMergeModeClass))
+#define GIMP_IS_OPERATION_GRAIN_MERGE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE))
+#define GIMP_IS_OPERATION_GRAIN_MERGE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE))
+#define GIMP_OPERATION_GRAIN_MERGE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_GRAIN_MERGE_MODE, GimpOperationGrainMergeModeClass))
+
+
+typedef struct _GimpOperationGrainMergeModeClass GimpOperationGrainMergeModeClass;
+
+struct _GimpOperationGrainMergeMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationGrainMergeModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_grain_merge_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_GRAIN_MERGE_MODE_H__ */
diff --git a/app/gegl/gimpoperationhardlightmode.c b/app/gegl/gimpoperationhardlightmode.c
new file mode 100644
index 0000000..f02bfb8
--- /dev/null
+++ b/app/gegl/gimpoperationhardlightmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationhardlightmode.c
+ * Copyright (C) 2008 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 "gimpoperationhardlightmode.h"
+
+
+static gboolean gimp_operation_hardlight_mode_process (GeglOperation       *operation,
+                                                       void                *in_buf,
+                                                       void                *aux_buf,
+                                                       void                *out_buf,
+                                                       glong                samples,
+                                                       const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationHardlightMode, gimp_operation_hardlight_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_hardlight_mode_class_init (GimpOperationHardlightModeClass *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:hardlight-mode";
+  operation_class->description = "GIMP hardlight mode operation";
+
+  point_class->process         = gimp_operation_hardlight_mode_process;
+}
+
+static void
+gimp_operation_hardlight_mode_init (GimpOperationHardlightMode *self)
+{
+}
+
+static gboolean
+gimp_operation_hardlight_mode_process (GeglOperation       *operation,
+                                       void                *in_buf,
+                                       void                *aux_buf,
+                                       void                *out_buf,
+                                       glong                samples,
+                                       const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationhardlightmode.h b/app/gegl/gimpoperationhardlightmode.h
new file mode 100644
index 0000000..ca09c10
--- /dev/null
+++ b/app/gegl/gimpoperationhardlightmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationhardlightmode.h
+ * Copyright (C) 2008 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_HARDLIGHT_MODE_H__
+#define __GIMP_OPERATION_HARDLIGHT_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_HARDLIGHT_MODE            (gimp_operation_hardlight_mode_get_type ())
+#define GIMP_OPERATION_HARDLIGHT_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_HARDLIGHT_MODE, GimpOperationHardlightMode))
+#define GIMP_OPERATION_HARDLIGHT_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_HARDLIGHT_MODE, GimpOperationHardlightModeClass))
+#define GIMP_IS_OPERATION_HARDLIGHT_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_HARDLIGHT_MODE))
+#define GIMP_IS_OPERATION_HARDLIGHT_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_HARDLIGHT_MODE))
+#define GIMP_OPERATION_HARDLIGHT_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_HARDLIGHT_MODE, GimpOperationHardlightModeClass))
+
+
+typedef struct _GimpOperationHardlightModeClass GimpOperationHardlightModeClass;
+
+struct _GimpOperationHardlightMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationHardlightModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_hardlight_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_HARDLIGHT_MODE_H__ */
diff --git a/app/gegl/gimpoperationhuemode.c b/app/gegl/gimpoperationhuemode.c
new file mode 100644
index 0000000..8356195
--- /dev/null
+++ b/app/gegl/gimpoperationhuemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationhuemode.c
+ * Copyright (C) 2008 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 "gimpoperationhuemode.h"
+
+
+static gboolean gimp_operation_hue_mode_process (GeglOperation       *operation,
+                                                 void                *in_buf,
+                                                 void                *aux_buf,
+                                                 void                *out_buf,
+                                                 glong                samples,
+                                                 const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationHueMode, gimp_operation_hue_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_hue_mode_class_init (GimpOperationHueModeClass *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:hue-mode";
+  operation_class->description = "GIMP hue mode operation";
+
+  point_class->process         = gimp_operation_hue_mode_process;
+}
+
+static void
+gimp_operation_hue_mode_init (GimpOperationHueMode *self)
+{
+}
+
+static gboolean
+gimp_operation_hue_mode_process (GeglOperation       *operation,
+                                 void                *in_buf,
+                                 void                *aux_buf,
+                                 void                *out_buf,
+                                 glong                samples,
+                                 const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationhuemode.h b/app/gegl/gimpoperationhuemode.h
new file mode 100644
index 0000000..d775aa6
--- /dev/null
+++ b/app/gegl/gimpoperationhuemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationhuemode.h
+ * Copyright (C) 2008 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_HUE_MODE_H__
+#define __GIMP_OPERATION_HUE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_HUE_MODE            (gimp_operation_hue_mode_get_type ())
+#define GIMP_OPERATION_HUE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_HUE_MODE, GimpOperationHueMode))
+#define GIMP_OPERATION_HUE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_HUE_MODE, GimpOperationHueModeClass))
+#define GIMP_IS_OPERATION_HUE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_HUE_MODE))
+#define GIMP_IS_OPERATION_HUE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_HUE_MODE))
+#define GIMP_OPERATION_HUE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_HUE_MODE, GimpOperationHueModeClass))
+
+
+typedef struct _GimpOperationHueModeClass GimpOperationHueModeClass;
+
+struct _GimpOperationHueMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationHueModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_hue_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_HUE_MODE_H__ */
diff --git a/app/gegl/gimpoperationlightenonlymode.c b/app/gegl/gimpoperationlightenonlymode.c
new file mode 100644
index 0000000..26a8d0e
--- /dev/null
+++ b/app/gegl/gimpoperationlightenonlymode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationlightenonlymode.c
+ * Copyright (C) 2008 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 "gimpoperationlightenonlymode.h"
+
+
+static gboolean gimp_operation_lighten_only_mode_process (GeglOperation       *operation,
+                                                          void                *in_buf,
+                                                          void                *aux_buf,
+                                                          void                *out_buf,
+                                                          glong                samples,
+                                                          const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationLightenOnlyMode, gimp_operation_lighten_only_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_lighten_only_mode_class_init (GimpOperationLightenOnlyModeClass *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:lighten-only-mode";
+  operation_class->description = "GIMP lighten only mode operation";
+
+  point_class->process         = gimp_operation_lighten_only_mode_process;
+}
+
+static void
+gimp_operation_lighten_only_mode_init (GimpOperationLightenOnlyMode *self)
+{
+}
+
+static gboolean
+gimp_operation_lighten_only_mode_process (GeglOperation       *operation,
+                                          void                *in_buf,
+                                          void                *aux_buf,
+                                          void                *out_buf,
+                                          glong                samples,
+                                          const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationlightenonlymode.h b/app/gegl/gimpoperationlightenonlymode.h
new file mode 100644
index 0000000..4bbb990
--- /dev/null
+++ b/app/gegl/gimpoperationlightenonlymode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationlighten_onlymode.h
+ * Copyright (C) 2008 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_LIGHTEN_ONLY_MODE_H__
+#define __GIMP_OPERATION_LIGHTEN_ONLY_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE            (gimp_operation_lighten_only_mode_get_type ())
+#define GIMP_OPERATION_LIGHTEN_ONLY_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE, GimpOperationLightenOnlyMode))
+#define GIMP_OPERATION_LIGHTEN_ONLY_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE, GimpOperationLightenOnlyModeClass))
+#define GIMP_IS_OPERATION_LIGHTEN_ONLY_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE))
+#define GIMP_IS_OPERATION_LIGHTEN_ONLY_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE))
+#define GIMP_OPERATION_LIGHTEN_ONLY_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_LIGHTEN_ONLY_MODE, GimpOperationLightenOnlyModeClass))
+
+
+typedef struct _GimpOperationLightenOnlyModeClass GimpOperationLightenOnlyModeClass;
+
+struct _GimpOperationLightenOnlyMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationLightenOnlyModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_lighten_only_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_LIGHTEN_ONLY_MODE_H__ */
diff --git a/app/gegl/gimpoperationmultiplymode.c b/app/gegl/gimpoperationmultiplymode.c
new file mode 100644
index 0000000..b2756c4
--- /dev/null
+++ b/app/gegl/gimpoperationmultiplymode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationmultiplymode.c
+ * Copyright (C) 2008 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 "gimpoperationmultiplymode.h"
+
+
+static gboolean gimp_operation_multiply_mode_process (GeglOperation       *operation,
+                                                      void                *in_buf,
+                                                      void                *aux_buf,
+                                                      void                *out_buf,
+                                                      glong                samples,
+                                                      const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationMultiplyMode, gimp_operation_multiply_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_multiply_mode_class_init (GimpOperationMultiplyModeClass *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:multiply-mode";
+  operation_class->description = "GIMP multiply mode operation";
+
+  point_class->process         = gimp_operation_multiply_mode_process;
+}
+
+static void
+gimp_operation_multiply_mode_init (GimpOperationMultiplyMode *self)
+{
+}
+
+static gboolean
+gimp_operation_multiply_mode_process (GeglOperation       *operation,
+                                      void                *in_buf,
+                                      void                *aux_buf,
+                                      void                *out_buf,
+                                      glong                samples,
+                                      const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationmultiplymode.h b/app/gegl/gimpoperationmultiplymode.h
new file mode 100644
index 0000000..0901ac8
--- /dev/null
+++ b/app/gegl/gimpoperationmultiplymode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationmultiplymode.h
+ * Copyright (C) 2008 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_MULTIPLY_MODE_H__
+#define __GIMP_OPERATION_MULTIPLY_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_MULTIPLY_MODE            (gimp_operation_multiply_mode_get_type ())
+#define GIMP_OPERATION_MULTIPLY_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_MULTIPLY_MODE, GimpOperationMultiplyMode))
+#define GIMP_OPERATION_MULTIPLY_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_MULTIPLY_MODE, GimpOperationMultiplyModeClass))
+#define GIMP_IS_OPERATION_MULTIPLY_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_MULTIPLY_MODE))
+#define GIMP_IS_OPERATION_MULTIPLY_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_MULTIPLY_MODE))
+#define GIMP_OPERATION_MULTIPLY_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_MULTIPLY_MODE, GimpOperationMultiplyModeClass))
+
+
+typedef struct _GimpOperationMultiplyModeClass GimpOperationMultiplyModeClass;
+
+struct _GimpOperationMultiplyMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationMultiplyModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_multiply_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_MULTIPLY_MODE_H__ */
diff --git a/app/gegl/gimpoperationoverlaymode.c b/app/gegl/gimpoperationoverlaymode.c
new file mode 100644
index 0000000..6f67213
--- /dev/null
+++ b/app/gegl/gimpoperationoverlaymode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationoverlaymode.c
+ * Copyright (C) 2008 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 "gimpoperationoverlaymode.h"
+
+
+static gboolean gimp_operation_overlay_mode_process (GeglOperation       *operation,
+                                                     void                *in_buf,
+                                                     void                *aux_buf,
+                                                     void                *out_buf,
+                                                     glong                samples,
+                                                     const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationOverlayMode, gimp_operation_overlay_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_overlay_mode_class_init (GimpOperationOverlayModeClass *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:overlay-mode";
+  operation_class->description = "GIMP overlay mode operation";
+
+  point_class->process         = gimp_operation_overlay_mode_process;
+}
+
+static void
+gimp_operation_overlay_mode_init (GimpOperationOverlayMode *self)
+{
+}
+
+static gboolean
+gimp_operation_overlay_mode_process (GeglOperation       *operation,
+                                     void                *in_buf,
+                                     void                *aux_buf,
+                                     void                *out_buf,
+                                     glong                samples,
+                                     const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationoverlaymode.h b/app/gegl/gimpoperationoverlaymode.h
new file mode 100644
index 0000000..831e6c1
--- /dev/null
+++ b/app/gegl/gimpoperationoverlaymode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationoverlaymode.h
+ * Copyright (C) 2008 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_OVERLAY_MODE_H__
+#define __GIMP_OPERATION_OVERLAY_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_OVERLAY_MODE            (gimp_operation_overlay_mode_get_type ())
+#define GIMP_OPERATION_OVERLAY_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_OVERLAY_MODE, GimpOperationOverlayMode))
+#define GIMP_OPERATION_OVERLAY_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_OVERLAY_MODE, GimpOperationOverlayModeClass))
+#define GIMP_IS_OPERATION_OVERLAY_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_OVERLAY_MODE))
+#define GIMP_IS_OPERATION_OVERLAY_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_OVERLAY_MODE))
+#define GIMP_OPERATION_OVERLAY_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_OVERLAY_MODE, GimpOperationOverlayModeClass))
+
+
+typedef struct _GimpOperationOverlayModeClass GimpOperationOverlayModeClass;
+
+struct _GimpOperationOverlayMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationOverlayModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_overlay_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_OVERLAY_MODE_H__ */
diff --git a/app/gegl/gimpoperationreplacemode.c b/app/gegl/gimpoperationreplacemode.c
new file mode 100644
index 0000000..8ae8d6b
--- /dev/null
+++ b/app/gegl/gimpoperationreplacemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationreplacemode.c
+ * Copyright (C) 2008 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 "gimpoperationreplacemode.h"
+
+
+static gboolean gimp_operation_replace_mode_process (GeglOperation       *operation,
+                                                     void                *in_buf,
+                                                     void                *aux_buf,
+                                                     void                *out_buf,
+                                                     glong                samples,
+                                                     const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationReplaceMode, gimp_operation_replace_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_replace_mode_class_init (GimpOperationReplaceModeClass *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:replace-mode";
+  operation_class->description = "GIMP replace mode operation";
+
+  point_class->process         = gimp_operation_replace_mode_process;
+}
+
+static void
+gimp_operation_replace_mode_init (GimpOperationReplaceMode *self)
+{
+}
+
+static gboolean
+gimp_operation_replace_mode_process (GeglOperation       *operation,
+                                     void                *in_buf,
+                                     void                *aux_buf,
+                                     void                *out_buf,
+                                     glong                samples,
+                                     const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationreplacemode.h b/app/gegl/gimpoperationreplacemode.h
new file mode 100644
index 0000000..866bb97
--- /dev/null
+++ b/app/gegl/gimpoperationreplacemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationreplacemode.h
+ * Copyright (C) 2008 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_REPLACE_MODE_H__
+#define __GIMP_OPERATION_REPLACE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_REPLACE_MODE            (gimp_operation_replace_mode_get_type ())
+#define GIMP_OPERATION_REPLACE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_REPLACE_MODE, GimpOperationReplaceMode))
+#define GIMP_OPERATION_REPLACE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_REPLACE_MODE, GimpOperationReplaceModeClass))
+#define GIMP_IS_OPERATION_REPLACE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_REPLACE_MODE))
+#define GIMP_IS_OPERATION_REPLACE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_REPLACE_MODE))
+#define GIMP_OPERATION_REPLACE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_REPLACE_MODE, GimpOperationReplaceModeClass))
+
+
+typedef struct _GimpOperationReplaceModeClass GimpOperationReplaceModeClass;
+
+struct _GimpOperationReplaceMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationReplaceModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_replace_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_REPLACE_MODE_H__ */
diff --git a/app/gegl/gimpoperationsaturationmode.c b/app/gegl/gimpoperationsaturationmode.c
new file mode 100644
index 0000000..ee7c8b0
--- /dev/null
+++ b/app/gegl/gimpoperationsaturationmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsaturationmode.c
+ * Copyright (C) 2008 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 "gimpoperationsaturationmode.h"
+
+
+static gboolean gimp_operation_saturation_mode_process (GeglOperation       *operation,
+                                                        void                *in_buf,
+                                                        void                *aux_buf,
+                                                        void                *out_buf,
+                                                        glong                samples,
+                                                        const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationSaturationMode, gimp_operation_saturation_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_saturation_mode_class_init (GimpOperationSaturationModeClass *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:saturation-mode";
+  operation_class->description = "GIMP saturation mode operation";
+
+  point_class->process         = gimp_operation_saturation_mode_process;
+}
+
+static void
+gimp_operation_saturation_mode_init (GimpOperationSaturationMode *self)
+{
+}
+
+static gboolean
+gimp_operation_saturation_mode_process (GeglOperation       *operation,
+                                        void                *in_buf,
+                                        void                *aux_buf,
+                                        void                *out_buf,
+                                        glong                samples,
+                                        const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationsaturationmode.h b/app/gegl/gimpoperationsaturationmode.h
new file mode 100644
index 0000000..cd28664
--- /dev/null
+++ b/app/gegl/gimpoperationsaturationmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsaturationmode.h
+ * Copyright (C) 2008 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_SATURATION_MODE_H__
+#define __GIMP_OPERATION_SATURATION_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_SATURATION_MODE            (gimp_operation_saturation_mode_get_type ())
+#define GIMP_OPERATION_SATURATION_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_SATURATION_MODE, GimpOperationSaturationMode))
+#define GIMP_OPERATION_SATURATION_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_SATURATION_MODE, GimpOperationSaturationModeClass))
+#define GIMP_IS_OPERATION_SATURATION_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_SATURATION_MODE))
+#define GIMP_IS_OPERATION_SATURATION_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_SATURATION_MODE))
+#define GIMP_OPERATION_SATURATION_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_SATURATION_MODE, GimpOperationSaturationModeClass))
+
+
+typedef struct _GimpOperationSaturationModeClass GimpOperationSaturationModeClass;
+
+struct _GimpOperationSaturationMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationSaturationModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_saturation_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_SATURATION_MODE_H__ */
diff --git a/app/gegl/gimpoperationscreenmode.c b/app/gegl/gimpoperationscreenmode.c
new file mode 100644
index 0000000..2361236
--- /dev/null
+++ b/app/gegl/gimpoperationscreenmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationscreenmode.c
+ * Copyright (C) 2008 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 "gimpoperationscreenmode.h"
+
+
+static gboolean gimp_operation_screen_mode_process (GeglOperation       *operation,
+                                                    void                *in_buf,
+                                                    void                *aux_buf,
+                                                    void                *out_buf,
+                                                    glong                samples,
+                                                    const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationScreenMode, gimp_operation_screen_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_screen_mode_class_init (GimpOperationScreenModeClass *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:screen-mode";
+  operation_class->description = "GIMP screen mode operation";
+
+  point_class->process         = gimp_operation_screen_mode_process;
+}
+
+static void
+gimp_operation_screen_mode_init (GimpOperationScreenMode *self)
+{
+}
+
+static gboolean
+gimp_operation_screen_mode_process (GeglOperation       *operation,
+                                    void                *in_buf,
+                                    void                *aux_buf,
+                                    void                *out_buf,
+                                    glong                samples,
+                                    const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationscreenmode.h b/app/gegl/gimpoperationscreenmode.h
new file mode 100644
index 0000000..6b918bf
--- /dev/null
+++ b/app/gegl/gimpoperationscreenmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationscreenmode.h
+ * Copyright (C) 2008 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_SCREEN_MODE_H__
+#define __GIMP_OPERATION_SCREEN_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_SCREEN_MODE            (gimp_operation_screen_mode_get_type ())
+#define GIMP_OPERATION_SCREEN_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenMode))
+#define GIMP_OPERATION_SCREEN_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenModeClass))
+#define GIMP_IS_OPERATION_SCREEN_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_SCREEN_MODE))
+#define GIMP_IS_OPERATION_SCREEN_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_SCREEN_MODE))
+#define GIMP_OPERATION_SCREEN_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_SCREEN_MODE, GimpOperationScreenModeClass))
+
+
+typedef struct _GimpOperationScreenModeClass GimpOperationScreenModeClass;
+
+struct _GimpOperationScreenMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationScreenModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_screen_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_SCREEN_MODE_H__ */
diff --git a/app/gegl/gimpoperationsoftlightmode.c b/app/gegl/gimpoperationsoftlightmode.c
new file mode 100644
index 0000000..ea024b4
--- /dev/null
+++ b/app/gegl/gimpoperationsoftlightmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsoftlightmode.c
+ * Copyright (C) 2008 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 "gimpoperationsoftlightmode.h"
+
+
+static gboolean gimp_operation_softlight_mode_process (GeglOperation       *operation,
+                                                       void                *in_buf,
+                                                       void                *aux_buf,
+                                                       void                *out_buf,
+                                                       glong                samples,
+                                                       const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationSoftlightMode, gimp_operation_softlight_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_softlight_mode_class_init (GimpOperationSoftlightModeClass *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:softlight-mode";
+  operation_class->description = "GIMP softlight mode operation";
+
+  point_class->process         = gimp_operation_softlight_mode_process;
+}
+
+static void
+gimp_operation_softlight_mode_init (GimpOperationSoftlightMode *self)
+{
+}
+
+static gboolean
+gimp_operation_softlight_mode_process (GeglOperation       *operation,
+                                       void                *in_buf,
+                                       void                *aux_buf,
+                                       void                *out_buf,
+                                       glong                samples,
+                                       const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationsoftlightmode.h b/app/gegl/gimpoperationsoftlightmode.h
new file mode 100644
index 0000000..4e409f6
--- /dev/null
+++ b/app/gegl/gimpoperationsoftlightmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsoftlightmode.h
+ * Copyright (C) 2008 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_SOFTLIGHT_MODE_H__
+#define __GIMP_OPERATION_SOFTLIGHT_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_SOFTLIGHT_MODE            (gimp_operation_softlight_mode_get_type ())
+#define GIMP_OPERATION_SOFTLIGHT_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_SOFTLIGHT_MODE, GimpOperationSoftlightMode))
+#define GIMP_OPERATION_SOFTLIGHT_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_SOFTLIGHT_MODE, GimpOperationSoftlightModeClass))
+#define GIMP_IS_OPERATION_SOFTLIGHT_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_SOFTLIGHT_MODE))
+#define GIMP_IS_OPERATION_SOFTLIGHT_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_SOFTLIGHT_MODE))
+#define GIMP_OPERATION_SOFTLIGHT_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_SOFTLIGHT_MODE, GimpOperationSoftlightModeClass))
+
+
+typedef struct _GimpOperationSoftlightModeClass GimpOperationSoftlightModeClass;
+
+struct _GimpOperationSoftlightMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationSoftlightModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_softlight_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_SOFTLIGHT_MODE_H__ */
diff --git a/app/gegl/gimpoperationsubtractmode.c b/app/gegl/gimpoperationsubtractmode.c
new file mode 100644
index 0000000..c465c81
--- /dev/null
+++ b/app/gegl/gimpoperationsubtractmode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsubtractmode.c
+ * Copyright (C) 2008 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 "gimpoperationsubtractmode.h"
+
+
+static gboolean gimp_operation_subtract_mode_process (GeglOperation       *operation,
+                                                      void                *in_buf,
+                                                      void                *aux_buf,
+                                                      void                *out_buf,
+                                                      glong                samples,
+                                                      const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationSubtractMode, gimp_operation_subtract_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_subtract_mode_class_init (GimpOperationSubtractModeClass *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:subtract-mode";
+  operation_class->description = "GIMP subtract mode operation";
+
+  point_class->process         = gimp_operation_subtract_mode_process;
+}
+
+static void
+gimp_operation_subtract_mode_init (GimpOperationSubtractMode *self)
+{
+}
+
+static gboolean
+gimp_operation_subtract_mode_process (GeglOperation       *operation,
+                                      void                *in_buf,
+                                      void                *aux_buf,
+                                      void                *out_buf,
+                                      glong                samples,
+                                      const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationsubtractmode.h b/app/gegl/gimpoperationsubtractmode.h
new file mode 100644
index 0000000..42d38ad
--- /dev/null
+++ b/app/gegl/gimpoperationsubtractmode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationsubtractmode.h
+ * Copyright (C) 2008 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_SUBTRACT_MODE_H__
+#define __GIMP_OPERATION_SUBTRACT_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_SUBTRACT_MODE            (gimp_operation_subtract_mode_get_type ())
+#define GIMP_OPERATION_SUBTRACT_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_SUBTRACT_MODE, GimpOperationSubtractMode))
+#define GIMP_OPERATION_SUBTRACT_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_SUBTRACT_MODE, GimpOperationSubtractModeClass))
+#define GIMP_IS_OPERATION_SUBTRACT_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_SUBTRACT_MODE))
+#define GIMP_IS_OPERATION_SUBTRACT_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_SUBTRACT_MODE))
+#define GIMP_OPERATION_SUBTRACT_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_SUBTRACT_MODE, GimpOperationSubtractModeClass))
+
+
+typedef struct _GimpOperationSubtractModeClass GimpOperationSubtractModeClass;
+
+struct _GimpOperationSubtractMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationSubtractModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_subtract_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_SUBTRACT_MODE_H__ */
diff --git a/app/gegl/gimpoperationvaluemode.c b/app/gegl/gimpoperationvaluemode.c
new file mode 100644
index 0000000..77eb63c
--- /dev/null
+++ b/app/gegl/gimpoperationvaluemode.c
@@ -0,0 +1,88 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationvaluemode.c
+ * Copyright (C) 2008 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 "gimpoperationvaluemode.h"
+
+
+static gboolean gimp_operation_value_mode_process (GeglOperation       *operation,
+                                                   void                *in_buf,
+                                                   void                *aux_buf,
+                                                   void                *out_buf,
+                                                   glong                samples,
+                                                   const GeglRectangle *roi);
+
+
+G_DEFINE_TYPE (GimpOperationValueMode, gimp_operation_value_mode,
+               GIMP_TYPE_OPERATION_POINT_LAYER_MODE)
+
+
+static void
+gimp_operation_value_mode_class_init (GimpOperationValueModeClass *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:value-mode";
+  operation_class->description = "GIMP value mode operation";
+
+  point_class->process         = gimp_operation_value_mode_process;
+}
+
+static void
+gimp_operation_value_mode_init (GimpOperationValueMode *self)
+{
+}
+
+static gboolean
+gimp_operation_value_mode_process (GeglOperation       *operation,
+                                   void                *in_buf,
+                                   void                *aux_buf,
+                                   void                *out_buf,
+                                   glong                samples,
+                                   const GeglRectangle *roi)
+{
+  gfloat *in    = in_buf;
+  gfloat *layer = aux_buf;
+  gfloat *out   = out_buf;
+
+  while (samples--)
+    {
+      out[RED]   = in[RED];
+      out[GREEN] = in[GREEN];
+      out[BLUE]  = in[BLUE];
+      out[ALPHA] = in[ALPHA];
+
+      in    += 4;
+      layer += 4;
+      out   += 4;
+    }
+
+  return TRUE;
+}
diff --git a/app/gegl/gimpoperationvaluemode.h b/app/gegl/gimpoperationvaluemode.h
new file mode 100644
index 0000000..c81ae87
--- /dev/null
+++ b/app/gegl/gimpoperationvaluemode.h
@@ -0,0 +1,53 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpoperationvaluemode.h
+ * Copyright (C) 2008 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_VALUE_MODE_H__
+#define __GIMP_OPERATION_VALUE_MODE_H__
+
+
+#include "gimpoperationpointlayermode.h"
+
+
+#define GIMP_TYPE_OPERATION_VALUE_MODE            (gimp_operation_value_mode_get_type ())
+#define GIMP_OPERATION_VALUE_MODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_VALUE_MODE, GimpOperationValueMode))
+#define GIMP_OPERATION_VALUE_MODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_OPERATION_VALUE_MODE, GimpOperationValueModeClass))
+#define GIMP_IS_OPERATION_VALUE_MODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_VALUE_MODE))
+#define GIMP_IS_OPERATION_VALUE_MODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIMP_TYPE_OPERATION_VALUE_MODE))
+#define GIMP_OPERATION_VALUE_MODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIMP_TYPE_OPERATION_VALUE_MODE, GimpOperationValueModeClass))
+
+
+typedef struct _GimpOperationValueModeClass GimpOperationValueModeClass;
+
+struct _GimpOperationValueMode
+{
+  GimpOperationPointLayerMode  parent_instance;
+};
+
+struct _GimpOperationValueModeClass
+{
+  GimpOperationPointLayerModeClass  parent_class;
+};
+
+
+GType   gimp_operation_value_mode_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_OPERATION_VALUE_MODE_H__ */



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