1
/* The GIMP -- an image manipulation program
1
/* GIMP - The GNU Image Manipulation Program
2
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
4
* This program is free software; you can redistribute it and/or modify
32
32
/* ---------- Brightness/Contrast -----------*/
34
typedef struct B_C_struct
36
36
gdouble brightness;
38
} BrightnessContrastLutData;
41
brightness_contrast_lut_func (B_C_struct *data,
41
brightness_contrast_lut_func (BrightnessContrastLutData *data,
49
48
/* return the original value for the alpha channel */
50
49
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
57
56
value = value + ((1.0 - value) * data->brightness);
60
if (data->contrast < 0.0)
70
nvalue = 0.5 * pow (nvalue * 2.0 , (double) (1.0 + data->contrast));
87
power = (data->contrast == 1.0) ? 127 : 1.0 / (1.0 - data->contrast);
88
nvalue = 0.5 * pow (2.0 * nvalue, power);
58
slant = tan ((data->contrast + 1) * G_PI_4);
59
value = (value - 0.5) * slant + 0.5;
100
brightness_contrast_lut_new (gdouble brightness,
106
lut = gimp_lut_new ();
108
brightness_contrast_lut_setup (lut, brightness, contrast, n_channels);
114
65
brightness_contrast_lut_setup (GimpLut *lut,
70
BrightnessContrastLutData data;
121
72
g_return_if_fail (lut != NULL);
124
75
data.contrast = contrast;
126
77
gimp_lut_setup (lut, (GimpLutFunc) brightness_contrast_lut_func,
127
(gpointer) &data, n_channels);
78
(gpointer) &data, n_channels);
82
brightness_contrast_lut_new (gdouble brightness,
86
GimpLut *lut = gimp_lut_new ();
88
brightness_contrast_lut_setup (lut, brightness, contrast, n_channels);
130
93
/* ---------------- invert ------------------ */
133
96
invert_lut_func (gpointer unused,
138
101
/* don't invert the alpha channel */
139
102
if ((n_channels == 2 || n_channels == 4) && channel == n_channels -1)
142
105
return 1.0 - value;
109
invert_lut_setup (GimpLut *lut,
112
g_return_if_fail (lut != NULL);
114
gimp_lut_setup_exact (lut, (GimpLutFunc) invert_lut_func,
146
119
invert_lut_new (gint n_channels)
150
lut = gimp_lut_new ();
121
GimpLut *lut = gimp_lut_new ();
152
123
invert_lut_setup (lut, n_channels);
158
invert_lut_setup (GimpLut *lut,
161
g_return_if_fail (lut != NULL);
163
gimp_lut_setup_exact (lut, (GimpLutFunc) invert_lut_func,
167
128
/* ---------------- add (or subract)------------------ */
170
131
add_lut_func (gdouble *amount,
175
136
/* don't change the alpha channel */
176
137
if ((n_channels == 2 || n_channels == 4) && channel == n_channels -1)
179
140
return (value + *amount);
144
add_lut_setup (GimpLut *lut,
148
g_return_if_fail (lut != NULL);
150
gimp_lut_setup (lut, (GimpLutFunc) add_lut_func,
151
(gpointer) &amount, n_channels);
183
155
add_lut_new (gdouble amount,
188
lut = gimp_lut_new ();
158
GimpLut *lut = gimp_lut_new ();
190
160
add_lut_setup (lut, amount, n_channels);
196
add_lut_setup (GimpLut *lut,
200
g_return_if_fail (lut != NULL);
202
gimp_lut_setup (lut, (GimpLutFunc) add_lut_func,
203
(gpointer) &amount, n_channels);
206
165
/* ---------------- intersect (MIN (pixel, value)) ------------------ */
209
168
intersect_lut_func (gdouble *min,
214
173
/* don't change the alpha channel */
215
174
if ((n_channels == 2 || n_channels == 4) && channel == n_channels -1)
218
177
return MIN (value, *min);
181
intersect_lut_setup (GimpLut *lut,
185
g_return_if_fail (lut != NULL);
187
gimp_lut_setup_exact (lut, (GimpLutFunc) intersect_lut_func,
188
(gpointer) &value , n_channels);
222
192
intersect_lut_new (gdouble value,
227
lut = gimp_lut_new ();
195
GimpLut *lut = gimp_lut_new ();
229
197
intersect_lut_setup (lut, value, n_channels);
235
intersect_lut_setup (GimpLut *lut,
239
g_return_if_fail (lut != NULL);
241
gimp_lut_setup_exact (lut, (GimpLutFunc) intersect_lut_func,
242
(gpointer) &value , n_channels);
245
202
/* ---------------- Threshold ------------------ */
248
205
threshold_lut_func (gdouble *min,
253
210
/* don't change the alpha channel */
254
211
if ((n_channels == 2 || n_channels == 4) && channel == n_channels -1)
221
threshold_lut_setup (GimpLut *lut,
225
g_return_if_fail (lut != NULL);
227
gimp_lut_setup_exact (lut, (GimpLutFunc) threshold_lut_func,
228
(gpointer) &value , n_channels);
264
232
threshold_lut_new (gdouble value,
269
lut = gimp_lut_new ();
235
GimpLut *lut = gimp_lut_new ();
271
237
threshold_lut_setup (lut, value, n_channels);
277
threshold_lut_setup (GimpLut *lut,
281
g_return_if_fail (lut != NULL);
283
gimp_lut_setup_exact (lut, (GimpLutFunc) threshold_lut_func,
284
(gpointer) &value , n_channels);
287
242
/* --------------- posterize ---------------- */
290
245
posterize_lut_func (gint *ilevels,
267
posterize_lut_setup (GimpLut *lut,
271
g_return_if_fail (lut != NULL);
273
gimp_lut_setup_exact (lut, (GimpLutFunc) posterize_lut_func,
274
(gpointer) &levels, n_channels);
312
278
posterize_lut_new (gint levels,
317
lut = gimp_lut_new ();
281
GimpLut *lut = gimp_lut_new ();
319
283
posterize_lut_setup (lut, levels, n_channels);
325
posterize_lut_setup (GimpLut *lut,
329
g_return_if_fail (lut != NULL);
331
gimp_lut_setup_exact (lut, (GimpLutFunc) posterize_lut_func,
332
(gpointer) &levels, n_channels);
335
288
/* --------------- equalize ------------- */
357
310
return i / 255.0;
361
eq_histogram_lut_new (GimpHistogram *histogram,
366
g_return_val_if_fail (histogram != NULL, NULL);
368
lut = gimp_lut_new ();
370
eq_histogram_lut_setup (lut, histogram, n_channels);
376
eq_histogram_lut_setup (GimpLut *lut,
314
equalize_lut_setup (GimpLut *lut,
381
319
hist_lut_struct hlut;
400
338
/* Find intermediate points */
402
340
sum = (gimp_histogram_get_channel (hist, k, 0) +
403
gimp_histogram_get_channel (hist, k, 1));
341
gimp_histogram_get_channel (hist, k, 1));
405
343
for (i = 1; i < 256; i++)
407
desired = i * pixels_per_value;
409
while (sum <= desired)
412
sum += gimp_histogram_get_channel (hist, k, j + 1);
416
dif = sum - gimp_histogram_get_channel (hist, k, j);
418
if ((sum - desired) > (dif / 2.0))
421
hlut.part[k][i] = j + 1;
345
desired = i * pixels_per_value;
347
while (sum <= desired)
350
sum += gimp_histogram_get_channel (hist, k, j + 1);
354
dif = sum - gimp_histogram_get_channel (hist, k, j);
356
if ((sum - desired) > (dif / 2.0))
359
hlut.part[k][i] = j + 1;
425
363
gimp_lut_setup (lut, (GimpLutFunc) equalize_lut_func,
426
(gpointer) &hlut, n_channels);
364
(gpointer) &hlut, n_channels);
368
equalize_lut_new (GimpHistogram *histogram,
373
g_return_val_if_fail (histogram != NULL, NULL);
375
lut = gimp_lut_new ();
377
equalize_lut_setup (lut, histogram, n_channels);