core, widgets: Convert HSV/A to float

Per Pippin, the only color model that can
have double precision is RGB/A.
Therefore, we need to switch all others to
use float instead. This patch converts the
HSV and HSVA double babl formats.
This commit is contained in:
Alx Sa 2024-04-21 03:42:27 +00:00
parent 2dc6f41114
commit 32d64ab1c9
11 changed files with 117 additions and 102 deletions

View file

@ -305,19 +305,19 @@ context_foreground_hue_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_foreground (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[0] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[0] = (gfloat) action_select_value (select_type,
pixel[0],
0.0, 1.0, 1.0,
1.0 / 360.0, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_foreground (context, color);
g_object_unref (color);
}
@ -329,19 +329,19 @@ context_foreground_saturation_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_foreground (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[1] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[1] = (gfloat) action_select_value (select_type,
pixel[1],
0.0, 1.0, 1.0,
0.01, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_foreground (context, color);
g_object_unref (color);
}
@ -353,19 +353,19 @@ context_foreground_value_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_foreground (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[2] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[2] = (gfloat) action_select_value (select_type,
pixel[2],
0.0, 1.0, 1.0,
0.01, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_foreground (context, color);
g_object_unref (color);
}
@ -377,19 +377,19 @@ context_background_hue_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_background (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[0] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[0] = (gfloat) action_select_value (select_type,
pixel[0],
0.0, 1.0, 1.0,
1.0 / 360.0, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_background (context, color);
g_object_unref (color);
}
@ -401,19 +401,19 @@ context_background_saturation_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_background (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[1] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[1] = (gfloat) action_select_value (select_type,
pixel[1],
0.0, 1.0, 1.0,
0.01, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_background (context, color);
g_object_unref (color);
}
@ -425,19 +425,19 @@ context_background_value_cmd_callback (GimpAction *action,
{
GimpContext *context;
GeglColor *color;
gdouble pixel[3];
gfloat pixel[3];
GimpActionSelectType select_type;
return_if_no_context (context, data);
select_type = (GimpActionSelectType) g_variant_get_int32 (value);
color = gegl_color_duplicate (gimp_context_get_background (context));
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
pixel[2] = action_select_value (select_type,
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
pixel[2] = (gfloat) action_select_value (select_type,
pixel[2],
0.0, 1.0, 1.0,
0.01, 0.01, 0.1, 0.0, FALSE);
gegl_color_set_pixel (color, babl_format_with_space ("HSV double", NULL), pixel);
gegl_color_set_pixel (color, babl_format_with_space ("HSV float", NULL), pixel);
gimp_context_set_background (context, color);
g_object_unref (color);
}

View file

@ -596,11 +596,11 @@ gimp_gradient_get_color_at (GimpGradient *gradient,
}
else
{
gdouble left_hsv[3];
gdouble right_hsv[3];
gfloat left_hsv[3];
gfloat right_hsv[3];
gegl_color_get_pixel (left_color, babl_format ("HSV double"), left_hsv);
gegl_color_get_pixel (right_color, babl_format ("HSV double"), right_hsv);
gegl_color_get_pixel (left_color, babl_format ("HSV float"), left_hsv);
gegl_color_get_pixel (right_color, babl_format ("HSV float"), right_hsv);
left_hsv[1] = left_hsv[1] + (right_hsv[1] - left_hsv[1]) * factor;
left_hsv[2] = left_hsv[2] + (right_hsv[2] - left_hsv[2]) * factor;
@ -641,7 +641,7 @@ gimp_gradient_get_color_at (GimpGradient *gradient,
break;
}
gegl_color_set_pixel (*color, babl_format ("HSV double"), left_hsv);
gegl_color_set_pixel (*color, babl_format ("HSV float"), left_hsv);
}
/* Calculate alpha */

View file

@ -563,11 +563,11 @@ gimp_palette_load_aco (GimpContext *context,
}
else if (color_space == 1) /* HSV */
{
gdouble hsv[3] = { ((gdouble) w) / 65536.0,
((gdouble) x) / 65536.0,
((gdouble) y) / 65536.0};
gfloat hsv[3] = { ((gfloat) w) / 65536.0f,
((gfloat) x) / 65536.0f,
((gfloat) y) / 65536.0f};
gegl_color_set_pixel (color, babl_format ("HSV double"), hsv);
gegl_color_set_pixel (color, babl_format ("HSV float"), hsv);
color_ok = TRUE;
}
else if (color_space == 2) /* CMYK */

View file

@ -508,14 +508,14 @@ gimp_circle_background_hsv (gdouble angle,
gdouble distance,
guchar *rgb)
{
gdouble hsv[3];
gfloat hsv[3];
GeglColor *color = gegl_color_new ("black");
hsv[0] = angle / (2.0 * G_PI);
hsv[1] = distance;
hsv[2] = 1 - sqrt (distance) / 4;
gegl_color_set_pixel (color, babl_format ("HSV double"), hsv);
gegl_color_set_pixel (color, babl_format ("HSV float"), hsv);
gegl_color_get_pixel (color, babl_format ("R'G'B' u8"), rgb);
g_object_unref (color);
}

View file

@ -1310,7 +1310,7 @@ view_set_hint (GimpGradientEditor *editor,
GimpDataEditor *data_editor = GIMP_DATA_EDITOR (editor);
GeglColor *color = NULL;
gdouble rgb[4];
gdouble hsv[3];
gfloat hsv[3];
gdouble xpos;
gchar *str1;
gchar *str2;
@ -1326,7 +1326,7 @@ view_set_hint (GimpGradientEditor *editor,
gimp_color_area_set_color (GIMP_COLOR_AREA (editor->current_color), color);
gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), rgb);
gegl_color_get_pixel (color, babl_format ("HSV double"), hsv);
gegl_color_get_pixel (color, babl_format ("HSV float"), hsv);
str1 = g_strdup_printf (_("Position: %0.4f"), xpos);
/* TODO: Current hints are displaying sRGB values. Ideally we'd want to update

View file

@ -1030,6 +1030,7 @@ gimp_scanner_parse_deprecated_color (GimpScanner *scanner,
case G_TOKEN_SYMBOL:
{
gdouble col[4] = { 0.0, 0.0, 0.0, 1.0 };
gdouble col_f[4] = { 0.0, 0.0, 0.0, 1.0 };
gint n_channels = 4;
gboolean is_hsv = FALSE;
gint i;
@ -1056,11 +1057,13 @@ gimp_scanner_parse_deprecated_color (GimpScanner *scanner,
{
if (! gimp_scanner_parse_float (scanner, &col[i]))
goto finish;
col_f[i] = (gfloat) col[i];
}
*color = gegl_color_new (NULL);
if (is_hsv)
gegl_color_set_pixel (*color, babl_format ("HSVA double"), col);
gegl_color_set_pixel (*color, babl_format ("HSVA float"), col_f);
else
gegl_color_set_pixel (*color, babl_format ("R'G'B'A double"), col);

View file

@ -149,7 +149,7 @@ gimp_color_scale_class_init (GimpColorScaleClass *klass)
fish_lch_to_rgb = babl_fish (babl_format ("CIE LCH(ab) double"),
babl_format ("R'G'B' double"));
fish_hsv_to_rgb = babl_fish (babl_format ("HSV double"),
fish_hsv_to_rgb = babl_fish (babl_format ("HSV float"),
babl_format ("R'G'B' double"));
fish_rgb_to_cairo = babl_fish (babl_format ("R'G'B' u8"),
babl_format ("cairo-RGB24"));
@ -519,7 +519,7 @@ gimp_color_scale_set_format (GimpColorScale *scale,
scale->priv->format = format;
fish_lch_to_rgb = babl_fish (babl_format ("CIE LCH(ab) double"),
babl_format_with_space ("R'G'B' double", format));
fish_hsv_to_rgb = babl_fish (babl_format_with_space ("HSV double", format),
fish_hsv_to_rgb = babl_fish (babl_format_with_space ("HSV float", format),
babl_format_with_space ("R'G'B' double", format));
scale->priv->needs_render = TRUE;
gtk_widget_queue_draw (GTK_WIDGET (scale));
@ -657,11 +657,12 @@ gimp_color_scale_render (GimpColorScale *scale)
GimpColorScalePrivate *priv = GET_PRIVATE (scale);
GtkRange *range = GTK_RANGE (scale);
gdouble rgb[4];
gdouble hsv[3];
gfloat hsv[3];
gdouble lch[3];
gint multiplier = 1;
guint x, y;
gdouble *channel_value = NULL;
gfloat *channel_value_f = NULL;
gboolean from_hsv = FALSE;
gboolean from_lch = FALSE;
gboolean invert;
@ -678,14 +679,14 @@ gimp_color_scale_render (GimpColorScale *scale)
}
gegl_color_get_pixel (priv->color, babl_format_with_space ("R'G'B'A double", priv->format), rgb);
gegl_color_get_pixel (priv->color, babl_format_with_space ("HSV double", priv->format), hsv);
gegl_color_get_pixel (priv->color, babl_format_with_space ("HSV float", priv->format), hsv);
gegl_color_get_pixel (priv->color, babl_format ("CIE LCH(ab) double"), lch);
switch (priv->channel)
{
case GIMP_COLOR_SELECTOR_HUE: channel_value = &hsv[0]; break;
case GIMP_COLOR_SELECTOR_SATURATION: channel_value = &hsv[1]; break;
case GIMP_COLOR_SELECTOR_VALUE: channel_value = &hsv[2]; break;
case GIMP_COLOR_SELECTOR_HUE: channel_value_f = &hsv[0]; break;
case GIMP_COLOR_SELECTOR_SATURATION: channel_value_f = &hsv[1]; break;
case GIMP_COLOR_SELECTOR_VALUE: channel_value_f = &hsv[2]; break;
case GIMP_COLOR_SELECTOR_RED: channel_value = &rgb[0]; break;
case GIMP_COLOR_SELECTOR_GREEN: channel_value = &rgb[1]; break;
@ -734,7 +735,10 @@ gimp_color_scale_render (GimpColorScale *scale)
if (invert)
value = multiplier - value;
if (channel_value)
*channel_value = value;
else if (channel_value_f)
*channel_value_f = (gfloat) value;
if (from_hsv)
babl_process (fish_hsv_to_rgb, &hsv, &rgb, 1);
@ -778,7 +782,10 @@ gimp_color_scale_render (GimpColorScale *scale)
if (invert)
value = multiplier - value;
if (channel_value)
*channel_value = value;
else if (channel_value_f)
*channel_value_f = (gfloat) value;
if (from_hsv)
babl_process (fish_hsv_to_rgb, &hsv, &rgb, 1);

View file

@ -803,13 +803,14 @@ gimp_color_scales_update_scales (GimpColorScales *scales,
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
GeglColor *color = gimp_color_selector_get_color (selector);
gdouble pixel[4];
gfloat pixel_f[4];
gdouble values[G_N_ELEMENTS (scale_defs)];
gint i;
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", scales->format), pixel);
values[GIMP_COLOR_SELECTOR_HUE] = pixel[0] * 360.0;
values[GIMP_COLOR_SELECTOR_SATURATION] = pixel[1] * 100.0;
values[GIMP_COLOR_SELECTOR_VALUE] = pixel[2] * 100.0;
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", scales->format), pixel_f);
values[GIMP_COLOR_SELECTOR_HUE] = pixel_f[0] * 360.0;
values[GIMP_COLOR_SELECTOR_SATURATION] = pixel_f[1] * 100.0;
values[GIMP_COLOR_SELECTOR_VALUE] = pixel_f[2] * 100.0;
gegl_color_get_pixel (color, babl_format_with_space ("R'G'B'A double", scales->format), pixel);
values[GIMP_COLOR_SELECTOR_RED] = pixel[0] * 100.0;
@ -887,7 +888,7 @@ gimp_color_scales_scale_changed (GtkWidget *scale,
GeglColor *color = gimp_color_selector_get_color (selector);
gdouble value = gimp_label_spin_get_value (GIMP_LABEL_SPIN (scale));
gdouble lch[4];
gdouble hsv[4];
gfloat hsv[4];
gdouble rgb[4];
gint i;
@ -896,21 +897,21 @@ gimp_color_scales_scale_changed (GtkWidget *scale,
break;
gegl_color_get_pixel (color, babl_format_with_space ("R'G'B'A double", scales->format), rgb);
gegl_color_get_pixel (color, babl_format_with_space ("HSVA double", scales->format), hsv);
gegl_color_get_pixel (color, babl_format_with_space ("HSVA float", scales->format), hsv);
gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) alpha double"), lch);
switch (i)
{
case GIMP_COLOR_SELECTOR_HUE:
hsv[0] = value / 360.0;
hsv[0] = value / 360.0f;
break;
case GIMP_COLOR_SELECTOR_SATURATION:
hsv[1] = value / 100.0;
hsv[1] = value / 100.0f;
break;
case GIMP_COLOR_SELECTOR_VALUE:
hsv[2] = value / 100.0;
hsv[2] = value / 100.0f;
break;
case GIMP_COLOR_SELECTOR_RED:
@ -962,7 +963,7 @@ gimp_color_scales_scale_changed (GtkWidget *scale,
if ((i >= GIMP_COLOR_SELECTOR_HUE) &&
(i <= GIMP_COLOR_SELECTOR_VALUE))
{
gegl_color_set_pixel (color, babl_format_with_space ("HSVA double", scales->format), hsv);
gegl_color_set_pixel (color, babl_format_with_space ("HSVA float", scales->format), hsv);
}
else if ((i >= GIMP_COLOR_SELECTOR_LCH_LIGHTNESS) &&
(i <= GIMP_COLOR_SELECTOR_LCH_HUE))

View file

@ -894,11 +894,12 @@ gimp_color_select_update_values (GimpColorSelect *select)
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (select);
GeglColor *color = gimp_color_selector_get_color (selector);
gdouble values[3];
gfloat values_float[3];
const Babl *rgb_format;
const Babl *hsv_format;
rgb_format = babl_format_with_space ("R'G'B' double", select->format);
hsv_format = babl_format_with_space ("HSV double", select->format);
hsv_format = babl_format_with_space ("HSV float", select->format);
switch (select->z_color_fill)
{
@ -919,19 +920,22 @@ gimp_color_select_update_values (GimpColorSelect *select)
break;
case COLOR_SELECT_HUE:
values[0] = select->pos[2];
values[1] = select->pos[0];
values[2] = select->pos[1];
gegl_color_set_pixel (color, hsv_format, values);
values_float[0] = select->pos[2];
values_float[1] = select->pos[0];
values_float[2] = select->pos[1];
gegl_color_set_pixel (color, hsv_format, values_float);
break;
case COLOR_SELECT_SATURATION:
values[0] = select->pos[0];
values[1] = select->pos[2];
values[2] = select->pos[1];
gegl_color_set_pixel (color, hsv_format, values);
values_float[0] = select->pos[0];
values_float[1] = select->pos[2];
values_float[2] = select->pos[1];
gegl_color_set_pixel (color, hsv_format, values_float);
break;
case COLOR_SELECT_VALUE:
gegl_color_set_pixel (color, hsv_format, select->pos);
values_float[0] = select->pos[0];
values_float[1] = select->pos[1];
values_float[2] = select->pos[2];
gegl_color_set_pixel (color, hsv_format, values_float);
break;
case COLOR_SELECT_LCH_LIGHTNESS:
@ -969,10 +973,10 @@ gimp_color_select_update_pos (GimpColorSelect *select)
GeglColor *color = gimp_color_selector_get_color (selector);
gdouble rgb[3];
gdouble lch[3];
gdouble hsv[3];
gfloat hsv[3];
gegl_color_get_pixel (color, babl_format_with_space ("R'G'B' double", select->format), rgb);
gegl_color_get_pixel (color, babl_format_with_space ("HSV double", select->format), hsv);
gegl_color_get_pixel (color, babl_format_with_space ("HSV float", select->format), hsv);
gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) double"), lch);
g_object_unref (color);

View file

@ -415,10 +415,10 @@ read_image_palette (GimpImage *image,
for (index = 0; index < ncolors; ++index)
{
GeglColor *c = colors[index];
gdouble hsv[3];
gfloat hsv[3];
gchar *text = g_strdup_printf ("%d", index);
gegl_color_get_pixel (c, babl_format ("HSV double"), hsv);
gegl_color_get_pixel (c, babl_format ("HSV float"), hsv);
reverse_order[index] = ncolors - index - 1;

View file

@ -725,14 +725,14 @@ load_resource_1007 (const PSDimageres *res_a,
case PSD_CS_HSB:
{
gdouble hsv[3] =
gfloat hsv[3] =
{
ps_color.hsv.hue / 65535.0,
ps_color.hsv.saturation / 65535.0,
ps_color.hsv.value / 65535.0
ps_color.hsv.hue / 65535.0f,
ps_color.hsv.saturation / 65535.0f,
ps_color.hsv.value / 65535.0f
};
gegl_color_set_pixel (color, babl_format ("HSV double"), hsv);
gegl_color_set_pixel (color, babl_format ("HSV float"), hsv);
}
break;
@ -1461,14 +1461,14 @@ load_resource_1077 (const PSDimageres *res_a,
case PSD_CS_HSB:
{
gdouble hsv[3] =
gfloat hsv[3] =
{
ps_color.hsv.hue / 65535.0,
ps_color.hsv.saturation / 65535.0,
ps_color.hsv.value / 65535.0
ps_color.hsv.hue / 65535.0f,
ps_color.hsv.saturation / 65535.0f,
ps_color.hsv.value / 65535.0f
};
gegl_color_set_pixel (color, babl_format ("HSV double"), hsv);
gegl_color_set_pixel (color, babl_format ("HSV float"), hsv);
}
break;