[gimp] app: add mono-mix layer mode
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add mono-mix layer mode
- Date: Fri, 10 Mar 2017 21:39:08 +0000 (UTC)
commit c6c0899655740869ef401599e16d9c8e16853f80
Author: Ell <ell_se yahoo com>
Date: Fri Mar 10 16:33:14 2017 -0500
app: add mono-mix layer mode
Calculates the dot product of the two input colors, and uses that
as the value for all the output color's components. Basically,
a per-pixel mono mixer.
Useful for custom desaturation, component extraction, and crazier
stuff (bump mapping!)
app/core/gimpimage.c | 1 +
app/operations/layer-modes/gimp-layer-modes.c | 18 +++++++++++-
.../layer-modes/gimpoperationlayermode.c | 30 ++++++++++++++++++++
app/operations/operations-enums.c | 2 +
app/operations/operations-enums.h | 1 +
libgimp/gimpenums.h | 3 +-
tools/pdbgen/enums.pl | 6 ++-
7 files changed, 57 insertions(+), 4 deletions(-)
---
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index f936b8d..cd2e487 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -2464,6 +2464,7 @@ gimp_image_get_xcf_version (GimpImage *image,
case GIMP_LAYER_MODE_LUMINANCE:
case GIMP_LAYER_MODE_COLOR_ERASE:
case GIMP_LAYER_MODE_ERASE:
+ case GIMP_LAYER_MODE_MONO_MIX:
version = MAX (10, version);
break;
diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c
index fd37a7b..1a61e50 100644
--- a/app/operations/layer-modes/gimp-layer-modes.c
+++ b/app/operations/layer-modes/gimp-layer-modes.c
@@ -825,6 +825,17 @@ static const GimpLayerModeInfo layer_mode_infos[] =
.composite_space = GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
},
+ { GIMP_LAYER_MODE_MONO_MIX,
+
+ .op_name = "gimp:layer-mode",
+ .function = gimp_operation_layer_mode_process_pixels,
+ .context = GIMP_LAYER_MODE_CONTEXT_ALL,
+ .paint_composite_mode = GIMP_LAYER_COMPOSITE_SRC_OVER,
+ .composite_mode = GIMP_LAYER_COMPOSITE_SRC_ATOP,
+ .composite_space = GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+ .blend_space = GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+ },
+
{ GIMP_LAYER_MODE_REPLACE,
.op_name = "gimp:replace",
@@ -909,7 +920,8 @@ static const GimpLayerMode layer_mode_group_default[] =
GIMP_LAYER_MODE_SEPARATOR,
GIMP_LAYER_MODE_EXCLUSION,
- GIMP_LAYER_MODE_LINEAR_BURN
+ GIMP_LAYER_MODE_LINEAR_BURN,
+ GIMP_LAYER_MODE_MONO_MIX
};
static const GimpLayerMode layer_mode_group_legacy[] =
@@ -1088,6 +1100,10 @@ static const GimpLayerMode layer_mode_groups[][2] =
[GIMP_LAYER_MODE_GROUP_LEGACY ] = -1
},
+ { [GIMP_LAYER_MODE_GROUP_DEFAULT] = GIMP_LAYER_MODE_MONO_MIX,
+ [GIMP_LAYER_MODE_GROUP_LEGACY ] = -1
+ },
+
{ [GIMP_LAYER_MODE_GROUP_DEFAULT] = GIMP_LAYER_MODE_REPLACE,
[GIMP_LAYER_MODE_GROUP_LEGACY ] = -1
},
diff --git a/app/operations/layer-modes/gimpoperationlayermode.c
b/app/operations/layer-modes/gimpoperationlayermode.c
index ee2bf8a..dd3b863 100644
--- a/app/operations/layer-modes/gimpoperationlayermode.c
+++ b/app/operations/layer-modes/gimpoperationlayermode.c
@@ -2241,6 +2241,35 @@ blendfun_color_erase (const float *dest,
}
static inline void
+blendfun_mono_mix (const float *dest,
+ const float *src,
+ float *out,
+ int samples)
+{
+ while (samples--)
+ {
+ if (dest[ALPHA] != 0.0f && src[ALPHA] != 0.0f)
+ {
+ gfloat value = 0.0f;
+ gint c;
+
+ for (c = 0; c < 3; c++)
+ {
+ value += dest[c] * src[c];
+ }
+
+ out[RED] = out[GREEN] = out[BLUE] = value;
+ }
+
+ out[ALPHA] = src[ALPHA];
+
+ out += 4;
+ src += 4;
+ dest += 4;
+ }
+}
+
+static inline void
blendfun_dummy (const float *dest,
const float *src,
float *out,
@@ -2289,6 +2318,7 @@ gimp_layer_mode_get_blend_fun (GimpLayerMode mode)
case GIMP_LAYER_MODE_LINEAR_BURN: return blendfun_linear_burn;
case GIMP_LAYER_MODE_COLOR_ERASE_LEGACY:
case GIMP_LAYER_MODE_COLOR_ERASE: return blendfun_color_erase;
+ case GIMP_LAYER_MODE_MONO_MIX: return blendfun_mono_mix;
case GIMP_LAYER_MODE_DISSOLVE:
case GIMP_LAYER_MODE_BEHIND_LEGACY:
diff --git a/app/operations/operations-enums.c b/app/operations/operations-enums.c
index 5dfec3a..75fb2b2 100644
--- a/app/operations/operations-enums.c
+++ b/app/operations/operations-enums.c
@@ -140,6 +140,7 @@ gimp_layer_mode_get_type (void)
{ GIMP_LAYER_MODE_LUMINANCE, "GIMP_LAYER_MODE_LUMINANCE", "luminance" },
{ GIMP_LAYER_MODE_COLOR_ERASE, "GIMP_LAYER_MODE_COLOR_ERASE", "color-erase" },
{ GIMP_LAYER_MODE_ERASE, "GIMP_LAYER_MODE_ERASE", "erase" },
+ { GIMP_LAYER_MODE_MONO_MIX, "GIMP_LAYER_MODE_MONO_MIX", "mono-mix" },
{ GIMP_LAYER_MODE_REPLACE, "GIMP_LAYER_MODE_REPLACE", "replace" },
{ GIMP_LAYER_MODE_ANTI_ERASE, "GIMP_LAYER_MODE_ANTI_ERASE", "anti-erase" },
{ 0, NULL, NULL }
@@ -206,6 +207,7 @@ gimp_layer_mode_get_type (void)
{ GIMP_LAYER_MODE_LUMINANCE, NC_("layer-mode", "Luminance"), NULL },
{ GIMP_LAYER_MODE_COLOR_ERASE, NC_("layer-mode", "Color erase"), NULL },
{ GIMP_LAYER_MODE_ERASE, NC_("layer-mode", "Erase"), NULL },
+ { GIMP_LAYER_MODE_MONO_MIX, NC_("layer-mode", "Mono mix"), NULL },
{ GIMP_LAYER_MODE_REPLACE, NC_("layer-mode", "Replace"), NULL },
{ GIMP_LAYER_MODE_ANTI_ERASE, NC_("layer-mode", "Anti erase"), NULL },
{ 0, NULL, NULL }
diff --git a/app/operations/operations-enums.h b/app/operations/operations-enums.h
index 2a80ce8..ef863b2 100644
--- a/app/operations/operations-enums.h
+++ b/app/operations/operations-enums.h
@@ -118,6 +118,7 @@ typedef enum
GIMP_LAYER_MODE_LUMINANCE, /*< desc="Luminance" >*/
GIMP_LAYER_MODE_COLOR_ERASE, /*< desc="Color erase" >*/
GIMP_LAYER_MODE_ERASE, /*< desc="Erase" >*/
+ GIMP_LAYER_MODE_MONO_MIX, /*< desc="Mono mix" >*/
/* Internal modes, not available to the PDB, must be kept at the end */
GIMP_LAYER_MODE_REPLACE, /*< pdb-skip, desc="Replace" >*/
diff --git a/libgimp/gimpenums.h b/libgimp/gimpenums.h
index 85e4f11..8a4c105 100644
--- a/libgimp/gimpenums.h
+++ b/libgimp/gimpenums.h
@@ -153,7 +153,8 @@ typedef enum
GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
GIMP_LAYER_MODE_LUMINANCE,
GIMP_LAYER_MODE_COLOR_ERASE,
- GIMP_LAYER_MODE_ERASE
+ GIMP_LAYER_MODE_ERASE,
+ GIMP_LAYER_MODE_MONO_MIX
} GimpLayerMode;
diff --git a/tools/pdbgen/enums.pl b/tools/pdbgen/enums.pl
index dfb3618..93512e1 100644
--- a/tools/pdbgen/enums.pl
+++ b/tools/pdbgen/enums.pl
@@ -747,7 +747,8 @@ package Gimp::CodeGen::enums;
GIMP_LAYER_MODE_LUMA_DARKEN_ONLY
GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY
GIMP_LAYER_MODE_LUMINANCE
- GIMP_LAYER_MODE_COLOR_ERASE GIMP_LAYER_MODE_ERASE) ],
+ GIMP_LAYER_MODE_COLOR_ERASE GIMP_LAYER_MODE_ERASE
+ GIMP_LAYER_MODE_MONO_MIX) ],
mapping => { GIMP_LAYER_MODE_NORMAL_LEGACY => '0',
GIMP_LAYER_MODE_DISSOLVE => '1',
GIMP_LAYER_MODE_BEHIND_LEGACY => '2',
@@ -806,7 +807,8 @@ package Gimp::CodeGen::enums;
GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY => '55',
GIMP_LAYER_MODE_LUMINANCE => '56',
GIMP_LAYER_MODE_COLOR_ERASE => '57',
- GIMP_LAYER_MODE_ERASE => '58' }
+ GIMP_LAYER_MODE_ERASE => '58',
+ GIMP_LAYER_MODE_MONO_MIX => '59' }
},
GimpConvertDitherType =>
{ contig => 1,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]