31
34
#include "gimp-intl.h"
37
static void desaturate_region_lightness (gpointer data,
41
static void desaturate_region_luminosity (gpointer data,
45
static void desaturate_region_average (gpointer data,
35
gimp_drawable_desaturate (GimpDrawable *drawable)
51
gimp_drawable_desaturate (GimpDrawable *drawable,
52
GimpDesaturateMode mode)
37
PixelRegion srcPR, destPR;
41
gint lightness, min, max;
44
gint x, y, width, height;
54
PixelRegion srcPR, destPR;
55
PixelProcessorFunc function;
46
60
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
47
61
g_return_if_fail (gimp_drawable_is_rgb (drawable));
48
62
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
50
has_alpha = gimp_drawable_has_alpha (drawable);
52
64
if (! gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
55
pixel_region_init (&srcPR, gimp_drawable_data (drawable),
56
x, y, width, height, FALSE);
57
pixel_region_init (&destPR, gimp_drawable_shadow (drawable),
58
x, y, width, height, TRUE);
60
for (pr = pixel_regions_register (2, &srcPR, &destPR);
62
pr = pixel_regions_process (pr))
73
for (j = 0; j < srcPR.w; j++)
75
max = MAX (s[RED_PIX], s[GREEN_PIX]);
76
max = MAX (max, s[BLUE_PIX]);
77
min = MIN (s[RED_PIX], s[GREEN_PIX]);
78
min = MIN (min, s[BLUE_PIX]);
80
lightness = (max + min) / 2;
82
d[RED_PIX] = lightness;
83
d[GREEN_PIX] = lightness;
84
d[BLUE_PIX] = lightness;
87
d[ALPHA_PIX] = s[ALPHA_PIX];
93
src += srcPR.rowstride;
94
dest += destPR.rowstride;
69
case GIMP_DESATURATE_LIGHTNESS:
70
function = (PixelProcessorFunc) desaturate_region_lightness;
74
case GIMP_DESATURATE_LUMINOSITY:
75
function = (PixelProcessorFunc) desaturate_region_luminosity;
78
case GIMP_DESATURATE_AVERAGE:
79
function = (PixelProcessorFunc) desaturate_region_average;
83
g_return_if_reached ();
87
has_alpha = gimp_drawable_has_alpha (drawable);
89
pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
90
x, y, width, height, FALSE);
91
pixel_region_init (&destPR, gimp_drawable_get_shadow_tiles (drawable),
92
x, y, width, height, TRUE);
94
pixel_regions_process_parallel (function, GINT_TO_POINTER (has_alpha),
98
97
gimp_drawable_merge_shadow (drawable, TRUE, _("Desaturate"));
100
99
gimp_drawable_update (drawable, x, y, width, height);
103
desaturate_region_lightness (gpointer data,
107
const guchar *src = srcPR->data;
108
guchar *dest = destPR->data;
110
gboolean has_alpha = GPOINTER_TO_INT (data);
114
const guchar *s = src;
118
for (j = 0; j < srcPR->w; j++)
123
max = MAX (s[RED_PIX], s[GREEN_PIX]);
124
max = MAX (max, s[BLUE_PIX]);
125
min = MIN (s[RED_PIX], s[GREEN_PIX]);
126
min = MIN (min, s[BLUE_PIX]);
128
lightness = (max + min) / 2;
130
d[RED_PIX] = lightness;
131
d[GREEN_PIX] = lightness;
132
d[BLUE_PIX] = lightness;
135
d[ALPHA_PIX] = s[ALPHA_PIX];
141
src += srcPR->rowstride;
142
dest += destPR->rowstride;
147
desaturate_region_luminosity (gpointer data,
151
const guchar *src = srcPR->data;
152
guchar *dest = destPR->data;
154
gboolean has_alpha = GPOINTER_TO_INT (data);
158
const guchar *s = src;
162
for (j = 0; j < srcPR->w; j++)
164
gint luminosity = GIMP_RGB_LUMINANCE (s[RED_PIX],
168
d[RED_PIX] = luminosity;
169
d[GREEN_PIX] = luminosity;
170
d[BLUE_PIX] = luminosity;
173
d[ALPHA_PIX] = s[ALPHA_PIX];
179
src += srcPR->rowstride;
180
dest += destPR->rowstride;
185
desaturate_region_average (gpointer data,
189
const guchar *src = srcPR->data;
190
guchar *dest = destPR->data;
192
gboolean has_alpha = GPOINTER_TO_INT (data);
196
const guchar *s = src;
200
for (j = 0; j < srcPR->w; j++)
202
gint average = (s[RED_PIX] + s[GREEN_PIX] + s[BLUE_PIX] + 1) / 3;
204
d[RED_PIX] = average;
205
d[GREEN_PIX] = average;
206
d[BLUE_PIX] = average;
209
d[ALPHA_PIX] = s[ALPHA_PIX];
215
src += srcPR->rowstride;
216
dest += destPR->rowstride;