[gimp/pippin/linear-is-the-new-black] app: propagate layer modes composite_mode



commit df50720c68f7696ca345afec9b57e8889435bfd6
Author: Øyvind Kolås <pippin gimp org>
Date:   Tue Jan 17 22:45:36 2017 +0100

    app: propagate layer modes composite_mode

 .../gimpoperationadditionlegacy.c                  |   23 ++++----
 .../gimpoperationadditionlegacy.h                  |    3 +-
 .../layer-modes-legacy/gimpoperationburnlegacy.c   |   23 ++++----
 .../layer-modes-legacy/gimpoperationburnlegacy.h   |    3 +-
 .../gimpoperationdarkenonlylegacy.c                |   21 ++++----
 .../gimpoperationdarkenonlylegacy.h                |    3 +-
 .../gimpoperationdifferencelegacy.c                |   23 ++++----
 .../gimpoperationdifferencelegacy.h                |    3 +-
 .../layer-modes-legacy/gimpoperationdividelegacy.c |   23 ++++----
 .../layer-modes-legacy/gimpoperationdividelegacy.h |    3 +-
 .../layer-modes-legacy/gimpoperationdodgelegacy.c  |   23 ++++----
 .../layer-modes-legacy/gimpoperationdodgelegacy.h  |    3 +-
 .../gimpoperationgrainextractlegacy.c              |   23 ++++----
 .../gimpoperationgrainextractlegacy.h              |    3 +-
 .../gimpoperationgrainmergelegacy.c                |   23 ++++----
 .../gimpoperationgrainmergelegacy.h                |    3 +-
 .../gimpoperationhardlightlegacy.c                 |   23 ++++----
 .../gimpoperationhardlightlegacy.h                 |    3 +-
 .../gimpoperationhsvcolorlegacy.c                  |   23 ++++----
 .../gimpoperationhsvcolorlegacy.h                  |    3 +-
 .../layer-modes-legacy/gimpoperationhsvhuelegacy.c |   23 ++++----
 .../layer-modes-legacy/gimpoperationhsvhuelegacy.h |    3 +-
 .../gimpoperationhsvsaturationlegacy.c             |   23 ++++----
 .../gimpoperationhsvsaturationlegacy.h             |    3 +-
 .../gimpoperationhsvvaluelegacy.c                  |   23 ++++----
 .../gimpoperationhsvvaluelegacy.h                  |    3 +-
 .../gimpoperationlightenonlylegacy.c               |   23 ++++----
 .../gimpoperationlightenonlylegacy.h               |    3 +-
 .../gimpoperationmultiplylegacy.c                  |   23 ++++----
 .../gimpoperationmultiplylegacy.h                  |    3 +-
 .../layer-modes-legacy/gimpoperationscreenlegacy.c |   21 ++++----
 .../layer-modes-legacy/gimpoperationscreenlegacy.h |    3 +-
 .../gimpoperationsoftlightlegacy.c                 |   21 ++++----
 .../gimpoperationsoftlightlegacy.h                 |    3 +-
 .../gimpoperationsubtractlegacy.c                  |   23 ++++----
 .../gimpoperationsubtractlegacy.h                  |    3 +-
 app/operations/layer-modes/gimpoperationaddition.c |   33 +++++------
 app/operations/layer-modes/gimpoperationaddition.h |   21 ++++----
 .../layer-modes/gimpoperationantierase.c           |   23 ++++----
 .../layer-modes/gimpoperationantierase.h           |   21 ++++----
 app/operations/layer-modes/gimpoperationbehind.c   |   23 ++++----
 app/operations/layer-modes/gimpoperationbehind.h   |   21 ++++----
 app/operations/layer-modes/gimpoperationburn.c     |   32 +++++------
 app/operations/layer-modes/gimpoperationburn.h     |   21 ++++----
 .../layer-modes/gimpoperationcolorerase.c          |   23 ++++----
 .../layer-modes/gimpoperationcolorerase.h          |    3 +-
 .../layer-modes/gimpoperationdarkenonly.c          |   32 +++++------
 .../layer-modes/gimpoperationdarkenonly.h          |    3 +-
 .../layer-modes/gimpoperationdifference.c          |   32 +++++------
 .../layer-modes/gimpoperationdifference.h          |    3 +-
 app/operations/layer-modes/gimpoperationdissolve.c |   23 ++++----
 app/operations/layer-modes/gimpoperationdissolve.h |    3 +-
 app/operations/layer-modes/gimpoperationdivide.c   |   32 +++++------
 app/operations/layer-modes/gimpoperationdivide.h   |    3 +-
 app/operations/layer-modes/gimpoperationdodge.c    |   32 +++++------
 app/operations/layer-modes/gimpoperationdodge.h    |    3 +-
 app/operations/layer-modes/gimpoperationerase.c    |   23 ++++----
 app/operations/layer-modes/gimpoperationerase.h    |    3 +-
 .../layer-modes/gimpoperationgrainextract.c        |   32 +++++------
 .../layer-modes/gimpoperationgrainextract.h        |    3 +-
 .../layer-modes/gimpoperationgrainmerge.c          |   32 +++++------
 .../layer-modes/gimpoperationgrainmerge.h          |    3 +-
 .../layer-modes/gimpoperationhardlight.c           |   32 +++++------
 .../layer-modes/gimpoperationhardlight.h           |    3 +-
 app/operations/layer-modes/gimpoperationhsvcolor.c |   32 +++++------
 app/operations/layer-modes/gimpoperationhsvcolor.h |    3 +-
 app/operations/layer-modes/gimpoperationhsvhue.c   |   14 ++---
 app/operations/layer-modes/gimpoperationhsvhue.h   |    3 +-
 .../layer-modes/gimpoperationhsvsaturation.c       |   32 +++++------
 .../layer-modes/gimpoperationhsvsaturation.h       |    3 +-
 app/operations/layer-modes/gimpoperationhsvvalue.c |   32 +++++------
 app/operations/layer-modes/gimpoperationhsvvalue.h |    3 +-
 .../layer-modes/gimpoperationlchchroma.c           |   53 +++++++++----------
 .../layer-modes/gimpoperationlchchroma.h           |    6 ++-
 app/operations/layer-modes/gimpoperationlchcolor.c |   53 +++++++++----------
 app/operations/layer-modes/gimpoperationlchcolor.h |    6 ++-
 app/operations/layer-modes/gimpoperationlchhue.c   |   53 +++++++++----------
 app/operations/layer-modes/gimpoperationlchhue.h   |    6 ++-
 .../layer-modes/gimpoperationlchlightness.c        |   56 +++++++++-----------
 .../layer-modes/gimpoperationlchlightness.h        |    6 ++-
 .../layer-modes/gimpoperationlightenonly.c         |   32 +++++------
 .../layer-modes/gimpoperationlightenonly.h         |    3 +-
 app/operations/layer-modes/gimpoperationmultiply.c |   32 +++++------
 app/operations/layer-modes/gimpoperationmultiply.h |    3 +-
 .../layer-modes/gimpoperationnormal-sse2.c         |   25 +++++----
 .../layer-modes/gimpoperationnormal-sse4.c         |   24 +++++----
 app/operations/layer-modes/gimpoperationnormal.c   |   23 ++++----
 app/operations/layer-modes/gimpoperationnormal.h   |    9 ++-
 app/operations/layer-modes/gimpoperationoverlay.c  |   32 +++++------
 app/operations/layer-modes/gimpoperationoverlay.h  |    3 +-
 app/operations/layer-modes/gimpoperationreplace.c  |   23 ++++----
 app/operations/layer-modes/gimpoperationreplace.h  |   21 ++++----
 app/operations/layer-modes/gimpoperationscreen.c   |   32 +++++------
 app/operations/layer-modes/gimpoperationscreen.h   |    3 +-
 .../layer-modes/gimpoperationsoftlight.c           |   32 +++++------
 .../layer-modes/gimpoperationsoftlight.h           |    3 +-
 app/operations/layer-modes/gimpoperationsubtract.c |   32 +++++------
 app/operations/layer-modes/gimpoperationsubtract.h |    3 +-
 app/operations/operations-types.h                  |   21 ++++----
 99 files changed, 847 insertions(+), 850 deletions(-)
