[gimp] Bug 778597 - Eraser paints transparent areas with BG color



commit 57360a0ddcf6893808a005b59fdbe7e91fd822ad
Author: Michael Natterer <mitch gimp org>
Date:   Tue Feb 14 22:51:47 2017 +0100

    Bug 778597 - Eraser paints transparent areas with BG color
    
    Add a "paint_composite_mode" field to GimpLayerModeInfo and set the
    mode of the eraser to SRC_ATOP. Defaulting to SRC_OVER for all
    painting didn't quite do it for all modes.

 app/operations/layer-modes/gimp-layer-modes.c |   94 ++++++++++++++++++++++++-
 app/operations/layer-modes/gimp-layer-modes.h |    2 +
 app/paint/gimppaintcore-loops.c               |    2 +-
 app/paint/gimppaintcore.c                     |    2 +-
 4 files changed, 97 insertions(+), 3 deletions(-)
---
diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c
index a9cd799..ff7e4cb 100644
--- a/app/operations/layer-modes/gimp-layer-modes.c
+++ b/app/operations/layer-modes/gimp-layer-modes.c
@@ -35,6 +35,7 @@ struct _GimpLayerModeInfo
   GimpLayerMode          layer_mode;
   const gchar           *op_name;
   GimpLayerModeFlags     flags;
+  GimpLayerCompositeMode paint_composite_mode;
   GimpLayerCompositeMode composite_mode;
   GimpLayerColorSpace    composite_space;
   GimpLayerColorSpace    blend_space;
@@ -49,6 +50,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:normal",
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_OVER,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
   },
 
   { GIMP_LAYER_MODE_DISSOLVE,
@@ -57,12 +59,14 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_OVER,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
   },
 
   { GIMP_LAYER_MODE_BEHIND,
     "gimp:behind",
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
-    GIMP_LAYER_COMPOSITE_SRC_OVER,
+    GIMP_LAYER_COMPOSITE_DST_ATOP,
+    GIMP_LAYER_COMPOSITE_DST_ATOP
   },
 
   { GIMP_LAYER_MODE_MULTIPLY_LEGACY,
@@ -72,6 +76,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_SCREEN_LEGACY,
@@ -81,6 +86,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_OVERLAY_LEGACY,
@@ -90,6 +96,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_DIFFERENCE_LEGACY,
@@ -99,6 +106,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_ADDITION_LEGACY,
@@ -108,6 +116,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_SUBTRACT_LEGACY,
@@ -117,6 +126,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,
@@ -126,6 +136,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,
@@ -135,6 +146,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_HSV_HUE_LEGACY,
@@ -144,6 +156,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY,
@@ -153,6 +166,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_HSV_COLOR_LEGACY,
@@ -162,6 +176,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_HSV_VALUE_LEGACY,
@@ -171,6 +186,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_DIVIDE_LEGACY,
@@ -180,6 +196,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_DODGE_LEGACY,
@@ -189,6 +206,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_BURN_LEGACY,
@@ -198,6 +216,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_HARDLIGHT_LEGACY,
@@ -207,6 +226,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,
@@ -216,6 +236,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,
@@ -225,6 +246,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,
@@ -234,17 +256,20 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_MODE_IMMUTABLE,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_COLOR_ERASE,
     "gimp:color-erase",
     0,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
   },
 
   { GIMP_LAYER_MODE_OVERLAY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -254,6 +279,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_LAB
@@ -263,6 +289,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_LAB
@@ -272,6 +299,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_LAB
@@ -281,6 +309,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_LAB
@@ -296,11 +325,14 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:behind",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_DST_ATOP,
+    GIMP_LAYER_COMPOSITE_DST_ATOP,
   },
 
   { GIMP_LAYER_MODE_MULTIPLY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -309,6 +341,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_MULTIPLY_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -317,6 +350,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SCREEN,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -325,6 +359,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SCREEN_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -333,6 +368,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_OVERLAY_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -341,6 +377,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DIFFERENCE,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -349,6 +386,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -357,6 +395,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_ADDITION,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -365,6 +404,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_ADDITION_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -373,6 +413,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SUBTRACT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -381,6 +422,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SUBTRACT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -390,6 +432,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -399,6 +442,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -408,6 +452,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -417,6 +462,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -426,6 +472,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -435,6 +482,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -443,6 +491,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DIVIDE,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -451,6 +500,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DIVIDE_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -459,6 +509,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DODGE,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -467,6 +518,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_DODGE_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -475,6 +527,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_BURN,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -483,6 +536,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_BURN_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -491,6 +545,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_HARDLIGHT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -499,6 +554,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -507,6 +563,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SOFTLIGHT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -515,6 +572,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -523,6 +581,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_GRAIN_EXTRACT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -531,6 +590,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -539,6 +599,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_GRAIN_MERGE,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -547,6 +608,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -555,6 +617,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_VIVID_LIGHT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -563,6 +626,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -571,6 +635,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_PIN_LIGHT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -579,6 +644,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -587,6 +653,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LINEAR_LIGHT,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -595,6 +662,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -603,6 +671,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_HARD_MIX,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -611,6 +680,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_HARD_MIX_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -619,6 +689,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_EXCLUSION,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -627,6 +698,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_EXCLUSION_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -635,6 +707,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LINEAR_BURN,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -643,6 +716,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -651,6 +725,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -659,6 +734,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -667,6 +743,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
@@ -675,6 +752,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
   { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
     "gimp:layer-mode",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
     GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
     GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
@@ -684,6 +762,7 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:erase",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
     GIMP_LAYER_COMPOSITE_SRC_ATOP
   },
 
@@ -691,6 +770,8 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     "gimp:replace",
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
   },
 
   { GIMP_LAYER_MODE_ANTI_ERASE,
@@ -698,6 +779,8 @@ static const GimpLayerModeInfo layer_mode_infos[]=
     GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA     |
     GIMP_LAYER_MODE_FLAG_BLEND_SPACE_IMMUTABLE |
     GIMP_LAYER_MODE_FLAG_COMPOSITE_SPACE_IMMUTABLE,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP
   }
 };
 
