diff --git a/app/core/core-enums.c b/app/core/core-enums.c index bf4925db2d..c76109f05e 100644 --- a/app/core/core-enums.c +++ b/app/core/core-enums.c @@ -356,6 +356,8 @@ gimp_layer_mode_get_type (void) { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, "GIMP_LAYER_MODE_PIN_LIGHT_LINEAR", "pin-light-linear" }, { GIMP_LAYER_MODE_LINEAR_LIGHT, "GIMP_LAYER_MODE_LINEAR_LIGHT", "linear-light" }, { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, "GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR", "linear-light-linear" }, + { GIMP_LAYER_MODE_HARD_MIX, "GIMP_LAYER_MODE_HARD_MIX", "hard-mix" }, + { GIMP_LAYER_MODE_HARD_MIX_LINEAR, "GIMP_LAYER_MODE_HARD_MIX_LINEAR", "hard-mix-linear" }, { GIMP_LAYER_MODE_EXCLUSION, "GIMP_LAYER_MODE_EXCLUSION", "exclusion" }, { GIMP_LAYER_MODE_EXCLUSION_LINEAR, "GIMP_LAYER_MODE_EXCLUSION_LINEAR", "exclusion-linear" }, { GIMP_LAYER_MODE_LINEAR_BURN, "GIMP_LAYER_MODE_LINEAR_BURN", "linear-burn" }, @@ -439,6 +441,8 @@ gimp_layer_mode_get_type (void) { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, NC_("layer-mode", "Pin light (linear)"), NULL }, { GIMP_LAYER_MODE_LINEAR_LIGHT, NC_("layer-mode", "Linear light"), NULL }, { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, NC_("layer-mode", "Linear light (linear)"), NULL }, + { GIMP_LAYER_MODE_HARD_MIX, NC_("layer-mode", "Hard mix"), NULL }, + { GIMP_LAYER_MODE_HARD_MIX_LINEAR, NC_("layer-mode", "Hard mix (linear)"), NULL }, { GIMP_LAYER_MODE_EXCLUSION, NC_("layer-mode", "Exclusion"), NULL }, { GIMP_LAYER_MODE_EXCLUSION_LINEAR, NC_("layer-mode", "Exclusion (linear)"), NULL }, { GIMP_LAYER_MODE_LINEAR_BURN, NC_("layer-mode", "Linear burn"), NULL }, diff --git a/app/core/core-enums.h b/app/core/core-enums.h index b027bd5b92..75b59a1914 100644 --- a/app/core/core-enums.h +++ b/app/core/core-enums.h @@ -226,6 +226,8 @@ typedef enum GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, /*< desc="Pin light (linear)" >*/ GIMP_LAYER_MODE_LINEAR_LIGHT, /*< desc="Linear light" >*/ GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, /*< desc="Linear light (linear)" >*/ + GIMP_LAYER_MODE_HARD_MIX, /*< desc="Hard mix" >*/ + GIMP_LAYER_MODE_HARD_MIX_LINEAR, /*< desc="Hard mix (linear)" >*/ GIMP_LAYER_MODE_EXCLUSION, /*< desc="Exclusion" >*/ GIMP_LAYER_MODE_EXCLUSION_LINEAR, /*< desc="Exclusion (linear)" >*/ GIMP_LAYER_MODE_LINEAR_BURN, /*< desc="Linear burn" >*/ diff --git a/app/core/gimp-layer-modes.c b/app/core/gimp-layer-modes.c index 02e0215d50..9e0d0a773a 100644 --- a/app/core/gimp-layer-modes.c +++ b/app/core/gimp-layer-modes.c @@ -54,6 +54,7 @@ static const GimpLayerMode layer_mode_group_default[] = GIMP_LAYER_MODE_VIVID_LIGHT, GIMP_LAYER_MODE_PIN_LIGHT, GIMP_LAYER_MODE_LINEAR_LIGHT, + GIMP_LAYER_MODE_HARD_MIX, GIMP_LAYER_MODE_DIFFERENCE, GIMP_LAYER_MODE_SUBTRACT, @@ -92,6 +93,7 @@ static const GimpLayerMode layer_mode_group_linear[] = GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR, GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, + GIMP_LAYER_MODE_HARD_MIX_LINEAR, GIMP_LAYER_MODE_DIFFERENCE_LINEAR, GIMP_LAYER_MODE_SUBTRACT_LINEAR, @@ -125,6 +127,7 @@ static const GimpLayerMode layer_mode_group_perceptual[] = GIMP_LAYER_MODE_VIVID_LIGHT, GIMP_LAYER_MODE_PIN_LIGHT, GIMP_LAYER_MODE_LINEAR_LIGHT, + GIMP_LAYER_MODE_HARD_MIX, GIMP_LAYER_MODE_DIFFERENCE, GIMP_LAYER_MODE_SUBTRACT, @@ -359,6 +362,13 @@ static const GimpLayerMode layer_mode_groups[][4] = -1 }, + { + GIMP_LAYER_MODE_HARD_MIX, + GIMP_LAYER_MODE_HARD_MIX_LINEAR, + GIMP_LAYER_MODE_HARD_MIX, + -1 + }, + { GIMP_LAYER_MODE_EXCLUSION, GIMP_LAYER_MODE_EXCLUSION_LINEAR, diff --git a/app/operations/layer-modes/gimpoperationlayermode.c b/app/operations/layer-modes/gimpoperationlayermode.c index bfc62b27ff..a47adab474 100644 --- a/app/operations/layer-modes/gimpoperationlayermode.c +++ b/app/operations/layer-modes/gimpoperationlayermode.c @@ -1838,6 +1838,31 @@ blendfun_pin_light (const float *dest, } } +static inline void +blendfun_hard_mix (const float *dest, + const float *src, + float *out, + int samples) +{ + while (samples--) + { + if (dest[ALPHA] != 0.0f && src[ALPHA] != 0.0f) + { + gint c; + + for (c = 0; c < 3; c++) + { + out[c] = dest[c] + src[c] < 1.0f ? 0.0f : 1.0f; + } + } + out[ALPHA] = src[ALPHA]; + + out += 4; + src += 4; + dest += 4; + } +} + static inline void blendfun_exclusion (const float *dest, const float *src, @@ -1863,6 +1888,7 @@ blendfun_exclusion (const float *dest, } } + static inline void dummy_fun(void) { } @@ -1919,6 +1945,8 @@ static inline GimpBlendFunc gimp_layer_mode_get_blend_fun (GimpLayerMode mode) case GIMP_LAYER_MODE_PIN_LIGHT: return blendfun_pin_light; case GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR: case GIMP_LAYER_MODE_LINEAR_LIGHT: return blendfun_linear_light; + case GIMP_LAYER_MODE_HARD_MIX_LINEAR: + case GIMP_LAYER_MODE_HARD_MIX: return blendfun_hard_mix; case GIMP_LAYER_MODE_EXCLUSION_LINEAR: case GIMP_LAYER_MODE_EXCLUSION: return blendfun_exclusion; case GIMP_LAYER_MODE_LINEAR_BURN_LINEAR: @@ -2385,6 +2413,20 @@ static GimpLayerModeInfo gimp_layer_mode_infos[]= GIMP_LAYER_COLOR_SPACE_RGB_LINEAR, GIMP_LAYER_COLOR_SPACE_RGB_LINEAR }, + { GIMP_LAYER_MODE_HARD_MIX, + "gimp:layer-mode", + GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA, + GIMP_LAYER_COMPOSITE_SRC_ATOP, + GIMP_LAYER_COLOR_SPACE_RGB_LINEAR, + GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL + }, + { GIMP_LAYER_MODE_HARD_MIX_LINEAR, + "gimp:layer-mode", + GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA, + GIMP_LAYER_COMPOSITE_SRC_ATOP, + GIMP_LAYER_COLOR_SPACE_RGB_LINEAR, + GIMP_LAYER_COLOR_SPACE_RGB_LINEAR + }, { GIMP_LAYER_MODE_EXCLUSION, "gimp:layer-mode", GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA, diff --git a/app/widgets/gimplayermodecombobox.c b/app/widgets/gimplayermodecombobox.c index 4d727aa48b..733773d684 100644 --- a/app/widgets/gimplayermodecombobox.c +++ b/app/widgets/gimplayermodecombobox.c @@ -391,7 +391,7 @@ gimp_layer_mode_combo_box_fix_default_store (GimpLayerModeComboBox *combo, GIMP_LAYER_MODE_BURN, -1); gimp_layer_mode_combo_box_insert_separator (store, - GIMP_LAYER_MODE_LINEAR_LIGHT, -1); + GIMP_LAYER_MODE_HARD_MIX, -1); gimp_layer_mode_combo_box_insert_separator (store, GIMP_LAYER_MODE_DIVIDE, -1); @@ -437,7 +437,7 @@ gimp_layer_mode_combo_box_fix_linear_store (GimpLayerModeComboBox *combo, GIMP_LAYER_MODE_BURN_LINEAR, -1); gimp_layer_mode_combo_box_insert_separator (store, - GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, -1); + GIMP_LAYER_MODE_HARD_MIX_LINEAR, -1); gimp_layer_mode_combo_box_insert_separator (store, GIMP_LAYER_MODE_DIVIDE_LINEAR, -1); @@ -477,7 +477,7 @@ gimp_layer_mode_combo_box_fix_perceptual_store (GimpLayerModeComboBox *combo, GIMP_LAYER_MODE_BURN, -1); gimp_layer_mode_combo_box_insert_separator (store, - GIMP_LAYER_MODE_LINEAR_LIGHT, -1); + GIMP_LAYER_MODE_HARD_MIX, -1); gimp_layer_mode_combo_box_insert_separator (store, GIMP_LAYER_MODE_DIVIDE, -1); diff --git a/libgimp/gimpenums.h b/libgimp/gimpenums.h index b21de2bcb7..d01a2bf26f 100644 --- a/libgimp/gimpenums.h +++ b/libgimp/gimpenums.h @@ -150,6 +150,8 @@ typedef enum GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, GIMP_LAYER_MODE_LINEAR_LIGHT, GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, + GIMP_LAYER_MODE_HARD_MIX, + GIMP_LAYER_MODE_HARD_MIX_LINEAR, GIMP_LAYER_MODE_EXCLUSION, GIMP_LAYER_MODE_EXCLUSION_LINEAR, GIMP_LAYER_MODE_LINEAR_BURN, diff --git a/tools/pdbgen/enums.pl b/tools/pdbgen/enums.pl index 46a3d20cc7..e60ef6224a 100644 --- a/tools/pdbgen/enums.pl +++ b/tools/pdbgen/enums.pl @@ -771,6 +771,8 @@ package Gimp::CodeGen::enums; GIMP_LAYER_MODE_PIN_LIGHT_LINEAR GIMP_LAYER_MODE_LINEAR_LIGHT GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR + GIMP_LAYER_MODE_HARD_MIX + GIMP_LAYER_MODE_HARD_MIX_LINEAR GIMP_LAYER_MODE_EXCLUSION GIMP_LAYER_MODE_EXCLUSION_LINEAR GIMP_LAYER_MODE_LINEAR_BURN @@ -846,14 +848,16 @@ package Gimp::CodeGen::enums; GIMP_LAYER_MODE_PIN_LIGHT_LINEAR => '64', GIMP_LAYER_MODE_LINEAR_LIGHT => '65', GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR => '66', - GIMP_LAYER_MODE_EXCLUSION => '67', - GIMP_LAYER_MODE_EXCLUSION_LINEAR => '68', - GIMP_LAYER_MODE_LINEAR_BURN => '69', - GIMP_LAYER_MODE_LINEAR_BURN_LINEAR => '70', - GIMP_LAYER_MODE_LUMA_DARKEN_ONLY => '71', - GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY => '72', - GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY => '73', - GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY => '74' } + GIMP_LAYER_MODE_HARD_MIX => '67', + GIMP_LAYER_MODE_HARD_MIX_LINEAR => '68', + GIMP_LAYER_MODE_EXCLUSION => '69', + GIMP_LAYER_MODE_EXCLUSION_LINEAR => '70', + GIMP_LAYER_MODE_LINEAR_BURN => '71', + GIMP_LAYER_MODE_LINEAR_BURN_LINEAR => '72', + GIMP_LAYER_MODE_LUMA_DARKEN_ONLY => '73', + GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY => '74', + GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY => '75', + GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY => '76' } }, GimpBrushApplicationMode => { contig => 1,