[gimp] libgimpwidgets: mark out-of-gamut colors also in the RGB and HSV color areas
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpwidgets: mark out-of-gamut colors also in the RGB and HSV color areas
- Date: Thu, 18 May 2017 16:01:22 +0000 (UTC)
commit 9d482309bb061889bc02c047a1f319860b5fd6ee
Author: Michael Natterer <mitch gimp org>
Date: Thu May 18 17:59:49 2017 +0200
libgimpwidgets: mark out-of-gamut colors also in the RGB and HSV color areas
instead of showing weird clipped or wrapped RGB values.
libgimpwidgets/gimpcolorselect.c | 186 ++++++++++++++++++++++++++------------
1 files changed, 126 insertions(+), 60 deletions(-)
---
diff --git a/libgimpwidgets/gimpcolorselect.c b/libgimpwidgets/gimpcolorselect.c
index e449c63..99e5d5f 100644
--- a/libgimpwidgets/gimpcolorselect.c
+++ b/libgimpwidgets/gimpcolorselect.c
@@ -1465,17 +1465,27 @@ color_select_render_lch_hue (ColorSelectFill *csf)
static void
color_select_render_red_green (ColorSelectFill *csf)
{
- guchar *p = csf->buffer;
- gint i, g, b;
- gfloat r, dr;
+ guchar *p = csf->buffer;
+ gfloat r = 0;
+ gfloat g = 0;
+ gfloat b = 0;
+ gfloat dr = 0;
+ gint i;
- b = ROUND (csf->rgb.b * 255.0);
+ b = csf->rgb.b * 255.0;
- g = (csf->height - csf->y + 1) * 255 / csf->height;
- g = CLAMP (g, 0, 255);
+ if (b < 0.0 || b > 255.0)
+ {
+ r = csf->oog_color[0];
+ g = csf->oog_color[1];
+ b = csf->oog_color[2];
+ }
+ else
+ {
+ g = (csf->height - csf->y + 1) * 255.0 / csf->height;
- r = 0;
- dr = 255.0 / csf->width;
+ dr = 255.0 / csf->width;
+ }
for (i = 0; i < csf->width; i++)
{
@@ -1490,17 +1500,27 @@ color_select_render_red_green (ColorSelectFill *csf)
static void
color_select_render_red_blue (ColorSelectFill *csf)
{
- guchar *p = csf->buffer;
- gint i, g, b;
- gfloat r, dr;
+ guchar *p = csf->buffer;
+ gfloat r = 0;
+ gfloat g = 0;
+ gfloat b = 0;
+ gfloat dr = 0;
+ gint i;
- g = ROUND (csf->rgb.g * 255.0);
+ g = csf->rgb.g * 255.0;
- b = (csf->height - csf->y + 1) * 255 / csf->height;
- b = CLAMP (b, 0, 255);
+ if (g < 0.0 || g > 255.0)
+ {
+ r = csf->oog_color[0];
+ g = csf->oog_color[1];
+ b = csf->oog_color[2];
+ }
+ else
+ {
+ b = (csf->height - csf->y + 1) * 255.0 / csf->height;
- r = 0;
- dr = 255.0 / csf->width;
+ dr = 255.0 / csf->width;
+ }
for (i = 0; i < csf->width; i++)
{
@@ -1515,17 +1535,27 @@ color_select_render_red_blue (ColorSelectFill *csf)
static void
color_select_render_green_blue (ColorSelectFill *csf)
{
- guchar *p = csf->buffer;
- gint i, r, b;
- gfloat g, dg;
+ guchar *p = csf->buffer;
+ gfloat r = 0;
+ gfloat g = 0;
+ gfloat b = 0;
+ gfloat dg = 0;
+ gint i;
- r = ROUND (csf->rgb.r * 255.0);
+ r = csf->rgb.r * 255.0;
- b = (csf->height - csf->y + 1) * 255 / csf->height;
- b = CLAMP (b, 0, 255);
+ if (r < 0.0 || r > 255.0)
+ {
+ r = csf->oog_color[0];
+ g = csf->oog_color[1];
+ b = csf->oog_color[2];
+ }
+ else
+ {
+ b = (csf->height - csf->y + 1) * 255.0 / csf->height;
- g = 0;
- dg = 255.0 / csf->width;
+ dg = 255.0 / csf->width;
+ }
for (i = 0; i < csf->width; i++)
{
@@ -1556,42 +1586,60 @@ color_select_render_hue_saturation (ColorSelectFill *csf)
for (i = 0; i < csf->width; i++)
{
+ gfloat r, g, b;
+
f = ((h / 60) - (int) (h / 60)) * 255;
switch ((int) (h / 60))
{
+ default:
case 0:
- *p++ = v * 255;
- *p++ = v * (255 - (s * (255 - f)));
- *p++ = v * 255 * (1 - s);
+ r = v * 255;
+ g = v * (255 - (s * (255 - f)));
+ b = v * 255 * (1 - s);
break;
case 1:
- *p++ = v * (255 - s * f);
- *p++ = v * 255;
- *p++ = v * 255 * (1 - s);
+ r = v * (255 - s * f);
+ g = v * 255;
+ b = v * 255 * (1 - s);
break;
case 2:
- *p++ = v * 255 * (1 - s);
- *p++ = v *255;
- *p++ = v * (255 - (s * (255 - f)));
+ r = v * 255 * (1 - s);
+ g = v *255;
+ b = v * (255 - (s * (255 - f)));
break;
case 3:
- *p++ = v * 255 * (1 - s);
- *p++ = v * (255 - s * f);
- *p++ = v * 255;
+ r = v * 255 * (1 - s);
+ g = v * (255 - s * f);
+ b = v * 255;
break;
case 4:
- *p++ = v * (255 - (s * (255 - f)));
- *p++ = v * (255 * (1 - s));
- *p++ = v * 255;
+ r = v * (255 - (s * (255 - f)));
+ g = v * (255 * (1 - s));
+ b = v * 255;
break;
case 5:
- *p++ = v * 255;
- *p++ = v * 255 * (1 - s);
- *p++ = v * (255 - s * f);
+ r = v * 255;
+ g = v * 255 * (1 - s);
+ b = v * (255 - s * f);
break;
}
+ if (r < 0.0 || r > 255.0 ||
+ g < 0.0 || g > 255.0 ||
+ b < 0.0 || b > 255.0)
+ {
+ *p++ = csf->oog_color[0];
+ *p++ = csf->oog_color[1];
+ *p++ = csf->oog_color[2];
+ }
+ else
+ {
+ *p++ = r;
+ *p++ = g;
+ *p++ = b;
+ }
+
h += dh;
}
}
@@ -1615,42 +1663,60 @@ color_select_render_hue_value (ColorSelectFill *csf)
for (i = 0; i < csf->width; i++)
{
+ gfloat r, g, b;
+
f = ((h / 60) - (int) (h / 60)) * 255;
switch ((int) (h / 60))
{
+ default:
case 0:
- *p++ = v * 255;
- *p++ = v * (255 - (s * (255 - f)));
- *p++ = v * 255 * (1 - s);
+ r = v * 255;
+ g = v * (255 - (s * (255 - f)));
+ b = v * 255 * (1 - s);
break;
case 1:
- *p++ = v * (255 - s * f);
- *p++ = v * 255;
- *p++ = v * 255 * (1 - s);
+ r = v * (255 - s * f);
+ g = v * 255;
+ b = v * 255 * (1 - s);
break;
case 2:
- *p++ = v * 255 * (1 - s);
- *p++ = v *255;
- *p++ = v * (255 - (s * (255 - f)));
+ r = v * 255 * (1 - s);
+ g = v *255;
+ b = v * (255 - (s * (255 - f)));
break;
case 3:
- *p++ = v * 255 * (1 - s);
- *p++ = v * (255 - s * f);
- *p++ = v * 255;
+ r = v * 255 * (1 - s);
+ g = v * (255 - s * f);
+ b = v * 255;
break;
case 4:
- *p++ = v * (255 - (s * (255 - f)));
- *p++ = v * (255 * (1 - s));
- *p++ = v * 255;
+ r = v * (255 - (s * (255 - f)));
+ g = v * (255 * (1 - s));
+ b = v * 255;
break;
case 5:
- *p++ = v * 255;
- *p++ = v * 255 * (1 - s);
- *p++ = v * (255 - s * f);
+ r = v * 255;
+ g = v * 255 * (1 - s);
+ b = v * (255 - s * f);
break;
}
+ if (r < 0.0 || r > 255.0 ||
+ g < 0.0 || g > 255.0 ||
+ b < 0.0 || b > 255.0)
+ {
+ *p++ = csf->oog_color[0];
+ *p++ = csf->oog_color[1];
+ *p++ = csf->oog_color[2];
+ }
+ else
+ {
+ *p++ = r;
+ *p++ = g;
+ *p++ = b;
+ }
+
h += dh;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]