@@ -1149,6 +1232,15 @@ gimp_layer_mode_get_composite_mode (GimpLayerMode  mode)
   return info->composite_mode;
 }
 
+GimpLayerCompositeMode
+gimp_layer_mode_get_paint_composite_mode (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return GIMP_LAYER_COMPOSITE_SRC_OVER;
+  return info->paint_composite_mode;
+}
+
 const gchar *
 gimp_layer_mode_get_operation (GimpLayerMode  mode)
 {
diff --git a/app/operations/layer-modes/gimp-layer-modes.h b/app/operations/layer-modes/gimp-layer-modes.h
index bfe4ef1..424abb5 100644
--- a/app/operations/layer-modes/gimp-layer-modes.h
+++ b/app/operations/layer-modes/gimp-layer-modes.h
@@ -35,6 +35,8 @@ gboolean          gimp_layer_mode_is_composite_mode_mutable  (GimpLayerMode
 GimpLayerColorSpace      gimp_layer_mode_get_blend_space     (GimpLayerMode       mode);
 GimpLayerColorSpace      gimp_layer_mode_get_composite_space (GimpLayerMode       mode);
 GimpLayerCompositeMode   gimp_layer_mode_get_composite_mode  (GimpLayerMode       mode);
+GimpLayerCompositeMode   gimp_layer_mode_get_paint_composite_mode
+                                                             (GimpLayerMode       mode);
 
 const gchar            * gimp_layer_mode_get_operation       (GimpLayerMode       mode);
 
diff --git a/app/paint/gimppaintcore-loops.c b/app/paint/gimppaintcore-loops.c
index 4060b12..777f221 100644
--- a/app/paint/gimppaintcore-loops.c
+++ b/app/paint/gimppaintcore-loops.c
@@ -319,7 +319,7 @@ do_layer_blend (GeglBuffer    *src_buffer,
   apply_func      = gimp_get_layer_mode_function (paint_mode);
   blend_space     = gimp_layer_mode_get_blend_space (paint_mode);
   composite_space = gimp_layer_mode_get_composite_space (paint_mode);
-  composite_mode  = GIMP_LAYER_COMPOSITE_SRC_OVER;
+  composite_mode  = gimp_layer_mode_get_paint_composite_mode (paint_mode);
 
   if (linear)
     iterator_format = babl_format ("RGBA float");
diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c
index 75a0adc..9586c6f 100644
--- a/app/paint/gimppaintcore.c
+++ b/app/paint/gimppaintcore.c
@@ -905,7 +905,7 @@ gimp_paint_core_paste (GimpPaintCore            *core,
       gimp_applicator_set_mode (core->applicator, paint_mode,
                                 GIMP_LAYER_COLOR_SPACE_AUTO,
                                 GIMP_LAYER_COLOR_SPACE_AUTO,
-                                GIMP_LAYER_COMPOSITE_SRC_OVER);
+                                gimp_layer_mode_get_paint_composite_mode (paint_mode));
 
       /*  apply the paint area to the image  */
       gimp_applicator_blit (core->applicator,


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