From 57360a0ddcf6893808a005b59fdbe7e91fd822ad Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 14 Feb 2017 22:51:47 +0100 Subject: [PATCH] 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 a9cd799fb9..ff7e4cbe53 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 bfe4ef16d9..424abb5dcc 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 4060b1212b..777f221e76 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 75a0adcb32..9586c6fec0 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,