plug-ins: don't use gimp_rgb_to_hsv_int() and gimp_hsv_to_rgb_int()

Use the default APIs using GimpRGB and GimpHSV structs instead.

This also changes/fixes the colors in all affected plug-ins which were
broken/restricted in hue range ever since the _int() functions were
changed from a 0..255 to 0..360 hue range 15 years ago in commit
d93c2f61c8.
This commit is contained in:
Michael Natterer 2018-10-22 12:50:11 +02:00
parent 075ba4eccc
commit befe80bd08
3 changed files with 96 additions and 50 deletions

View File

@ -746,17 +746,19 @@ CML_main_function (gboolean preview_p)
index < MIN (cell_num, width_by_pixel / VALS.scale);
index++)
{
guchar buffer[4];
int rgbi[3];
int i;
guchar buffer[4];
GimpRGB rgb;
GimpHSV hsv;
gimp_pixel_rgn_get_pixel (&src_rgn, buffer,
x + (index * VALS.scale), y);
for (i = 0; i < 3; i++) rgbi[i] = buffer[i];
gimp_rgb_to_hsv_int (rgbi, rgbi + 1, rgbi + 2);
hues[index] = (gdouble) rgbi[0] / (gdouble) 255;
sats[index] = (gdouble) rgbi[1] / (gdouble) 255;
vals[index] = (gdouble) rgbi[2] / (gdouble) 255;
gimp_rgb_set_uchar (&rgb, buffer[0], buffer[1], buffer[2]);
gimp_rgb_to_hsv (&rgb, &hsv);
hues[index] = hsv.h;
sats[index] = hsv.s;
vals[index] = hsv.v;
}
}
@ -795,7 +797,21 @@ CML_main_function (gboolean preview_p)
v = b = CANNONIZE (VALS.val, vals[dx]);
if (! dest_is_gray)
gimp_hsv_to_rgb_int (&r, &g, &b);
{
GimpHSV hsv;
GimpRGB rgb;
gimp_hsv_set (&hsv,
(gdouble) h / 255.0,
(gdouble) s / 255.0,
(gdouble) v / 255.0);
gimp_hsv_to_rgb (&hsv, &rgb);
r = ROUND (rgb.r * 255.0);
g = ROUND (rgb.g * 255.0);
b = ROUND (rgb.b * 255.0);
}
/* render destination */
for (offset_y = 0;
@ -821,12 +837,29 @@ CML_main_function (gboolean preview_p)
}
else
{
gimp_rgb_to_hsv_int (rgbi, rgbi + 1, rgbi + 2);
GimpRGB rgb;
GimpHSV hsv;
r = (VALS.hue.function == CML_KEEP_VALUES) ? rgbi[0] : h;
g = (VALS.sat.function == CML_KEEP_VALUES) ? rgbi[1] : s;
b = (VALS.val.function == CML_KEEP_VALUES) ? rgbi[2] : v;
gimp_hsv_to_rgb_int (&r, &g, &b);
rgb.r = (gdouble) rgbi[0] / 255.0;
rgb.g = (gdouble) rgbi[1] / 255.0;
rgb.b = (gdouble) rgbi[2] / 255.0;
gimp_rgb_to_hsv (&rgb, &hsv);
if (VALS.hue.function != CML_KEEP_VALUES)
hsv.h = (gdouble) h / 255.0;
if (VALS.sat.function != CML_KEEP_VALUES)
hsv.s = (gdouble) s / 255.0;
if (VALS.val.function != CML_KEEP_VALUES)
hsv.v = (gdouble) v / 255.0;
gimp_hsv_to_rgb (&hsv, &rgb);
r = ROUND (rgb.r * 255.0);
g = ROUND (rgb.g * 255.0);
b = ROUND (rgb.b * 255.0);
}
}
@ -1175,7 +1208,6 @@ CML_explorer_dialog (void)
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *abox;
GtkWidget *bbox;
GtkWidget *button;
gboolean run;
@ -1775,6 +1807,8 @@ function_graph_draw (GtkWidget *widget,
{
gint x, y;
gint rgbi[3];
GimpHSV hsv;
GimpRGB rgb;
gint channel_id = GPOINTER_TO_INT (data[0]);
CML_PARAM *param = data[1];
@ -1788,14 +1822,20 @@ function_graph_draw (GtkWidget *widget,
rgbi[0] = rgbi[1] = rgbi[2] = 127;
if ((0 <= channel_id) && (channel_id <= 2))
rgbi[channel_id] = CANNONIZE ((*param), ((gdouble) x / (gdouble) 255));
gimp_hsv_to_rgb_int (rgbi, rgbi+1, rgbi+2);
hsv.h = (gdouble) rgbi[0] / 255.0;
hsv.s = (gdouble) rgbi[1] / 255.0;
hsv.v = (gdouble) rgbi[2] / 255.0;
gimp_hsv_to_rgb (&hsv, &rgb);
for (y = 0; y < GRAPHSIZE; y++)
{
GIMP_CAIRO_RGB24_SET_PIXEL((img+(y*img_stride+x*4)),
rgbi[0],
rgbi[1],
rgbi[2]);
}
{
GIMP_CAIRO_RGB24_SET_PIXEL((img+(y*img_stride+x*4)),
ROUND (rgb.r * 255.0),
ROUND (rgb.g * 255.0),
ROUND (rgb.b * 255.0));
}
}
cairo_surface_mark_dirty (buffer);

View File

@ -1027,7 +1027,6 @@ fspike (GimpPixelRgn *src_rgn,
gdouble in;
gdouble theta;
gdouble sfac;
gint r, g, b;
GimpTile *tile = NULL;
gint row, col;
gint i;
@ -1090,30 +1089,32 @@ fspike (GimpPixelRgn *src_rgn,
if (svals.random_hue > 0.0 || svals.random_saturation > 0.0)
{
r = 255 - color[0];
g = 255 - color[1];
b = 255 - color[2];
GimpRGB rgb;
GimpHSV hsv;
gimp_rgb_to_hsv_int (&r, &g, &b);
rgb.r = (gdouble) (255 - color[0]) / 255.0;
rgb.g = (gdouble) (255 - color[1]) / 255.0;
rgb.b = (gdouble) (255 - color[2]) / 255.0;
r += svals.random_hue * g_rand_double_range (gr, -0.5, 0.5) * 255;
gimp_rgb_to_hsv (&rgb, &hsv);
if (r >= 255)
r -= 255;
else if (r < 0)
r += 255;
hsv.h += svals.random_hue * g_rand_double_range (gr, -0.5, 0.5);
b += (svals.random_saturation *
g_rand_double_range (gr, -1.0, 1.0)) * 255;
if (hsv.h >= 1.0)
hsv.h -= 1.0;
else if (hsv.h < 0.0)
hsv.h += 1.0;
if (b > 255)
b = 255;
hsv.v += (svals.random_saturation *
g_rand_double_range (gr, -1.0, 1.0));
gimp_hsv_to_rgb_int (&r, &g, &b);
hsv.v = CLAMP (hsv.v, 0.0, 1.0);
color[0] = 255 - r;
color[1] = 255 - g;
color[2] = 255 - b;
gimp_hsv_to_rgb (&hsv, &rgb);
color[0] = 255 - ROUND (rgb.r * 255.0);
color[1] = 255 - ROUND (rgb.g * 255.0);
color[2] = 255 - ROUND (rgb.b * 255.0);
}
dx = 0.2 * cos (theta * G_PI / 180.0);

View File

@ -1856,19 +1856,24 @@ calc_sample_one_gradient (void)
{
for (j = 0; j < GRADIENT_RESOLUTION; j++)
{
gint r, g, b;
GimpRGB rgb;
GimpHSV hsv;
r = gradient[j*4];
g = gradient[j*4+1];
b = gradient[j*4+2];
rgb.r = (gdouble) gradient[j*4] / 255.0;
rgb.g = (gdouble) gradient[j*4+1] / 255.0;
rgb.b = (gdouble) gradient[j*4+2] / 255.0;
gimp_rgb_to_hsv_int (&r, &g, &b);
r = (r + hue) % 256;
gimp_hsv_to_rgb_int (&r, &g, &b);
gimp_rgb_to_hsv (&rgb, &hsv);
gradient[j*4] = r;
gradient[j*4+1] = g;
gradient[j*4+2] = b;
hsv.h = (hsv.h + ((gdouble) hue / 255.0));
if (hsv.h > 1.0)
hsv.h -= 1.0;
gimp_hsv_to_rgb (&hsv, &rgb);
gradient[j*4] = ROUND (rgb.r * 255.0);
gradient[j*4+1] = ROUND (rgb.g * 255.0);
gradient[j*4+2] = ROUND (rgb.b * 255.0);
}
}
}