---
diff --git a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
index 31feaf5..ebb7e76 100644
--- a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_addition_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_addition_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_addition_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_addition_legacy_process_pixels (gfloat              *in,
-                                               gfloat              *layer,
-                                               gfloat              *mask,
-                                               gfloat              *out,
-                                               gfloat               opacity,
-                                               glong                samples,
-                                               const GeglRectangle *roi,
-                                               gint                 level,
-                                               GimpLayerBlendTRC    blend_trc,
-                                               GimpLayerBlendTRC    composite_trc)
+gimp_operation_addition_legacy_process_pixels (gfloat                *in,
+                                               gfloat                *layer,
+                                               gfloat                *mask,
+                                               gfloat                *out,
+                                               gfloat                 opacity,
+                                               glong                  samples,
+                                               const GeglRectangle   *roi,
+                                               gint                   level,
+                                               GimpLayerBlendTRC      blend_trc,
+                                               GimpLayerBlendTRC      composite_trc,
+                                               GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.h
index a56aaf1..eb8e32a 100644
--- a/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationadditionlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_addition_legacy_process_pixels (gfloat              *in,
                                                         const GeglRectangle *roi,
                                                         gint                 level,
                                                         GimpLayerBlendTRC    blend_trc, 
-                                                        GimpLayerBlendTRC    composite_trc);
+                                                        GimpLayerBlendTRC    composite_trc,
+                                                        GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_ADDITION_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationburnlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationburnlegacy.c
index 760dbd5..1ed5d50 100644
--- a/app/operations/layer-modes-legacy/gimpoperationburnlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationburnlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_burn_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_burn_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_burn_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_burn_legacy_process_pixels (gfloat              *in,
-                                           gfloat              *layer,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_burn_legacy_process_pixels (gfloat                *in,
+                                           gfloat                *layer,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationburnlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationburnlegacy.h
index 1ee5cad..3f253f9 100644
--- a/app/operations/layer-modes-legacy/gimpoperationburnlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationburnlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_burn_legacy_process_pixels (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_BURN_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.c
index 7c3b029..764b039 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.c
@@ -76,20 +76,21 @@ gimp_operation_darken_only_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_darken_only_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_darken_only_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
 gimp_operation_darken_only_legacy_process_pixels (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc,
-                                                GimpLayerBlendTRC    composite_trc)
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.h
index 7e68cc8..502178d 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationdarkenonlylegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_darken_only_legacy_process_pixels (gfloat              *
                                                            const GeglRectangle *roi,
                                                            gint                 level,
                                                            GimpLayerBlendTRC    blend_trc, 
-                                                           GimpLayerBlendTRC    composite_trc);
+                                                           GimpLayerBlendTRC    composite_trc,
+                                                           GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DARKEN_ONLY_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.c
index 6385954..36143fa 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.c
@@ -76,20 +76,21 @@ gimp_operation_difference_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_difference_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_difference_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_difference_legacy_process_pixels (gfloat              *in,
-                                                 gfloat              *layer,
-                                                 gfloat              *mask,
-                                                 gfloat              *out,
-                                                 gfloat               opacity,
-                                                 glong                samples,
-                                                 const GeglRectangle *roi,
-                                                 gint                 level,
-                                                 GimpLayerBlendTRC    blend_trc,
-                                                 GimpLayerBlendTRC    composite_trc)
+gimp_operation_difference_legacy_process_pixels (gfloat                *in,
+                                                 gfloat                *layer,
+                                                 gfloat                *mask,
+                                                 gfloat                *out,
+                                                 gfloat                 opacity,
+                                                 glong                  samples,
+                                                 const GeglRectangle   *roi,
+                                                 gint                   level,
+                                                 GimpLayerBlendTRC      blend_trc,
+                                                 GimpLayerBlendTRC      composite_trc,
+                                                 GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.h
index 26036f6..322eed0 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationdifferencelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_difference_legacy_process_pixels (gfloat              *i
                                                           const GeglRectangle *roi,
                                                           gint                 level,
                                                           GimpLayerBlendTRC    blend_trc, 
-                                                          GimpLayerBlendTRC    composite_trc);
+                                                          GimpLayerBlendTRC    composite_trc,
+                                                          GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DIFFERENCE_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
index c00d307..e82a901 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.c
@@ -76,20 +76,21 @@ gimp_operation_divide_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_divide_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_divide_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_divide_legacy_process_pixels (gfloat              *in,
-                                             gfloat              *layer,
-                                             gfloat              *mask,
-                                             gfloat              *out,
-                                             gfloat               opacity,
-                                             glong                samples,
-                                             const GeglRectangle *roi,
-                                             gint                 level,
-                                             GimpLayerBlendTRC    blend_trc,
-                                             GimpLayerBlendTRC    composite_trc)
+gimp_operation_divide_legacy_process_pixels (gfloat                *in,
+                                             gfloat                *layer,
+                                             gfloat                *mask,
+                                             gfloat                *out,
+                                             gfloat                 opacity,
+                                             glong                  samples,
+                                             const GeglRectangle   *roi,
+                                             gint                   level,
+                                             GimpLayerBlendTRC      blend_trc,
+                                             GimpLayerBlendTRC      composite_trc,
+                                             GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.h
index 40ad846..a6d88d3 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdividelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationdividelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_divide_legacy_process_pixels (gfloat              *in,
                                                       const GeglRectangle *roi,
                                                       gint                 level,
                                                       GimpLayerBlendTRC    blend_trc, 
-                                                      GimpLayerBlendTRC    composite_trc);
+                                                      GimpLayerBlendTRC    composite_trc,
+                                                      GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DIVIDE_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
index 34fcf8b..024ecb6 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.c
@@ -76,20 +76,21 @@ gimp_operation_dodge_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_dodge_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_dodge_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_dodge_legacy_process_pixels (gfloat              *in,
-                                            gfloat              *layer,
-                                            gfloat              *mask,
-                                            gfloat              *out,
-                                            gfloat               opacity,
-                                            glong                samples,
-                                            const GeglRectangle *roi,
-                                            gint                 level,
-                                            GimpLayerBlendTRC    blend_trc,
-                                            GimpLayerBlendTRC    composite_trc)
+gimp_operation_dodge_legacy_process_pixels (gfloat                *in,
+                                            gfloat                *layer,
+                                            gfloat                *mask,
+                                            gfloat                *out,
+                                            gfloat                 opacity,
+                                            glong                  samples,
+                                            const GeglRectangle   *roi,
+                                            gint                   level,
+                                            GimpLayerBlendTRC      blend_trc,
+                                            GimpLayerBlendTRC      composite_trc,
+                                            GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.h
index 60ff7a3..7f9d126 100644
--- a/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationdodgelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_dodge_legacy_process_pixels (gfloat              *in,
                                                      const GeglRectangle *roi,
                                                      gint                 level,
                                                      GimpLayerBlendTRC    blend_trc, 
-                                                     GimpLayerBlendTRC    composite_trc);
+                                                     GimpLayerBlendTRC    composite_trc,
+                                                     GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DODGE_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
index 877625a..47c379d 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_grain_extract_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_grain_extract_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_grain_extract_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_grain_extract_legacy_process_pixels (gfloat              *in,
-                                                    gfloat              *layer,
-                                                    gfloat              *mask,
-                                                    gfloat              *out,
-                                                    gfloat               opacity,
-                                                    glong                samples,
-                                                    const GeglRectangle *roi,
-                                                    gint                 level,
-                                                    GimpLayerBlendTRC    blend_trc,
-                                                    GimpLayerBlendTRC    composite_Trc)
+gimp_operation_grain_extract_legacy_process_pixels (gfloat                *in,
+                                                    gfloat                *layer,
+                                                    gfloat                *mask,
+                                                    gfloat                *out,
+                                                    gfloat                 opacity,
+                                                    glong                  samples,
+                                                    const GeglRectangle   *roi,
+                                                    gint                   level,
+                                                    GimpLayerBlendTRC      blend_trc,
+                                                    GimpLayerBlendTRC      composite_Trc,
+                                                    GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.h
index 5b6171e..28e9cb1 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainextractlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_grain_extract_legacy_process_pixels (gfloat
                                                              const GeglRectangle *roi,
                                                              gint                 level,
                                                              GimpLayerBlendTRC    blend_trc, 
-                                                             GimpLayerBlendTRC    composite_trc);
+                                                             GimpLayerBlendTRC    composite_trc,
+                                                             GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_GRAIN_EXTRACT_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
index 3248936..d296611 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.c
@@ -76,20 +76,21 @@ gimp_operation_grain_merge_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_grain_merge_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_grain_merge_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_grain_merge_legacy_process_pixels (gfloat              *in,
-                                                  gfloat              *layer,
-                                                  gfloat              *mask,
-                                                  gfloat              *out,
-                                                  gfloat               opacity,
-                                                  glong                samples,
-                                                  const GeglRectangle *roi,
-                                                  gint                 level,
-                                                  GimpLayerBlendTRC    blend_trc,
-                                                  GimpLayerBlendTRC    composite_trc)
+gimp_operation_grain_merge_legacy_process_pixels (gfloat                *in,
+                                                  gfloat                *layer,
+                                                  gfloat                *mask,
+                                                  gfloat                *out,
+                                                  gfloat                 opacity,
+                                                  glong                  samples,
+                                                  const GeglRectangle   *roi,
+                                                  gint                   level,
+                                                  GimpLayerBlendTRC      blend_trc,
+                                                  GimpLayerBlendTRC      composite_trc,
+                                                  GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.h
index 534994b..4f4db94 100644
--- a/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationgrainmergelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_grain_merge_legacy_process_pixels (gfloat              *
                                                            const GeglRectangle *roi,
                                                            gint                 level,
                                                            GimpLayerBlendTRC    blend_trc, 
-                                                           GimpLayerBlendTRC    composite_trc);
+                                                           GimpLayerBlendTRC    composite_trc,
+                                                           GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_GRAIN_MERGE_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.c
index fe12c16..6b7dc4c 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_hardlight_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hardlight_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hardlight_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hardlight_legacy_process_pixels (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc,
-                                                GimpLayerBlendTRC    composite_trc)
+gimp_operation_hardlight_legacy_process_pixels (gfloat                *in,
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.h
index 9b3b2b3..a704750 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationhardlightlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hardlight_legacy_process_pixels (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HARDLIGHT_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.c
index ff0766f..b653132 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.c
@@ -80,20 +80,21 @@ gimp_operation_hsv_color_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_color_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_color_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_color_legacy_process_pixels (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc,
-                                                GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_color_legacy_process_pixels (gfloat                *in,
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.h
index a64e416..268654c 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvcolorlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hsv_color_legacy_process_pixels (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_COLOR_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.c
index 71a9c50..5cd4cbd 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.c
@@ -80,20 +80,21 @@ gimp_operation_hsv_hue_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_hue_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_hue_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_hue_legacy_process_pixels (gfloat              *in,
-                                              gfloat              *layer,
-                                              gfloat              *mask,
-                                              gfloat              *out,
-                                              gfloat               opacity,
-                                              glong                samples,
-                                              const GeglRectangle *roi,
-                                              gint                 level,
-                                              GimpLayerBlendTRC    blend_trc,
-                                              GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_hue_legacy_process_pixels (gfloat                *in,
+                                              gfloat                *layer,
+                                              gfloat                *mask,
+                                              gfloat                *out,
+                                              gfloat                 opacity,
+                                              glong                  samples,
+                                              const GeglRectangle   *roi,
+                                              gint                   level,
+                                              GimpLayerBlendTRC      blend_trc,
+                                              GimpLayerBlendTRC      composite_trc,
+                                              GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.h
index fb64601..2b28563 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvhuelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hsv_hue_legacy_process_pixels (gfloat              *in,
                                                        const GeglRectangle *roi,
                                                        gint                 level,
                                                        GimpLayerBlendTRC    blend_trc, 
-                                                       GimpLayerBlendTRC    composite_trc);
+                                                       GimpLayerBlendTRC    composite_trc,
+                                                       GimpLayerCompositeMode composite_mode);
 
 
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.c
index 863386b..42ebe11 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.c
@@ -80,20 +80,21 @@ gimp_operation_hsv_saturation_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_saturation_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_saturation_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_saturation_legacy_process_pixels (gfloat              *in,
-                                                     gfloat              *layer,
-                                                     gfloat              *mask,
-                                                     gfloat              *out,
-                                                     gfloat               opacity,
-                                                     glong                samples,
-                                                     const GeglRectangle *roi,
-                                                     gint                 level,
-                                                     GimpLayerBlendTRC    blend_trc,
-                                                     GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_saturation_legacy_process_pixels (gfloat                *in,
+                                                     gfloat                *layer,
+                                                     gfloat                *mask,
+                                                     gfloat                *out,
+                                                     gfloat                 opacity,
+                                                     glong                  samples,
+                                                     const GeglRectangle   *roi,
+                                                     gint                   level,
+                                                     GimpLayerBlendTRC      blend_trc,
+                                                     GimpLayerBlendTRC      composite_trc,
+                                                     GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.h
index 85500e3..0d913f9 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvsaturationlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hsv_saturation_legacy_process_pixels (gfloat
                                                               const GeglRectangle *roi,
                                                               gint                 level,
                                                               GimpLayerBlendTRC    blend_trc, 
-                                                              GimpLayerBlendTRC    composite_trc);
+                                                              GimpLayerBlendTRC    composite_trc,
+                                                              GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_SATURATION_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.c
index 6bc97c4..6424b11 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.c
@@ -80,20 +80,21 @@ gimp_operation_hsv_value_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_value_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_value_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_value_legacy_process_pixels (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc,
-                                                GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_value_legacy_process_pixels (gfloat                *in,
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.h
index 742b645..9d2794a 100644
--- a/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationhsvvaluelegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hsv_value_legacy_process_pixels (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_VALUE_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.c
index 107cbd1..628c924 100644
--- a/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.c
@@ -76,20 +76,21 @@ gimp_operation_lighten_only_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_lighten_only_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_lighten_only_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_lighten_only_legacy_process_pixels (gfloat              *in,
-                                                   gfloat              *layer,
-                                                   gfloat              *mask,
-                                                   gfloat              *out,
-                                                   gfloat               opacity,
-                                                   glong                samples,
-                                                   const GeglRectangle *roi,
-                                                   gint                 level,
-                                                   GimpLayerBlendTRC    blend_trc,
-                                                   GimpLayerBlendTRC    composite_trc)
+gimp_operation_lighten_only_legacy_process_pixels (gfloat                *in,
+                                                   gfloat                *layer,
+                                                   gfloat                *mask,
+                                                   gfloat                *out,
+                                                   gfloat                 opacity,
+                                                   glong                  samples,
+                                                   const GeglRectangle   *roi,
+                                                   gint                   level,
+                                                   GimpLayerBlendTRC      blend_trc,
+                                                   GimpLayerBlendTRC      composite_trc,
+                                                   GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.h
index 84d5050..fa57ce0 100644
--- a/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationlightenonlylegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_lighten_only_legacy_process_pixels (gfloat
                                                             const GeglRectangle *roi,
                                                             gint                 level,
                                                             GimpLayerBlendTRC    blend_trc, 
-                                                            GimpLayerBlendTRC    composite_trc);
+                                                            GimpLayerBlendTRC    composite_trc,
+                                                            GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_LIGHTEN_ONLY_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
index 73ac367..bdfed8b 100644
--- a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.c
@@ -76,20 +76,21 @@ gimp_operation_multiply_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_multiply_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_multiply_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_multiply_legacy_process_pixels (gfloat              *in,
-                                               gfloat              *layer,
-                                               gfloat              *mask,
-                                               gfloat              *out,
-                                               gfloat               opacity,
-                                               glong                samples,
-                                               const GeglRectangle *roi,
-                                               gint                 level,
-                                               GimpLayerBlendTRC    blend_trc,
-                                               GimpLayerBlendTRC    composite_trc)
+gimp_operation_multiply_legacy_process_pixels (gfloat                *in,
+                                               gfloat                *layer,
+                                               gfloat                *mask,
+                                               gfloat                *out,
+                                               gfloat                 opacity,
+                                               glong                  samples,
+                                               const GeglRectangle   *roi,
+                                               gint                   level,
+                                               GimpLayerBlendTRC      blend_trc,
+                                               GimpLayerBlendTRC      composite_trc,
+                                               GimpLayerCompositeMode composite_mode)
 {
   const gboolean  has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.h
index df38c93..26e20f7 100644
--- a/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationmultiplylegacy.h
@@ -58,6 +58,7 @@ gboolean gimp_operation_multiply_legacy_process_pixels (gfloat              *in,
                                                         const GeglRectangle *roi,
                                                         gint                 level,
                                                         GimpLayerBlendTRC    blend_trc, 
-                                                        GimpLayerBlendTRC    composite_trc);
+                                                        GimpLayerBlendTRC    composite_trc,
+                                                        GimpLayerCompositeMode composite_mode);
 
 #endif /* __GIMP_OPERATION_MULTIPLY_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.c
index 0716fc4..9023c9a 100644
--- a/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_screen_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_screen_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_screen_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
 gimp_operation_screen_legacy_process_pixels (gfloat              *in,
-                                           gfloat              *layer,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+                                           gfloat                *layer,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   const gboolean  has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.h
index 4c11f9b..cc1e4cd 100644
--- a/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationscreenlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_screen_legacy_process_pixels (gfloat              *in,
                                                       const GeglRectangle *roi,
                                                       gint                 level,
                                                       GimpLayerBlendTRC    blend_trc, 
-                                                      GimpLayerBlendTRC    composite_trc);
+                                                      GimpLayerBlendTRC    composite_trc,
+                                                      GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_SCREEN_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.c
index dbd0053..c9950a4 100644
--- a/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.c
@@ -93,20 +93,21 @@ gimp_operation_softlight_legacy_process (GeglOperation       *operation,
                                        gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_softlight_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_softlight_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
 gimp_operation_softlight_legacy_process_pixels (gfloat              *in,
-                                              gfloat              *layer,
-                                              gfloat              *mask,
-                                              gfloat              *out,
-                                              gfloat               opacity,
-                                              glong                samples,
-                                              const GeglRectangle *roi,
-                                              gint                 level,
-                                              GimpLayerBlendTRC    blend_trc,
-                                              GimpLayerBlendTRC    composite_trc)
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.h
index 9ccb1c7..b918e51 100644
--- a/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationsoftlightlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_softlight_legacy_process_pixels (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_SOFTLIGHT_LEGACY_H__ */
diff --git a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c 
b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
index 8a752b4..2c66bca 100644
--- a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
+++ b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.c
@@ -76,20 +76,21 @@ gimp_operation_subtract_legacy_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_subtract_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_subtract_legacy_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_subtract_legacy_process_pixels (gfloat              *in,
-                                             gfloat              *layer,
-                                             gfloat              *mask,
-                                             gfloat              *out,
-                                             gfloat               opacity,
-                                             glong                samples,
-                                             const GeglRectangle *roi,
-                                             gint                 level,
-                                             GimpLayerBlendTRC    blend_trc,
-                                             GimpLayerBlendTRC    composite_trc)
+gimp_operation_subtract_legacy_process_pixels (gfloat                *in,
+                                               gfloat                *layer,
+                                               gfloat                *mask,
+                                               gfloat                *out,
+                                               gfloat                 opacity,
+                                               glong                  samples,
+                                               const GeglRectangle   *roi,
+                                               gint                   level,
+                                               GimpLayerBlendTRC      blend_trc,
+                                               GimpLayerBlendTRC      composite_trc,
+                                               GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.h 
b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.h
index dbb5a37..582186a 100644
--- a/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.h
+++ b/app/operations/layer-modes-legacy/gimpoperationsubtractlegacy.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_subtract_legacy_process_pixels (gfloat              *in,
                                                         const GeglRectangle *roi,
                                                         gint                 level,
                                                         GimpLayerBlendTRC    blend_trc, 
-                                                        GimpLayerBlendTRC    composite_trc);
+                                                        GimpLayerBlendTRC    composite_trc,
+                                                        GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_SUBTRACT_LEGACY_H__ */
diff --git a/app/operations/layer-modes/gimpoperationaddition.c 
b/app/operations/layer-modes/gimpoperationaddition.c
index cc87d9a..d975b3c 100644
--- a/app/operations/layer-modes/gimpoperationaddition.c
+++ b/app/operations/layer-modes/gimpoperationaddition.c
@@ -78,28 +78,25 @@ gimp_operation_addition_process (GeglOperation       *operation,
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
   return gimp_operation_addition_process_pixels (in_buf, aux_buf, aux2_buf,
                           out_buf, layer_mode->opacity, samples, roi, level,
-                          layer_mode->blend_trc, layer_mode->composite_trc);
+                          layer_mode->blend_trc, layer_mode->composite_trc,
+                          layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_addition_process_pixels (gfloat              *in,
-                                        gfloat              *layer,
-                                        gfloat              *mask,
-                                        gfloat              *out,
-                                        gfloat               opacity,
-                                        glong                samples,
-                                        const GeglRectangle *roi,
-                                        gint                 level,
-                                        GimpLayerBlendTRC    blend_trc,
-                                        GimpLayerBlendTRC    composite_trc)
+gimp_operation_addition_process_pixels (gfloat                *in,
+                                        gfloat                *layer,
+                                        gfloat                *mask,
+                                        gfloat                *out,
+                                        gfloat                 opacity,
+                                        glong                  samples,
+                                        const GeglRectangle   *roi,
+                                        gint                   level,
+                                        GimpLayerBlendTRC      blend_trc,
+                                        GimpLayerBlendTRC      composite_trc,
+                                        GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_addition
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+                   blend_trc, composite_trc, composite_mode, blendfun_addition);
   return TRUE;
 }
 
diff --git a/app/operations/layer-modes/gimpoperationaddition.h 
b/app/operations/layer-modes/gimpoperationaddition.h
index b376322..01f24bd 100644
--- a/app/operations/layer-modes/gimpoperationaddition.h
+++ b/app/operations/layer-modes/gimpoperationaddition.h
@@ -50,16 +50,17 @@ struct _GimpOperationAdditionClass
 
 GType    gimp_operation_addition_get_type       (void) G_GNUC_CONST;
 
-gboolean gimp_operation_addition_process_pixels (gfloat              *in,
-                                                 gfloat              *layer,
-                                                 gfloat              *mask,
-                                                 gfloat              *out,
-                                                 gfloat               opacity,
-                                                 glong                samples,
-                                                 const GeglRectangle *roi,
-                                                 gint                 level,
-                                                 GimpLayerBlendTRC    blend_trc, 
-                                                 GimpLayerBlendTRC    composite_trc);
+gboolean gimp_operation_addition_process_pixels (gfloat                *in,
+                                                 gfloat                *layer,
+                                                 gfloat                *mask,
+                                                 gfloat                *out,
+                                                 gfloat                 opacity,
+                                                 glong                  samples,
+                                                 const GeglRectangle   *roi,
+                                                 gint                   level,
+                                                 GimpLayerBlendTRC      blend_trc, 
+                                                 GimpLayerBlendTRC      composite_trc,
+                                                 GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_ADDITION_H__ */
diff --git a/app/operations/layer-modes/gimpoperationantierase.c 
b/app/operations/layer-modes/gimpoperationantierase.c
index 85c4bc4..40c1585 100644
--- a/app/operations/layer-modes/gimpoperationantierase.c
+++ b/app/operations/layer-modes/gimpoperationantierase.c
@@ -89,20 +89,21 @@ gimp_operation_anti_erase_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_anti_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_anti_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_anti_erase_process_pixels (gfloat              *in,
-                                          gfloat              *layer,
-                                          gfloat              *mask,
-                                          gfloat              *out,
-                                          gfloat               opacity,
-                                          glong                samples,
-                                          const GeglRectangle *roi,
-                                          gint                 level,
-                                          GimpLayerBlendTRC    blend_trc,
-                                          GimpLayerBlendTRC    composite_trc)
+gimp_operation_anti_erase_process_pixels (gfloat                *in,
+                                          gfloat                *layer,
+                                          gfloat                *mask,
+                                          gfloat                *out,
+                                          gfloat                 opacity,
+                                          glong                  samples,
+                                          const GeglRectangle   *roi,
+                                          gint                   level,
+                                          GimpLayerBlendTRC      blend_trc,
+                                          GimpLayerBlendTRC      composite_trc,
+                                          GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationantierase.h 
b/app/operations/layer-modes/gimpoperationantierase.h
index 4a81a2b..58e2d41 100644
--- a/app/operations/layer-modes/gimpoperationantierase.h
+++ b/app/operations/layer-modes/gimpoperationantierase.h
@@ -49,16 +49,17 @@ struct _GimpOperationAntiEraseClass
 
 GType    gimp_operation_anti_erase_get_type       (void) G_GNUC_CONST;
 
-gboolean gimp_operation_anti_erase_process_pixels (gfloat              *in,
-                                                   gfloat              *layer,
-                                                   gfloat              *mask,
-                                                   gfloat              *out,
-                                                   gfloat               opacity,
-                                                   glong                samples,
-                                                   const GeglRectangle *roi,
-                                                   gint                 level,
-                                                   GimpLayerBlendTRC    blend_trc, 
-                                                   GimpLayerBlendTRC    composite_trc);
+gboolean gimp_operation_anti_erase_process_pixels (gfloat                *in,
+                                                   gfloat                *layer,
+                                                   gfloat                *mask,
+                                                   gfloat                *out,
+                                                   gfloat                 opacity,
+                                                   glong                  samples,
+                                                   const GeglRectangle   *roi,
+                                                   gint                   level,
+                                                   GimpLayerBlendTRC      blend_trc, 
+                                                   GimpLayerBlendTRC      composite_trc,
+                                                   GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_ANTI_ERASE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationbehind.c 
b/app/operations/layer-modes/gimpoperationbehind.c
index 435b3a6..74afd0b 100644
--- a/app/operations/layer-modes/gimpoperationbehind.c
+++ b/app/operations/layer-modes/gimpoperationbehind.c
@@ -76,20 +76,21 @@ gimp_operation_behind_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_behind_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_behind_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_behind_process_pixels (gfloat              *in,
-                                      gfloat              *layer,
-                                      gfloat              *mask,
-                                      gfloat              *out,
-                                      gfloat               opacity,
-                                      glong                samples,
-                                      const GeglRectangle *roi,
-                                      gint                 level,
-                                      GimpLayerBlendTRC    blend_trc,
-                                      GimpLayerBlendTRC    composite_trc)
+gimp_operation_behind_process_pixels (gfloat                *in,
+                                      gfloat                *layer,
+                                      gfloat                *mask,
+                                      gfloat                *out,
+                                      gfloat                 opacity,
+                                      glong                  samples,
+                                      const GeglRectangle   *roi,
+                                      gint                   level,
+                                      GimpLayerBlendTRC      blend_trc,
+                                      GimpLayerBlendTRC      composite_trc,
+                                      GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationbehind.h 
b/app/operations/layer-modes/gimpoperationbehind.h
index 2aa387d..764f7f6 100644
--- a/app/operations/layer-modes/gimpoperationbehind.h
+++ b/app/operations/layer-modes/gimpoperationbehind.h
@@ -49,16 +49,17 @@ struct _GimpOperationBehindClass
 
 GType    gimp_operation_behind_get_type       (void) G_GNUC_CONST;
 
-gboolean gimp_operation_behind_process_pixels (gfloat              *in,
-                                               gfloat              *layer,
-                                               gfloat              *mask,
-                                               gfloat              *out,
-                                               gfloat               opacity,
-                                               glong                samples,
-                                               const GeglRectangle *roi,
-                                               gint                 level,
-                                               GimpLayerBlendTRC    blend_trc, 
-                                               GimpLayerBlendTRC    composite_trc);
+gboolean gimp_operation_behind_process_pixels (gfloat                *in,
+                                               gfloat                *layer,
+                                               gfloat                *mask,
+                                               gfloat                *out,
+                                               gfloat                 opacity,
+                                               glong                  samples,
+                                               const GeglRectangle   *roi,
+                                               gint                   level,
+                                               GimpLayerBlendTRC      blend_trc, 
+                                               GimpLayerBlendTRC      composite_trc,
+                                               GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_BEHIND_H__ */
diff --git a/app/operations/layer-modes/gimpoperationburn.c b/app/operations/layer-modes/gimpoperationburn.c
index d0bc08b..5fddf2a 100644
--- a/app/operations/layer-modes/gimpoperationburn.c
+++ b/app/operations/layer-modes/gimpoperationburn.c
@@ -77,29 +77,25 @@ gimp_operation_burn_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_burn_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_mode);
+  return gimp_operation_burn_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_mode, layer_mode->composite_mode);
 } 
 
 
 gboolean
-gimp_operation_burn_process_pixels (gfloat              *in,
-                                    gfloat              *layer,
-                                    gfloat              *mask,
-                                    gfloat              *out,
-                                    gfloat               opacity,
-                                    glong                samples,
-                                    const GeglRectangle *roi,
-                                    gint                 level,
-                                    GimpLayerBlendTRC    blend_trc,
-                                    GimpLayerBlendTRC    composite_trc)
+gimp_operation_burn_process_pixels (gfloat                *in,
+                                    gfloat                *layer,
+                                    gfloat                *mask,
+                                    gfloat                *out,
+                                    gfloat                 opacity,
+                                    glong                  samples,
+                                    const GeglRectangle   *roi,
+                                    gint                   level,
+                                    GimpLayerBlendTRC      blend_trc,
+                                    GimpLayerBlendTRC      composite_trc,
+                                    GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_burn
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_burn);
   return TRUE;
 }
 
diff --git a/app/operations/layer-modes/gimpoperationburn.h b/app/operations/layer-modes/gimpoperationburn.h
index 46b4d69..3804e22 100644
--- a/app/operations/layer-modes/gimpoperationburn.h
+++ b/app/operations/layer-modes/gimpoperationburn.h
@@ -50,16 +50,17 @@ struct _GimpOperationBurnClass
 
 GType    gimp_operation_burn_get_type       (void) G_GNUC_CONST;
 
-gboolean gimp_operation_burn_process_pixels (gfloat              *in,
-                                             gfloat              *layer,
-                                             gfloat              *mask,
-                                             gfloat              *out,
-                                             gfloat               opacity,
-                                             glong                samples,
-                                             const GeglRectangle *roi,
-                                             gint                 level,
-                                             GimpLayerBlendTRC    blend_trc, 
-                                             GimpLayerBlendTRC    composite_trc);
+gboolean gimp_operation_burn_process_pixels (gfloat                *in,
+                                             gfloat                *layer,
+                                             gfloat                *mask,
+                                             gfloat                *out,
+                                             gfloat                 opacity,
+                                             glong                  samples,
+                                             const GeglRectangle   *roi,
+                                             gint                   level,
+                                             GimpLayerBlendTRC      blend_trc, 
+                                             GimpLayerBlendTRC      composite_trc,
+                                             GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_BURN_H__ */
diff --git a/app/operations/layer-modes/gimpoperationcolorerase.c 
b/app/operations/layer-modes/gimpoperationcolorerase.c
index a9d5084..06b8fec 100644
--- a/app/operations/layer-modes/gimpoperationcolorerase.c
+++ b/app/operations/layer-modes/gimpoperationcolorerase.c
@@ -80,20 +80,21 @@ gimp_operation_color_erase_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_color_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_color_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_color_erase_process_pixels (gfloat              *in,
-                                           gfloat              *layer,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_color_erase_process_pixels (gfloat                *in,
+                                           gfloat                *layer,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationcolorerase.h 
b/app/operations/layer-modes/gimpoperationcolorerase.h
index 8174e2a..e38decc 100644
--- a/app/operations/layer-modes/gimpoperationcolorerase.h
+++ b/app/operations/layer-modes/gimpoperationcolorerase.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_color_erase_process_pixels (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_COLOR_ERASE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationdarkenonly.c 
b/app/operations/layer-modes/gimpoperationdarkenonly.c
index 7c7195d..627af49 100644
--- a/app/operations/layer-modes/gimpoperationdarkenonly.c
+++ b/app/operations/layer-modes/gimpoperationdarkenonly.c
@@ -77,27 +77,23 @@ gimp_operation_darken_only_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_darken_only_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_darken_only_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_darken_only_process_pixels (gfloat              *in,
-                                           gfloat              *layer,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_darken_only_process_pixels (gfloat                *in,
+                                           gfloat                *layer,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_darken_only
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_darken_only);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationdarkenonly.h 
b/app/operations/layer-modes/gimpoperationdarkenonly.h
index dc5027d..8e394e8 100644
--- a/app/operations/layer-modes/gimpoperationdarkenonly.h
+++ b/app/operations/layer-modes/gimpoperationdarkenonly.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_darken_only_process_pixels (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DARKEN_ONLY_H__ */
diff --git a/app/operations/layer-modes/gimpoperationdifference.c 
b/app/operations/layer-modes/gimpoperationdifference.c
index 98a5f6d..8244345 100644
--- a/app/operations/layer-modes/gimpoperationdifference.c
+++ b/app/operations/layer-modes/gimpoperationdifference.c
@@ -77,27 +77,23 @@ gimp_operation_difference_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_difference_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_difference_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_difference_process_pixels (gfloat              *in,
-                                          gfloat              *layer,
-                                          gfloat              *mask,
-                                          gfloat              *out,
-                                          gfloat               opacity,
-                                          glong                samples,
-                                          const GeglRectangle *roi,
-                                          gint                 level,
-                                          GimpLayerBlendTRC    blend_trc,
-                                          GimpLayerBlendTRC    composite_trc)
+gimp_operation_difference_process_pixels (gfloat                *in,
+                                          gfloat                *layer,
+                                          gfloat                *mask,
+                                          gfloat                *out,
+                                          gfloat                 opacity,
+                                          glong                  samples,
+                                          const GeglRectangle   *roi,
+                                          gint                   level,
+                                          GimpLayerBlendTRC      blend_trc,
+                                          GimpLayerBlendTRC      composite_trc,
+                                          GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_difference
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+     composite_trc, composite_mode, blendfun_difference);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationdifference.h 
b/app/operations/layer-modes/gimpoperationdifference.h
index 2ed21f7..dfe1aa5 100644
--- a/app/operations/layer-modes/gimpoperationdifference.h
+++ b/app/operations/layer-modes/gimpoperationdifference.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_difference_process_pixels (gfloat              *in,
                                                    const GeglRectangle *roi,
                                                    gint                 level,
                                                    GimpLayerBlendTRC    blend_trc, 
-                                                   GimpLayerBlendTRC    composite_trc);
+                                                   GimpLayerBlendTRC    composite_trc,
+                                                   GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DIFFERENCE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationdissolve.c 
b/app/operations/layer-modes/gimpoperationdissolve.c
index ee3bf1a..38afe83 100644
--- a/app/operations/layer-modes/gimpoperationdissolve.c
+++ b/app/operations/layer-modes/gimpoperationdissolve.c
@@ -92,20 +92,21 @@ gimp_operation_dissolve_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*) operation;
 
-  return gimp_operation_dissolve_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, result, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_dissolve_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, result, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_dissolve_process_pixels (gfloat               *in,
-                                        gfloat               *aux,
-                                        gfloat               *mask,
-                                        gfloat               *out,
-                                        gfloat                opacity,
-                                        glong                 samples,
-                                        const GeglRectangle  *result,
-                                        gint                  level,
-                                        GimpLayerBlendTRC     blend_trc,
-                                        GimpLayerBlendTRC     composite_trc)
+gimp_operation_dissolve_process_pixels (gfloat                *in,
+                                        gfloat                *aux,
+                                        gfloat                *mask,
+                                        gfloat                *out,
+                                        gfloat                 opacity,
+                                        glong                  samples,
+                                        const GeglRectangle   *result,
+                                        gint                   level,
+                                        GimpLayerBlendTRC      blend_trc,
+                                        GimpLayerBlendTRC      composite_trc,
+                                        GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
   gint           x, y;
diff --git a/app/operations/layer-modes/gimpoperationdissolve.h 
b/app/operations/layer-modes/gimpoperationdissolve.h
index 2f70aac..4e21a61 100644
--- a/app/operations/layer-modes/gimpoperationdissolve.h
+++ b/app/operations/layer-modes/gimpoperationdissolve.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_dissolve_process_pixels (gfloat              *in,
                                                  const GeglRectangle *result,
                                                  gint                 level,
                                                  GimpLayerBlendTRC    blend_trc, 
-                                                 GimpLayerBlendTRC    composite_trc);
+                                                 GimpLayerBlendTRC    composite_trc,
+                                                 GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DISSOLVE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationdivide.c 
b/app/operations/layer-modes/gimpoperationdivide.c
index dc6b39a..e57d7c7 100644
--- a/app/operations/layer-modes/gimpoperationdivide.c
+++ b/app/operations/layer-modes/gimpoperationdivide.c
@@ -77,27 +77,23 @@ gimp_operation_divide_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_divide_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_divide_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_divide_process_pixels (gfloat              *in,
-                                      gfloat              *layer,
-                                      gfloat              *mask,
-                                      gfloat              *out,
-                                      gfloat               opacity,
-                                      glong                samples,
-                                      const GeglRectangle *roi,
-                                      gint                 level,
-                                      GimpLayerBlendTRC    blend_trc,
-                                      GimpLayerBlendTRC    composite_trc)
+gimp_operation_divide_process_pixels (gfloat                *in,
+                                      gfloat                *layer,
+                                      gfloat                *mask,
+                                      gfloat                *out,
+                                      gfloat                 opacity,
+                                      glong                  samples,
+                                      const GeglRectangle   *roi,
+                                      gint                   level,
+                                      GimpLayerBlendTRC      blend_trc,
+                                      GimpLayerBlendTRC      composite_trc,
+                                      GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_divide
-     );
+   gimp_composite_blend (in, layer, mask, out, opacity, samples,
+                    blend_trc, composite_trc, composite_mode, blendfun_divide);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationdivide.h 
b/app/operations/layer-modes/gimpoperationdivide.h
index 6653f58..92b52cd 100644
--- a/app/operations/layer-modes/gimpoperationdivide.h
+++ b/app/operations/layer-modes/gimpoperationdivide.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_divide_process_pixels (gfloat              *in,
                                                const GeglRectangle *roi,
                                                gint                 level,
                                                GimpLayerBlendTRC    blend_trc, 
-                                               GimpLayerBlendTRC    composite_trc);
+                                               GimpLayerBlendTRC    composite_trc,
+                                               GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DIVIDE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationdodge.c b/app/operations/layer-modes/gimpoperationdodge.c
index f3acfec..025eb38 100644
--- a/app/operations/layer-modes/gimpoperationdodge.c
+++ b/app/operations/layer-modes/gimpoperationdodge.c
@@ -77,27 +77,23 @@ gimp_operation_dodge_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (void*)operation;
 
-  return gimp_operation_dodge_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_dodge_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_dodge_process_pixels (gfloat              *in,
-                                     gfloat              *layer,
-                                     gfloat              *mask,
-                                     gfloat              *out,
-                                     gfloat               opacity,
-                                     glong                samples,
-                                     const GeglRectangle *roi,
-                                     gint                 level,
-                                     GimpLayerBlendTRC    blend_trc,
-                                     GimpLayerBlendTRC    composite_trc)
+gimp_operation_dodge_process_pixels (gfloat                *in,
+                                     gfloat                *layer,
+                                     gfloat                *mask,
+                                     gfloat                *out,
+                                     gfloat                 opacity,
+                                     glong                  samples,
+                                     const GeglRectangle   *roi,
+                                     gint                   level,
+                                     GimpLayerBlendTRC      blend_trc,
+                                     GimpLayerBlendTRC      composite_trc,
+                                     GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_dodge
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_dodge);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationdodge.h b/app/operations/layer-modes/gimpoperationdodge.h
index 5088e30..476fecb 100644
--- a/app/operations/layer-modes/gimpoperationdodge.h
+++ b/app/operations/layer-modes/gimpoperationdodge.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_dodge_process_pixels (gfloat              *in,
                                               const GeglRectangle *roi,
                                               gint                 level,
                                               GimpLayerBlendTRC    blend_trc, 
-                                              GimpLayerBlendTRC    composite_trc);
+                                              GimpLayerBlendTRC    composite_trc,
+                                              GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_DODGE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationerase.c b/app/operations/layer-modes/gimpoperationerase.c
index 6f994eb..922df8f 100644
--- a/app/operations/layer-modes/gimpoperationerase.c
+++ b/app/operations/layer-modes/gimpoperationerase.c
@@ -89,20 +89,21 @@ gimp_operation_erase_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_erase_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_erase_process_pixels (gfloat              *in,
-                                     gfloat              *layer,
-                                     gfloat              *mask,
-                                     gfloat              *out,
-                                     gfloat               opacity,
-                                     glong                samples,
-                                     const GeglRectangle *roi,
-                                     gint                 level,
-                                     GimpLayerBlendTRC    blend_trc,
-                                     GimpLayerBlendTRC    composite_trc)
+gimp_operation_erase_process_pixels (gfloat                *in,
+                                     gfloat                *layer,
+                                     gfloat                *mask,
+                                     gfloat                *out,
+                                     gfloat                 opacity,
+                                     glong                  samples,
+                                     const GeglRectangle   *roi,
+                                     gint                   level,
+                                     GimpLayerBlendTRC      blend_trc,
+                                     GimpLayerBlendTRC      composite_trc,
+                                     GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationerase.h b/app/operations/layer-modes/gimpoperationerase.h
index 999befd..a22213c 100644
--- a/app/operations/layer-modes/gimpoperationerase.h
+++ b/app/operations/layer-modes/gimpoperationerase.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_erase_process_pixels (gfloat              *in,
                                               const GeglRectangle *roi,
                                               gint                 level,
                                               GimpLayerBlendTRC    blend_trc, 
-                                              GimpLayerBlendTRC    composite_trc);
+                                              GimpLayerBlendTRC    composite_trc,
+                                              GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_ERASE_MODE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationgrainextract.c 
b/app/operations/layer-modes/gimpoperationgrainextract.c
index 89ecda1..9f29b09 100644
--- a/app/operations/layer-modes/gimpoperationgrainextract.c
+++ b/app/operations/layer-modes/gimpoperationgrainextract.c
@@ -76,27 +76,23 @@ gimp_operation_grain_extract_process (GeglOperation       *operation,
                                       gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_grain_extract_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_grain_extract_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_grain_extract_process_pixels (gfloat              *in,
-                                             gfloat              *layer,
-                                             gfloat              *mask,
-                                             gfloat              *out,
-                                             gfloat               opacity,
-                                             glong                samples,
-                                             const GeglRectangle *roi,
-                                             gint                 level,
-                                             GimpLayerBlendTRC    blend_trc,
-                                             GimpLayerBlendTRC    composite_trc)
+gimp_operation_grain_extract_process_pixels (gfloat                *in,
+                                             gfloat                *layer,
+                                             gfloat                *mask,
+                                             gfloat                *out,
+                                             gfloat                 opacity,
+                                             glong                  samples,
+                                             const GeglRectangle   *roi,
+                                             gint                   level,
+                                             GimpLayerBlendTRC      blend_trc,
+                                             GimpLayerBlendTRC      composite_trc,
+                                             GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_grain_extract
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_grain_extract);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationgrainextract.h 
b/app/operations/layer-modes/gimpoperationgrainextract.h
index 6712ebb..27bd07c 100644
--- a/app/operations/layer-modes/gimpoperationgrainextract.h
+++ b/app/operations/layer-modes/gimpoperationgrainextract.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_grain_extract_process_pixels (gfloat              *in,
                                                       const GeglRectangle *roi,
                                                       gint                 level,
                                                       GimpLayerBlendTRC    blend_trc, 
-                                                      GimpLayerBlendTRC    composite_trc);
+                                                      GimpLayerBlendTRC    composite_trc,
+                                                      GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_GRAIN_EXTRACT_H__ */
diff --git a/app/operations/layer-modes/gimpoperationgrainmerge.c 
b/app/operations/layer-modes/gimpoperationgrainmerge.c
index 354b9bb..f15d58e 100644
--- a/app/operations/layer-modes/gimpoperationgrainmerge.c
+++ b/app/operations/layer-modes/gimpoperationgrainmerge.c
@@ -76,27 +76,23 @@ gimp_operation_grain_merge_process (GeglOperation       *operation,
                                     gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_grain_merge_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_grain_merge_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_grain_merge_process_pixels (gfloat              *in,
-                                           gfloat              *layer,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_grain_merge_process_pixels (gfloat                *in,
+                                           gfloat                *layer,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_grain_merge
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+     composite_trc, composite_mode, blendfun_grain_merge);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationgrainmerge.h 
b/app/operations/layer-modes/gimpoperationgrainmerge.h
index 9f3e009..af77341 100644
--- a/app/operations/layer-modes/gimpoperationgrainmerge.h
+++ b/app/operations/layer-modes/gimpoperationgrainmerge.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_grain_merge_process_pixels (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_GRAIN_MERGE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationhardlight.c 
b/app/operations/layer-modes/gimpoperationhardlight.c
index d9c8e2a..6127f1d 100644
--- a/app/operations/layer-modes/gimpoperationhardlight.c
+++ b/app/operations/layer-modes/gimpoperationhardlight.c
@@ -76,27 +76,23 @@ gimp_operation_hardlight_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hardlight_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hardlight_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hardlight_process_pixels (gfloat              *in,
-                                         gfloat              *layer,
-                                         gfloat              *mask,
-                                         gfloat              *out,
-                                         gfloat               opacity,
-                                         glong                samples,
-                                         const GeglRectangle *roi,
-                                         gint                 level,
-                                         GimpLayerBlendTRC    blend_trc,
-                                         GimpLayerBlendTRC    composite_trc)
+gimp_operation_hardlight_process_pixels (gfloat                *in,
+                                         gfloat                *layer,
+                                         gfloat                *mask,
+                                         gfloat                *out,
+                                         gfloat                 opacity,
+                                         glong                  samples,
+                                         const GeglRectangle   *roi,
+                                         gint                   level,
+                                         GimpLayerBlendTRC      blend_trc,
+                                         GimpLayerBlendTRC      composite_trc,
+                                         GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_hardlight
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+             blend_trc, composite_trc, composite_mode, blendfun_hardlight);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationhardlight.h 
b/app/operations/layer-modes/gimpoperationhardlight.h
index 06d3307..55f734d 100644
--- a/app/operations/layer-modes/gimpoperationhardlight.h
+++ b/app/operations/layer-modes/gimpoperationhardlight.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_hardlight_process_pixels (gfloat              *in,
                                                   const GeglRectangle *roi,
                                                   gint                 level,
                                                   GimpLayerBlendTRC    blend_trc, 
-                                                  GimpLayerBlendTRC    composite_trc);
+                                                  GimpLayerBlendTRC    composite_trc,
+                                                  GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HARDLIGHT_H__ */
diff --git a/app/operations/layer-modes/gimpoperationhsvcolor.c 
b/app/operations/layer-modes/gimpoperationhsvcolor.c
index c022c57..8c4ae94 100644
--- a/app/operations/layer-modes/gimpoperationhsvcolor.c
+++ b/app/operations/layer-modes/gimpoperationhsvcolor.c
@@ -81,27 +81,23 @@ gimp_operation_hsv_color_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_color_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_color_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_color_process_pixels (gfloat              *in,
-                                         gfloat              *layer,
-                                         gfloat              *mask,
-                                         gfloat              *out,
-                                         gfloat               opacity,
-                                         glong                samples,
-                                         const GeglRectangle *roi,
-                                         gint                 level,
-                                         GimpLayerBlendTRC    blend_trc,
-                                         GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_color_process_pixels (gfloat                *in,
+                                         gfloat                *layer,
+                                         gfloat                *mask,
+                                         gfloat                *out,
+                                         gfloat                 opacity,
+                                         glong                  samples,
+                                         const GeglRectangle   *roi,
+                                         gint                   level,
+                                         GimpLayerBlendTRC      blend_trc,
+                                         GimpLayerBlendTRC      composite_trc,
+                                         GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_hsv_color
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+                blend_trc, composite_trc, composite_mode, blendfun_hsv_color);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationhsvcolor.h 
b/app/operations/layer-modes/gimpoperationhsvcolor.h
index 0df1e33..43e91ea 100644
--- a/app/operations/layer-modes/gimpoperationhsvcolor.h
+++ b/app/operations/layer-modes/gimpoperationhsvcolor.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_hsv_color_process_pixels (gfloat              *in,
                                                   const GeglRectangle *roi,
                                                   gint                 level,
                                                   GimpLayerBlendTRC    blend_trc, 
-                                                  GimpLayerBlendTRC    composite_trc);
+                                                  GimpLayerBlendTRC    composite_trc,
+                                                  GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_COLOR_H__ */
diff --git a/app/operations/layer-modes/gimpoperationhsvhue.c 
b/app/operations/layer-modes/gimpoperationhsvhue.c
index 473544e..159f015 100644
--- a/app/operations/layer-modes/gimpoperationhsvhue.c
+++ b/app/operations/layer-modes/gimpoperationhsvhue.c
@@ -81,7 +81,7 @@ gimp_operation_hsv_hue_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_hsv_hue_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_hue_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
@@ -94,14 +94,10 @@ gimp_operation_hsv_hue_process_pixels (gfloat              *in,
                                        const GeglRectangle *roi,
                                        gint                 level,
                                        GimpLayerBlendTRC    blend_trc,
-                                       GimpLayerBlendTRC    composite_trc)
+                                       GimpLayerBlendTRC    composite_trc,
+                                       GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_hsv_hue
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_hsv_hue);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationhsvhue.h 
b/app/operations/layer-modes/gimpoperationhsvhue.h
index c93f489..6fcd343 100644
--- a/app/operations/layer-modes/gimpoperationhsvhue.h
+++ b/app/operations/layer-modes/gimpoperationhsvhue.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_hsv_hue_process_pixels (gfloat              *in,
                                                 const GeglRectangle *roi,
                                                 gint                 level,
                                                 GimpLayerBlendTRC    blend_trc, 
-                                                GimpLayerBlendTRC    composite_trc);
+                                                GimpLayerBlendTRC    composite_trc,
+                                                GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_HUE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationhsvsaturation.c 
b/app/operations/layer-modes/gimpoperationhsvsaturation.c
index 20b6f68..32ce7f2 100644
--- a/app/operations/layer-modes/gimpoperationhsvsaturation.c
+++ b/app/operations/layer-modes/gimpoperationhsvsaturation.c
@@ -80,27 +80,23 @@ gimp_operation_hsv_saturation_process (GeglOperation       *operation,
                                        gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_hsv_saturation_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_saturation_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_saturation_process_pixels (gfloat              *in,
-                                              gfloat              *layer,
-                                              gfloat              *mask,
-                                              gfloat              *out,
-                                              gfloat               opacity,
-                                              glong                samples,
-                                              const GeglRectangle *roi,
-                                              gint                 level,
-                                              GimpLayerBlendTRC    blend_trc,
-                                              GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_saturation_process_pixels (gfloat                *in,
+                                              gfloat                *layer,
+                                              gfloat                *mask,
+                                              gfloat                *out,
+                                              gfloat                 opacity,
+                                              glong                  samples,
+                                              const GeglRectangle   *roi,
+                                              gint                   level,
+                                              GimpLayerBlendTRC      blend_trc,
+                                              GimpLayerBlendTRC      composite_trc,
+                                              GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_hsv_saturation
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_hsv_saturation);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationhsvsaturation.h 
b/app/operations/layer-modes/gimpoperationhsvsaturation.h
index 6bf4376..29bab15 100644
--- a/app/operations/layer-modes/gimpoperationhsvsaturation.h
+++ b/app/operations/layer-modes/gimpoperationhsvsaturation.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_hsv_saturation_process_pixels (gfloat              *in,
                                                        const GeglRectangle *roi,
                                                        gint                 level,
                                                        GimpLayerBlendTRC    blend_trc, 
-                                                       GimpLayerBlendTRC    composite_trc);
+                                                       GimpLayerBlendTRC    composite_trc,
+                                                       GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_SATURATION_H__ */
diff --git a/app/operations/layer-modes/gimpoperationhsvvalue.c 
b/app/operations/layer-modes/gimpoperationhsvvalue.c
index 3b829e5..f3ec3d1 100644
--- a/app/operations/layer-modes/gimpoperationhsvvalue.c
+++ b/app/operations/layer-modes/gimpoperationhsvvalue.c
@@ -80,27 +80,23 @@ gimp_operation_hsv_value_process (GeglOperation       *operation,
                                   gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_hsv_value_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_hsv_value_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_hsv_value_process_pixels (gfloat              *in,
-                                         gfloat              *layer,
-                                         gfloat              *mask,
-                                         gfloat              *out,
-                                         gfloat               opacity,
-                                         glong                samples,
-                                         const GeglRectangle *roi,
-                                         gint                 level,
-                                         GimpLayerBlendTRC    blend_trc,
-                                         GimpLayerBlendTRC    composite_trc)
+gimp_operation_hsv_value_process_pixels (gfloat                *in,
+                                         gfloat                *layer,
+                                         gfloat                *mask,
+                                         gfloat                *out,
+                                         gfloat                 opacity,
+                                         glong                  samples,
+                                         const GeglRectangle   *roi,
+                                         gint                   level,
+                                         GimpLayerBlendTRC      blend_trc,
+                                         GimpLayerBlendTRC      composite_trc,
+                                         GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_hsv_value
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_hsv_value);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationhsvvalue.h 
b/app/operations/layer-modes/gimpoperationhsvvalue.h
index 1db363b..07012a2 100644
--- a/app/operations/layer-modes/gimpoperationhsvvalue.h
+++ b/app/operations/layer-modes/gimpoperationhsvvalue.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_hsv_value_process_pixels (gfloat              *in,
                                                   const GeglRectangle *roi,
                                                   gint                 level,
                                                   GimpLayerBlendTRC    blend_trc, 
-                                                  GimpLayerBlendTRC    composite_trc);
+                                                  GimpLayerBlendTRC    composite_trc,
+                                                  GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_HSV_VALUE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationlchchroma.c 
b/app/operations/layer-modes/gimpoperationlchchroma.c
index 597feab..f446de5 100644
--- a/app/operations/layer-modes/gimpoperationlchchroma.c
+++ b/app/operations/layer-modes/gimpoperationlchchroma.c
@@ -83,7 +83,7 @@ gimp_operation_lch_chroma_process (GeglOperation       *operation,
 
   return (linear ? gimp_operation_lch_chroma_process_pixels_linear :
                    gimp_operation_lch_chroma_process_pixels)
-    (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level, gimp_op->blend_trc, 
gimp_op->composite_trc);
+    (in_buf, aux_buf, aux2_buf, out_buf, opacity, samples, roi, level, gimp_op->blend_trc, 
gimp_op->composite_trc, gimp_op->composite_mode);
 }
 
 static void
@@ -124,16 +124,17 @@ chroma_pre_process (const Babl   *from_fish,
 
 /* XXX: this and pre_process should be removed */
 gboolean
-gimp_operation_lch_chroma_process_pixels (gfloat              *in,
-                                          gfloat              *layer,
-                                          gfloat              *mask,
-                                          gfloat              *out,
-                                          gfloat               opacity,
-                                          glong                samples,
-                                          const GeglRectangle *roi,
-                                          gint                 level,
-                                          GimpLayerBlendTRC    blend_trc,
-                                          GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_chroma_process_pixels (gfloat                *in,
+                                          gfloat                *layer,
+                                          gfloat                *mask,
+                                          gfloat                *out,
+                                          gfloat                 opacity,
+                                          glong                  samples,
+                                          const GeglRectangle   *roi,
+                                          gint                   level,
+                                          GimpLayerBlendTRC      blend_trc,
+                                          GimpLayerBlendTRC      composite_trc,
+                                          GimpLayerCompositeMode composite_mode)
 {
   static const Babl *from_fish = NULL;
   static const Babl *to_fish = NULL;
@@ -150,23 +151,19 @@ gimp_operation_lch_chroma_process_pixels (gfloat              *in,
 }
 
 gboolean
-gimp_operation_lch_chroma_process_pixels_linear (gfloat              *in,
-                                                 gfloat              *layer,
-                                                 gfloat              *mask,
-                                                 gfloat              *out,
-                                                 gfloat               opacity,
-                                                 glong                samples,
-                                                 const GeglRectangle *roi,
-                                                 gint                 level,
-                                                 GimpLayerBlendTRC    blend_trc,
-                                                 GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_chroma_process_pixels_linear (gfloat                *in,
+                                                 gfloat                *layer,
+                                                 gfloat                *mask,
+                                                 gfloat                *out,
+                                                 gfloat                 opacity,
+                                                 glong                  samples,
+                                                 const GeglRectangle   *roi,
+                                                 gint                   level,
+                                                 GimpLayerBlendTRC      blend_trc,
+                                                 GimpLayerBlendTRC      composite_trc,
+                                                 GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_lch_chroma
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_lch_chroma);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationlchchroma.h 
b/app/operations/layer-modes/gimpoperationlchchroma.h
index 348e45c..86658d1 100644
--- a/app/operations/layer-modes/gimpoperationlchchroma.h
+++ b/app/operations/layer-modes/gimpoperationlchchroma.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_lch_chroma_process_pixels_linear (gfloat              *i
                                                           const GeglRectangle *roi,
                                                           gint                 level,
                                                           GimpLayerBlendTRC    blend_trc, 
-                                                          GimpLayerBlendTRC    composite_trc);
+                                                          GimpLayerBlendTRC    composite_trc,
+                                                          GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_lch_chroma_process_pixels        (gfloat              *in,
                                                           gfloat              *layer,
@@ -71,7 +72,8 @@ gboolean gimp_operation_lch_chroma_process_pixels        (gfloat              *i
                                                           const GeglRectangle *roi,
                                                           gint                 level,
                                                           GimpLayerBlendTRC    blend_trc, 
-                                                          GimpLayerBlendTRC    composite_trc);
+                                                          GimpLayerBlendTRC    composite_trc,
+                                                          GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_LCH_CHROMA_H__ */
diff --git a/app/operations/layer-modes/gimpoperationlchcolor.c 
b/app/operations/layer-modes/gimpoperationlchcolor.c
index 6733dc6..43ecb8e 100644
--- a/app/operations/layer-modes/gimpoperationlchcolor.c
+++ b/app/operations/layer-modes/gimpoperationlchcolor.c
@@ -81,7 +81,7 @@ gimp_operation_lch_color_process (GeglOperation       *operation,
 
   return (gimp_op->linear ? gimp_operation_lch_color_process_pixels_linear :
                    gimp_operation_lch_color_process_pixels)
-    (in_buf, aux_buf, aux2_buf, out_buf, gimp_op->opacity, samples, roi, level, gimp_op->blend_trc, 
gimp_op->composite_trc);
+    (in_buf, aux_buf, aux2_buf, out_buf, gimp_op->opacity, samples, roi, level, gimp_op->blend_trc, 
gimp_op->composite_trc, gimp_op->composite_mode);
 }
 
 static void
@@ -112,16 +112,17 @@ color_pre_process (const Babl   *from_fish_la,
 
 /* XXX: should be removed along with the pre_process fun */
 gboolean
-gimp_operation_lch_color_process_pixels (gfloat              *in,
-                                         gfloat              *layer,
-                                         gfloat              *mask,
-                                         gfloat              *out,
-                                         gfloat               opacity,
-                                         glong                samples,
-                                         const GeglRectangle *roi,
-                                         gint                 level,
-                                         GimpLayerBlendTRC    blend_trc,
-                                         GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_color_process_pixels (gfloat                *in,
+                                         gfloat                *layer,
+                                         gfloat                *mask,
+                                         gfloat                *out,
+                                         gfloat                 opacity,
+                                         glong                  samples,
+                                         const GeglRectangle   *roi,
+                                         gint                   level,
+                                         GimpLayerBlendTRC      blend_trc,
+                                         GimpLayerBlendTRC      composite_trc,
+                                         GimpLayerCompositeMode composite_mode)
 {
   static const Babl *from_fish_laba = NULL;
   static const Babl *from_fish_la = NULL;
@@ -142,23 +143,19 @@ gimp_operation_lch_color_process_pixels (gfloat              *in,
 
 
 gboolean
-gimp_operation_lch_color_process_pixels_linear (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc,
-                                                GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_color_process_pixels_linear (gfloat                *in,
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc,
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_lch_color
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_lch_color);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationlchcolor.h 
b/app/operations/layer-modes/gimpoperationlchcolor.h
index 22c33e0..51e396a 100644
--- a/app/operations/layer-modes/gimpoperationlchcolor.h
+++ b/app/operations/layer-modes/gimpoperationlchcolor.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_lch_color_process_pixels_linear (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_lch_color_process_pixels        (gfloat              *in,
                                                          gfloat              *layer,
@@ -71,7 +72,8 @@ gboolean gimp_operation_lch_color_process_pixels        (gfloat              *in
                                                          const GeglRectangle *roi,
                                                          gint                 level,
                                                          GimpLayerBlendTRC    blend_trc, 
-                                                         GimpLayerBlendTRC    composite_trc);
+                                                         GimpLayerBlendTRC    composite_trc,
+                                                         GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_LCH_COLOR_H__ */
diff --git a/app/operations/layer-modes/gimpoperationlchhue.c 
b/app/operations/layer-modes/gimpoperationlchhue.c
index e213168..226dd6e 100644
--- a/app/operations/layer-modes/gimpoperationlchhue.c
+++ b/app/operations/layer-modes/gimpoperationlchhue.c
@@ -82,7 +82,7 @@ gimp_operation_lch_hue_process (GeglOperation       *operation,
 
   return (layer_mode->linear ? gimp_operation_lch_hue_process_pixels_linear :
                    gimp_operation_lch_hue_process_pixels)
-    (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, 
layer_mode->composite_trc);
+    (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, 
layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 static void
@@ -123,16 +123,17 @@ hue_pre_process (const Babl   *from_fish,
 
 /* XXX: this should be removed along with _pre_process */
 gboolean
-gimp_operation_lch_hue_process_pixels (gfloat              *in,
-                                       gfloat              *layer,
-                                       gfloat              *mask,
-                                       gfloat              *out,
-                                       gfloat               opacity,
-                                       glong                samples,
-                                       const GeglRectangle *roi,
-                                       gint                 level,
-                                       GimpLayerBlendTRC    blend_trc,
-                                       GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_hue_process_pixels (gfloat                *in,
+                                       gfloat                *layer,
+                                       gfloat                *mask,
+                                       gfloat                *out,
+                                       gfloat                 opacity,
+                                       glong                  samples,
+                                       const GeglRectangle   *roi,
+                                       gint                   level,
+                                       GimpLayerBlendTRC      blend_trc,
+                                       GimpLayerBlendTRC      composite_trc,
+                                       GimpLayerCompositeMode composite_mode)
 {
   static const Babl *from_fish = NULL;
   static const Babl *to_fish = NULL;
@@ -150,23 +151,19 @@ gimp_operation_lch_hue_process_pixels (gfloat              *in,
 
 
 gboolean
-gimp_operation_lch_hue_process_pixels_linear (gfloat              *in,
-                                              gfloat              *layer,
-                                              gfloat              *mask,
-                                              gfloat              *out,
-                                              gfloat               opacity,
-                                              glong                samples,
-                                              const GeglRectangle *roi,
-                                              gint                 level,
-                                              GimpLayerBlendTRC    blend_trc,
-                                              GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_hue_process_pixels_linear (gfloat                *in,
+                                              gfloat                *layer,
+                                              gfloat                *mask,
+                                              gfloat                *out,
+                                              gfloat                 opacity,
+                                              glong                  samples,
+                                              const GeglRectangle   *roi,
+                                              gint                   level,
+                                              GimpLayerBlendTRC      blend_trc,
+                                              GimpLayerBlendTRC      composite_trc,
+                                              GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_lch_hue
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_lch_hue);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationlchhue.h 
b/app/operations/layer-modes/gimpoperationlchhue.h
index a6e61f6..7edf1e5 100644
--- a/app/operations/layer-modes/gimpoperationlchhue.h
+++ b/app/operations/layer-modes/gimpoperationlchhue.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_lch_hue_process_pixels_linear (gfloat              *in,
                                                        const GeglRectangle *roi,
                                                        gint                 level,
                                                        GimpLayerBlendTRC    blend_trc, 
-                                                       GimpLayerBlendTRC    composite_trc);
+                                                       GimpLayerBlendTRC    composite_trc,
+                                                       GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_lch_hue_process_pixels        (gfloat              *in,
                                                        gfloat              *layer,
@@ -71,6 +72,7 @@ gboolean gimp_operation_lch_hue_process_pixels        (gfloat              *in,
                                                        const GeglRectangle *roi,
                                                        gint                 level,
                                                        GimpLayerBlendTRC    blend_trc, 
-                                                       GimpLayerBlendTRC    composite_trc);
+                                                       GimpLayerBlendTRC    composite_trc,
+                                                       GimpLayerCompositeMode composite_mode);
 
 #endif /* __GIMP_OPERATION_LCH_HUE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationlchlightness.c 
b/app/operations/layer-modes/gimpoperationlchlightness.c
index 4dafb11..6cd1e7f 100644
--- a/app/operations/layer-modes/gimpoperationlchlightness.c
+++ b/app/operations/layer-modes/gimpoperationlchlightness.c
@@ -79,9 +79,8 @@ gimp_operation_lch_lightness_process (GeglOperation       *operation,
                                       gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return (layer_mode->linear ? gimp_operation_lch_lightness_process_pixels_linear :
-                   gimp_operation_lch_lightness_process_pixels)
-    (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, 
layer_mode->composite_trc);
+  return (layer_mode->linear ? gimp_operation_lch_lightness_process_pixels_linear : 
gimp_operation_lch_lightness_process_pixels)
+    (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, 
layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 static void
@@ -107,16 +106,17 @@ lightness_pre_process (const Babl   *from_fish_la,
 
 /* XXX: this should be remove along with _pre_process */
 gboolean
-gimp_operation_lch_lightness_process_pixels (gfloat              *in,
-                                             gfloat              *layer,
-                                             gfloat              *mask,
-                                             gfloat              *out,
-                                             gfloat               opacity,
-                                             glong                samples,
-                                             const GeglRectangle *roi,
-                                             gint                 level,
-                                             GimpLayerBlendTRC    blend_trc,
-                                             GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_lightness_process_pixels (gfloat                *in,
+                                             gfloat                *layer,
+                                             gfloat                *mask,
+                                             gfloat                *out,
+                                             gfloat                 opacity,
+                                             glong                  samples,
+                                             const GeglRectangle   *roi,
+                                             gint                   level,
+                                             GimpLayerBlendTRC      blend_trc,
+                                             GimpLayerBlendTRC      composite_trc,
+                                             GimpLayerCompositeMode composite_mode)
 {
   static const Babl *from_fish_laba = NULL;
   static const Babl *from_fish_la = NULL;
@@ -138,23 +138,19 @@ gimp_operation_lch_lightness_process_pixels (gfloat              *in,
 
 
 gboolean
-gimp_operation_lch_lightness_process_pixels_linear (gfloat              *in,
-                                                    gfloat              *layer,
-                                                    gfloat              *mask,
-                                                    gfloat              *out,
-                                                    gfloat               opacity,
-                                                    glong                samples,
-                                                    const GeglRectangle *roi,
-                                                    gint                 level,
-                                                    GimpLayerBlendTRC    blend_trc,
-                                                    GimpLayerBlendTRC    composite_trc)
+gimp_operation_lch_lightness_process_pixels_linear (gfloat                *in,
+                                                    gfloat                *layer,
+                                                    gfloat                *mask,
+                                                    gfloat                *out,
+                                                    gfloat                 opacity,
+                                                    glong                  samples,
+                                                    const GeglRectangle   *roi,
+                                                    gint                   level,
+                                                    GimpLayerBlendTRC      blend_trc,
+                                                    GimpLayerBlendTRC      composite_trc,
+                                                    GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_lch_lightness
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_lch_lightness);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationlchlightness.h 
b/app/operations/layer-modes/gimpoperationlchlightness.h
index 29ef6da..4b97610 100644
--- a/app/operations/layer-modes/gimpoperationlchlightness.h
+++ b/app/operations/layer-modes/gimpoperationlchlightness.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_lch_lightness_process_pixels_linear (gfloat
                                                              const GeglRectangle *roi,
                                                              gint                 level,
                                                              GimpLayerBlendTRC    blend_trc, 
-                                                             GimpLayerBlendTRC    composite_trc);
+                                                             GimpLayerBlendTRC    composite_trc,
+                                                             GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_lch_lightness_process_pixels        (gfloat              *in,
                                                              gfloat              *layer,
@@ -71,7 +72,8 @@ gboolean gimp_operation_lch_lightness_process_pixels        (gfloat
                                                              const GeglRectangle *roi,
                                                              gint                 level,
                                                              GimpLayerBlendTRC    blend_trc, 
-                                                             GimpLayerBlendTRC    composite_trc);
+                                                             GimpLayerBlendTRC    composite_trc,
+                                                             GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_LCH_LIGHTNESS_H__ */
diff --git a/app/operations/layer-modes/gimpoperationlightenonly.c 
b/app/operations/layer-modes/gimpoperationlightenonly.c
index 89ecb21..55d8c33 100644
--- a/app/operations/layer-modes/gimpoperationlightenonly.c
+++ b/app/operations/layer-modes/gimpoperationlightenonly.c
@@ -77,27 +77,23 @@ gimp_operation_lighten_only_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_lighten_only_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_lighten_only_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, 
layer_mode->opacity, samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, 
layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_lighten_only_process_pixels (gfloat              *in,
-                                            gfloat              *layer,
-                                            gfloat              *mask,
-                                            gfloat              *out,
-                                            gfloat               opacity,
-                                            glong                samples,
-                                            const GeglRectangle *roi,
-                                            gint                 level,
-                                            GimpLayerBlendTRC    blend_trc,
-                                            GimpLayerBlendTRC    composite_trc)
+gimp_operation_lighten_only_process_pixels (gfloat                *in,
+                                            gfloat                *layer,
+                                            gfloat                *mask,
+                                            gfloat                *out,
+                                            gfloat                 opacity,
+                                            glong                  samples,
+                                            const GeglRectangle   *roi,
+                                            gint                   level,
+                                            GimpLayerBlendTRC      blend_trc,
+                                            GimpLayerBlendTRC      composite_trc,
+                                            GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_lighten_only
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_lighten_only);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationlightenonly.h 
b/app/operations/layer-modes/gimpoperationlightenonly.h
index c3c1056..6c18e99 100644
--- a/app/operations/layer-modes/gimpoperationlightenonly.h
+++ b/app/operations/layer-modes/gimpoperationlightenonly.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_lighten_only_process_pixels (gfloat              *in,
                                                      const GeglRectangle *roi,
                                                      gint                 level,
                                                      GimpLayerBlendTRC    blend_trc, 
-                                                     GimpLayerBlendTRC    composite_trc);
+                                                     GimpLayerBlendTRC    composite_trc,
+                                                     GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_LIGHTEN_ONLY_H__ */
diff --git a/app/operations/layer-modes/gimpoperationmultiply.c 
b/app/operations/layer-modes/gimpoperationmultiply.c
index bca7376..eb0532f 100644
--- a/app/operations/layer-modes/gimpoperationmultiply.c
+++ b/app/operations/layer-modes/gimpoperationmultiply.c
@@ -77,27 +77,23 @@ gimp_operation_multiply_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_multiply_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_multiply_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_multiply_process_pixels (gfloat              *in,
-                                        gfloat              *layer,
-                                        gfloat              *mask,
-                                        gfloat              *out,
-                                        gfloat               opacity,
-                                        glong                samples,
-                                        const GeglRectangle *roi,
-                                        gint                 level,
-                                        GimpLayerBlendTRC    blend_trc,
-                                        GimpLayerBlendTRC    composite_trc)
+gimp_operation_multiply_process_pixels (gfloat                *in,
+                                        gfloat                *layer,
+                                        gfloat                *mask,
+                                        gfloat                *out,
+                                        gfloat                 opacity,
+                                        glong                  samples,
+                                        const GeglRectangle   *roi,
+                                        gint                   level,
+                                        GimpLayerBlendTRC      blend_trc,
+                                        GimpLayerBlendTRC      composite_trc,
+                                        GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_multiply
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_multiply);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationmultiply.h 
b/app/operations/layer-modes/gimpoperationmultiply.h
index 9e37dda..2d2bffa 100644
--- a/app/operations/layer-modes/gimpoperationmultiply.h
+++ b/app/operations/layer-modes/gimpoperationmultiply.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_multiply_process_pixels (gfloat              *in,
                                                  const GeglRectangle *roi,
                                                  gint                 level,
                                                  GimpLayerBlendTRC    blend_trc, 
-                                                 GimpLayerBlendTRC    composite_trc);
+                                                 GimpLayerBlendTRC    composite_trc,
+                                                 GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_MULTIPLY_H__ */
diff --git a/app/operations/layer-modes/gimpoperationnormal-sse2.c 
b/app/operations/layer-modes/gimpoperationnormal-sse2.c
index c030f89..065dcc4 100644
--- a/app/operations/layer-modes/gimpoperationnormal-sse2.c
+++ b/app/operations/layer-modes/gimpoperationnormal-sse2.c
@@ -32,23 +32,26 @@
 #include <emmintrin.h>
 
 gboolean
-gimp_operation_normal_process_pixels_sse2 (gfloat              *in,
-                                           gfloat              *aux,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_normal_process_pixels_sse2 (gfloat                *in,
+                                           gfloat                *aux,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   /* check alignment */
   if ((((uintptr_t)in) | ((uintptr_t)aux) | ((uintptr_t)out)) & 0x0F)
     {
       return gimp_operation_normal_process_pixels_core (in, aux, mask, out,
                                                         opacity, samples,
-                                                        roi, level, blend_trc, composite_trc);
+                                                        roi, level, blend_trc,
+                                                        composite_trc,
+                                                        composite_mode);
     }
   else
     {
diff --git a/app/operations/layer-modes/gimpoperationnormal-sse4.c 
b/app/operations/layer-modes/gimpoperationnormal-sse4.c
index 844255b..502d3a5 100644
--- a/app/operations/layer-modes/gimpoperationnormal-sse4.c
+++ b/app/operations/layer-modes/gimpoperationnormal-sse4.c
@@ -32,16 +32,17 @@
 #include <smmintrin.h>
 
 gboolean
-gimp_operation_normal_process_pixels_sse4 (gfloat              *in,
-                                           gfloat              *aux,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_normal_process_pixels_sse4 (gfloat                *in,
+                                           gfloat                *aux,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   /* check alignment */
   if ((((uintptr_t)in) | ((uintptr_t)aux) | ((uintptr_t)out)) & 0x0F)
@@ -49,7 +50,8 @@ gimp_operation_normal_process_pixels_sse4 (gfloat              *in,
       return gimp_operation_normal_process_pixels_core (in, aux, mask, out,
                                                         opacity, samples,
                                                         roi, level, blend_trc,
-                                                        composite_trc);
+                                                        composite_trc,
+                                                        composite_mode);
     }
   else
     {
diff --git a/app/operations/layer-modes/gimpoperationnormal.c 
b/app/operations/layer-modes/gimpoperationnormal.c
index b1a6b11..da9f5d4 100644
--- a/app/operations/layer-modes/gimpoperationnormal.c
+++ b/app/operations/layer-modes/gimpoperationnormal.c
@@ -174,20 +174,21 @@ gimp_operation_normal_process (GeglOperation       *operation,
                                gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_normal_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_normal_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_normal_process_pixels_core (gfloat              *in,
-                                           gfloat              *aux,
-                                           gfloat              *mask,
-                                           gfloat              *out,
-                                           gfloat               opacity,
-                                           glong                samples,
-                                           const GeglRectangle *roi,
-                                           gint                 level,
-                                           GimpLayerBlendTRC    blend_trc,
-                                           GimpLayerBlendTRC    composite_trc)
+gimp_operation_normal_process_pixels_core (gfloat                *in,
+                                           gfloat                *aux,
+                                           gfloat                *mask,
+                                           gfloat                *out,
+                                           gfloat                 opacity,
+                                           glong                  samples,
+                                           const GeglRectangle   *roi,
+                                           gint                   level,
+                                           GimpLayerBlendTRC      blend_trc,
+                                           GimpLayerBlendTRC      composite_trc,
+                                           GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationnormal.h 
b/app/operations/layer-modes/gimpoperationnormal.h
index c1ac4fb..f767ec6 100644
--- a/app/operations/layer-modes/gimpoperationnormal.h
+++ b/app/operations/layer-modes/gimpoperationnormal.h
@@ -60,7 +60,8 @@ gboolean gimp_operation_normal_process_pixels_core (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_normal_process_pixels_sse2 (gfloat              *in,
                                                     gfloat              *aux,
@@ -71,7 +72,8 @@ gboolean gimp_operation_normal_process_pixels_sse2 (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 gboolean gimp_operation_normal_process_pixels_sse4 (gfloat              *in,
                                                     gfloat              *aux,
@@ -82,7 +84,8 @@ gboolean gimp_operation_normal_process_pixels_sse4 (gfloat              *in,
                                                     const GeglRectangle *roi,
                                                     gint                 level,
                                                     GimpLayerBlendTRC    blend_trc, 
-                                                    GimpLayerBlendTRC    composite_trc);
+                                                    GimpLayerBlendTRC    composite_trc,
+                                                    GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_NORMAL_H__ */
diff --git a/app/operations/layer-modes/gimpoperationoverlay.c 
b/app/operations/layer-modes/gimpoperationoverlay.c
index 24fae12..e674f0e 100644
--- a/app/operations/layer-modes/gimpoperationoverlay.c
+++ b/app/operations/layer-modes/gimpoperationoverlay.c
@@ -76,28 +76,24 @@ gimp_operation_overlay_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_overlay_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_overlay_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_overlay_process_pixels (gfloat              *in,
-                                       gfloat              *layer,
-                                       gfloat              *mask,
-                                       gfloat              *out,
-                                       gfloat               opacity,
-                                       glong                samples,
-                                       const GeglRectangle *roi,
-                                       gint                 level,
-                                       GimpLayerBlendTRC    blend_trc,
-                                       GimpLayerBlendTRC    composite_trc)
+gimp_operation_overlay_process_pixels (gfloat                *in,
+                                       gfloat                *layer,
+                                       gfloat                *mask,
+                                       gfloat                *out,
+                                       gfloat                 opacity,
+                                       glong                  samples,
+                                       const GeglRectangle   *roi,
+                                       gint                   level,
+                                       GimpLayerBlendTRC      blend_trc,
+                                       GimpLayerBlendTRC      composite_trc,
+                                       GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_overlay
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_overlay);
   return TRUE;
 }
 
diff --git a/app/operations/layer-modes/gimpoperationoverlay.h 
b/app/operations/layer-modes/gimpoperationoverlay.h
index 4b0b394..c92d8bf 100644
--- a/app/operations/layer-modes/gimpoperationoverlay.h
+++ b/app/operations/layer-modes/gimpoperationoverlay.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_overlay_process_pixels (gfloat              *in,
                                                 const GeglRectangle *roi,
                                                 gint                 level,
                                                 GimpLayerBlendTRC    blend_trc, 
-                                                GimpLayerBlendTRC    composite_trc);
+                                                GimpLayerBlendTRC    composite_trc,
+                                                GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_OVERLAY_H__ */
diff --git a/app/operations/layer-modes/gimpoperationreplace.c 
b/app/operations/layer-modes/gimpoperationreplace.c
index 1cce3e1..12450ce 100644
--- a/app/operations/layer-modes/gimpoperationreplace.c
+++ b/app/operations/layer-modes/gimpoperationreplace.c
@@ -75,20 +75,21 @@ gimp_operation_replace_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_replace_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_replace_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_replace_process_pixels (gfloat              *in,
-                                       gfloat              *layer,
-                                       gfloat              *mask,
-                                       gfloat              *out,
-                                       gfloat               opacity,
-                                       glong                samples,
-                                       const GeglRectangle *roi,
-                                       gint                 level,
-                                       GimpLayerBlendTRC    blend_trc,
-                                       GimpLayerBlendTRC    composite_trc)
+gimp_operation_replace_process_pixels (gfloat                *in,
+                                       gfloat                *layer,
+                                       gfloat                *mask,
+                                       gfloat                *out,
+                                       gfloat                 opacity,
+                                       glong                  samples,
+                                       const GeglRectangle   *roi,
+                                       gint                   level,
+                                       GimpLayerBlendTRC      blend_trc,
+                                       GimpLayerBlendTRC      composite_trc,
+                                       GimpLayerCompositeMode composite_mode)
 {
   const gboolean has_mask = mask != NULL;
 
diff --git a/app/operations/layer-modes/gimpoperationreplace.h 
b/app/operations/layer-modes/gimpoperationreplace.h
index 976d62b..ad34751 100644
--- a/app/operations/layer-modes/gimpoperationreplace.h
+++ b/app/operations/layer-modes/gimpoperationreplace.h
@@ -49,16 +49,17 @@ struct _GimpOperationReplaceClass
 
 GType    gimp_operation_replace_get_type       (void) G_GNUC_CONST;
 
-gboolean gimp_operation_replace_process_pixels (gfloat              *in,
-                                                gfloat              *layer,
-                                                gfloat              *mask,
-                                                gfloat              *out,
-                                                gfloat               opacity,
-                                                glong                samples,
-                                                const GeglRectangle *roi,
-                                                gint                 level,
-                                                GimpLayerBlendTRC    blend_trc, 
-                                                GimpLayerBlendTRC    composite_trc);
+gboolean gimp_operation_replace_process_pixels (gfloat                *in,
+                                                gfloat                *layer,
+                                                gfloat                *mask,
+                                                gfloat                *out,
+                                                gfloat                 opacity,
+                                                glong                  samples,
+                                                const GeglRectangle   *roi,
+                                                gint                   level,
+                                                GimpLayerBlendTRC      blend_trc, 
+                                                GimpLayerBlendTRC      composite_trc,
+                                                GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_REPLACE_H__ */
diff --git a/app/operations/layer-modes/gimpoperationscreen.c 
b/app/operations/layer-modes/gimpoperationscreen.c
index 1948df0..90881be 100644
--- a/app/operations/layer-modes/gimpoperationscreen.c
+++ b/app/operations/layer-modes/gimpoperationscreen.c
@@ -77,28 +77,24 @@ gimp_operation_screen_process (GeglOperation       *operation,
                                gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_screen_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_screen_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_screen_process_pixels (gfloat              *in,
-                                      gfloat              *layer,
-                                      gfloat              *mask,
-                                      gfloat              *out,
-                                      gfloat               opacity,
-                                      glong                samples,
-                                      const GeglRectangle *roi,
-                                      gint                 level,
-                                      GimpLayerBlendTRC    blend_trc,
-                                      GimpLayerBlendTRC    composite_trc)
+gimp_operation_screen_process_pixels (gfloat                *in,
+                                      gfloat                *layer,
+                                      gfloat                *mask,
+                                      gfloat                *out,
+                                      gfloat                 opacity,
+                                      glong                  samples,
+                                      const GeglRectangle   *roi,
+                                      gint                   level,
+                                      GimpLayerBlendTRC      blend_trc,
+                                      GimpLayerBlendTRC      composite_trc,
+                                      GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_screen
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+               blend_trc, composite_trc, composite_mode, blendfun_screen);
   return TRUE;
 }
 
diff --git a/app/operations/layer-modes/gimpoperationscreen.h 
b/app/operations/layer-modes/gimpoperationscreen.h
index 026896d..2bcb964 100644
--- a/app/operations/layer-modes/gimpoperationscreen.h
+++ b/app/operations/layer-modes/gimpoperationscreen.h
@@ -58,7 +58,8 @@ gboolean gimp_operation_screen_process_pixels (gfloat              *in,
                                                const GeglRectangle *roi,
                                                gint                 level,
                                                GimpLayerBlendTRC    blend_trc, 
-                                               GimpLayerBlendTRC    composite_trc);
+                                               GimpLayerBlendTRC    composite_trc,
+                                               GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_SCREEN_H__ */
diff --git a/app/operations/layer-modes/gimpoperationsoftlight.c 
b/app/operations/layer-modes/gimpoperationsoftlight.c
index a3521b2..09f3085 100644
--- a/app/operations/layer-modes/gimpoperationsoftlight.c
+++ b/app/operations/layer-modes/gimpoperationsoftlight.c
@@ -93,27 +93,23 @@ gimp_operation_softlight_process (GeglOperation       *operation,
                                   gint                 level)
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
-  return gimp_operation_softlight_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_softlight_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_softlight_process_pixels (gfloat              *in,
-                                         gfloat              *layer,
-                                         gfloat              *mask,
-                                         gfloat              *out,
-                                         gfloat               opacity,
-                                         glong                samples,
-                                         const GeglRectangle *roi,
-                                         gint                 level,
-                                         GimpLayerBlendTRC    blend_trc,
-                                         GimpLayerBlendTRC    composite_trc)
+gimp_operation_softlight_process_pixels (gfloat                *in,
+                                         gfloat                *layer,
+                                         gfloat                *mask,
+                                         gfloat                *out,
+                                         gfloat                 opacity,
+                                         glong                  samples,
+                                         const GeglRectangle   *roi,
+                                         gint                   level,
+                                         GimpLayerBlendTRC      blend_trc,
+                                         GimpLayerBlendTRC      composite_trc,
+                                         GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_softlight
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples,
+     blend_trc, composite_trc, composite_mode, blendfun_softlight);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationsoftlight.h 
b/app/operations/layer-modes/gimpoperationsoftlight.h
index 963800e..52162e7 100644
--- a/app/operations/layer-modes/gimpoperationsoftlight.h
+++ b/app/operations/layer-modes/gimpoperationsoftlight.h
@@ -58,6 +58,7 @@ gboolean gimp_operation_softlight_process_pixels (gfloat              *in,
                                                   const GeglRectangle *roi,
                                                   gint                 level,
                                                   GimpLayerBlendTRC    blend_trc, 
-                                                  GimpLayerBlendTRC    composite_trc);
+                                                  GimpLayerBlendTRC    composite_trc,
+                                                  GimpLayerCompositeMode composite_mode);
 
 #endif /* __GIMP_OPERATION_SOFTLIGHT_H__ */
diff --git a/app/operations/layer-modes/gimpoperationsubtract.c 
b/app/operations/layer-modes/gimpoperationsubtract.c
index 780d59b..e8a1ade 100644
--- a/app/operations/layer-modes/gimpoperationsubtract.c
+++ b/app/operations/layer-modes/gimpoperationsubtract.c
@@ -77,27 +77,23 @@ gimp_operation_subtract_process (GeglOperation       *operation,
 {
   GimpOperationPointLayerMode *layer_mode = (GimpOperationPointLayerMode*)operation;
 
-  return gimp_operation_subtract_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc);
+  return gimp_operation_subtract_process_pixels (in_buf, aux_buf, aux2_buf, out_buf, layer_mode->opacity, 
samples, roi, level, layer_mode->blend_trc, layer_mode->composite_trc, layer_mode->composite_mode);
 }
 
 gboolean
-gimp_operation_subtract_process_pixels (gfloat              *in,
-                                        gfloat              *layer,
-                                        gfloat              *mask,
-                                        gfloat              *out,
-                                        gfloat               opacity,
-                                        glong                samples,
-                                        const GeglRectangle *roi,
-                                        gint                 level,
-                                        GimpLayerBlendTRC    blend_trc,
-                                        GimpLayerBlendTRC    composite_trc)
+gimp_operation_subtract_process_pixels (gfloat                *in,
+                                        gfloat                *layer,
+                                        gfloat                *mask,
+                                        gfloat                *out,
+                                        gfloat                 opacity,
+                                        glong                  samples,
+                                        const GeglRectangle   *roi,
+                                        gint                   level,
+                                        GimpLayerBlendTRC      blend_trc,
+                                        GimpLayerBlendTRC      composite_trc,
+                                        GimpLayerCompositeMode composite_mode)
 {
-  gimp_composite_blend (
-     in, layer, mask, out, opacity, samples,
-     blend_trc,
-     composite_trc,
-     GIMP_LAYER_COMPOSITE_SRC_ATOP,
-     blendfun_subtract
-     );
+  gimp_composite_blend (in, layer, mask, out, opacity, samples, blend_trc,
+                        composite_trc, composite_mode, blendfun_subtract);
   return TRUE;
 }
diff --git a/app/operations/layer-modes/gimpoperationsubtract.h 
b/app/operations/layer-modes/gimpoperationsubtract.h
index fa67cb2..11ae47a 100644
--- a/app/operations/layer-modes/gimpoperationsubtract.h
+++ b/app/operations/layer-modes/gimpoperationsubtract.h
@@ -59,7 +59,8 @@ gboolean gimp_operation_subtract_process_pixels (gfloat              *in,
                                                  const GeglRectangle *roi,
                                                  gint                 level,
                                                  GimpLayerBlendTRC    blend_trc, 
-                                                 GimpLayerBlendTRC    composite_trc);
+                                                 GimpLayerBlendTRC    composite_trc,
+                                                 GimpLayerCompositeMode composite_mode);
 
 
 #endif /* __GIMP_OPERATION_SUBTRACT_H__ */
diff --git a/app/operations/operations-types.h b/app/operations/operations-types.h
index 1f39bd1..8068d07 100644
--- a/app/operations/operations-types.h
+++ b/app/operations/operations-types.h
@@ -55,16 +55,17 @@ typedef struct _GimpCagePoint                   GimpCagePoint;
 
 /*  functions  */
 
-typedef gboolean (* GimpLayerModeFunc) (gfloat              *in,
-                                        gfloat              *aux,
-                                        gfloat              *mask,
-                                        gfloat              *out,
-                                        gfloat               opacity,
-                                        glong                samples,
-                                        const GeglRectangle *roi,
-                                        gint                 level,
-                                        GimpLayerBlendTRC    blend_trc,
-                                        GimpLayerBlendTRC    composite_trc);
+typedef gboolean (* GimpLayerModeFunc) (gfloat                *in,
+                                        gfloat                *aux,
+                                        gfloat                *mask,
+                                        gfloat                *out,
+                                        gfloat                 opacity,
+                                        glong                  samples,
+                                        const GeglRectangle   *roi,
+                                        gint                   level,
+                                        GimpLayerBlendTRC      blend_trc,
+                                        GimpLayerBlendTRC      composite_trc,
+                                        GimpLayerCompositeMode composite_mode);
 
 typedef  void    (* GimpBlendFunc)     (const float         *dest,
                                         const float         *src,


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