diff --git a/app/widgets/gimpcoloreditor.c b/app/widgets/gimpcoloreditor.c index 26807e0df1..08c67a7099 100644 --- a/app/widgets/gimpcoloreditor.c +++ b/app/widgets/gimpcoloreditor.c @@ -84,8 +84,7 @@ static void gimp_color_editor_bg_changed (GimpContext *context, GeglColor *color, GimpColorEditor *editor); static void gimp_color_editor_color_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorEditor *editor); static void gimp_color_editor_tab_toggled (GtkWidget *widget, GimpColorEditor *editor); @@ -155,8 +154,7 @@ gimp_color_editor_init (GimpColorEditor *editor) gint content_spacing; gint button_spacing; GtkIconSize button_icon_size; - GimpRGB rgb; - GimpHSV hsv; + GeglColor *color; GList *list; GSList *group; gint icon_width = 40; @@ -165,9 +163,6 @@ gimp_color_editor_init (GimpColorEditor *editor) editor->context = NULL; editor->edit_bg = FALSE; - gimp_rgba_set (&rgb, 0.0, 0.0, 0.0, 1.0); - gimp_rgb_to_hsv (&rgb, &hsv); - gtk_widget_style_get (GTK_WIDGET (editor), "content-spacing", &content_spacing, "button-spacing", &button_spacing, @@ -179,9 +174,10 @@ gimp_color_editor_init (GimpColorEditor *editor) gtk_box_pack_start (GTK_BOX (editor), editor->hbox, FALSE, FALSE, 0); gtk_widget_show (editor->hbox); - editor->notebook = gimp_color_selector_new (GIMP_TYPE_COLOR_NOTEBOOK, - &rgb, &hsv, + color = gegl_color_new ("black"); + editor->notebook = gimp_color_selector_new (GIMP_TYPE_COLOR_NOTEBOOK, color, GIMP_COLOR_SELECTOR_RED); + g_object_unref (color); gimp_color_selector_set_show_alpha (GIMP_COLOR_SELECTOR (editor->notebook), FALSE); gtk_box_pack_start (GTK_BOX (editor), editor->notebook, @@ -538,18 +534,11 @@ static void gimp_color_editor_set_color (GimpColorEditor *editor, GeglColor *color) { - GimpRGB rgb; - GimpHSV hsv; - - gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), &rgb); - gimp_rgb_to_hsv (&rgb, &hsv); - g_signal_handlers_block_by_func (editor->notebook, gimp_color_editor_color_changed, editor); - gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (editor->notebook), - &rgb, &hsv); + gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (editor->notebook), color); g_signal_handlers_unblock_by_func (editor->notebook, gimp_color_editor_color_changed, @@ -586,14 +575,9 @@ gimp_color_editor_bg_changed (GimpContext *context, static void gimp_color_editor_color_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorEditor *editor) { - GeglColor *color = gegl_color_new ("black"); - - gegl_color_set_rgba_with_space (color, rgb->r, rgb->g, rgb->b, rgb->a, NULL); - if (editor->context) { if (editor->edit_bg) @@ -631,8 +615,6 @@ gimp_color_editor_color_changed (GimpColorSelector *selector, g_signal_handlers_unblock_by_func (editor->hex_entry, gimp_color_editor_entry_changed, editor); - - g_object_unref (color); } static void diff --git a/app/widgets/gimpcolorselectorpalette.c b/app/widgets/gimpcolorselectorpalette.c index 2aa6340666..496fd864cd 100644 --- a/app/widgets/gimpcolorselectorpalette.c +++ b/app/widgets/gimpcolorselectorpalette.c @@ -40,8 +40,7 @@ static void gimp_color_selector_palette_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void gimp_color_selector_palette_set_config (GimpColorSelector *selector, GimpColorConfig *config); @@ -74,8 +73,7 @@ gimp_color_selector_palette_init (GimpColorSelectorPalette *select) static void gimp_color_selector_palette_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { GimpColorSelectorPalette *select = GIMP_COLOR_SELECTOR_PALETTE (selector); @@ -86,17 +84,13 @@ gimp_color_selector_palette_set_color (GimpColorSelector *selector, if (palette && gimp_palette_get_n_colors (palette) > 0) { GimpPaletteEntry *entry; - GeglColor *color = gegl_color_new ("black"); - gegl_color_set_rgba_with_space (color, rgb->r, rgb->g, rgb->b, rgb->a, NULL); entry = gimp_palette_find_entry (palette, color, GIMP_PALETTE_VIEW (select->view)->selected); if (entry) gimp_palette_view_select_entry (GIMP_PALETTE_VIEW (select->view), entry); - - g_object_unref (color); } } } @@ -115,10 +109,7 @@ gimp_color_selector_palette_entry_clicked (GimpPaletteView *view, GdkModifierType state, GimpColorSelector *selector) { - gegl_color_get_pixel (entry->color, babl_format ("R'G'B'A double"), &selector->rgb); - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - - gimp_color_selector_emit_color_changed (selector); + gimp_color_selector_set_color (selector, entry->color); } static void diff --git a/libgimpwidgets/gimpcolornotebook.c b/libgimpwidgets/gimpcolornotebook.c index 1fe2ef7138..488514fc11 100644 --- a/libgimpwidgets/gimpcolornotebook.c +++ b/libgimpwidgets/gimpcolornotebook.c @@ -72,8 +72,7 @@ static void gimp_color_notebook_togg_sensitive (GimpColorSelector *selector, static void gimp_color_notebook_set_show_alpha (GimpColorSelector *selector, gboolean show_alpha); static void gimp_color_notebook_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void gimp_color_notebook_set_channel (GimpColorSelector *selector, GimpColorSelectorChannel channel); static void gimp_color_notebook_set_model_visible @@ -90,8 +89,7 @@ static void gimp_color_notebook_switch_page (GtkNotebook *gtk_notebo GimpColorNotebook *notebook); static void gimp_color_notebook_color_changed (GimpColorSelector *page, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorNotebook *notebook); static void gimp_color_notebook_channel_changed (GimpColorSelector *page, GimpColorSelectorChannel channel, @@ -270,8 +268,7 @@ gimp_color_notebook_set_show_alpha (GimpColorSelector *selector, static void gimp_color_notebook_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { GimpColorNotebookPrivate *private = GET_PRIVATE (selector); @@ -279,7 +276,7 @@ gimp_color_notebook_set_color (GimpColorSelector *selector, gimp_color_notebook_color_changed, selector); - gimp_color_selector_set_color (private->cur_page, rgb, hsv); + gimp_color_selector_set_color (private->cur_page, color); g_signal_handlers_unblock_by_func (private->cur_page, gimp_color_notebook_color_changed, @@ -345,6 +342,7 @@ gimp_color_notebook_switch_page (GtkNotebook *gtk_notebook, GimpColorNotebookPrivate *private = GET_PRIVATE (notebook); GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); GtkWidget *page_widget; + GeglColor *color; GimpColorSelectorModel model; page_widget = gtk_notebook_get_nth_page (gtk_notebook, page_num); @@ -361,9 +359,9 @@ gimp_color_notebook_switch_page (GtkNotebook *gtk_notebook, gimp_color_notebook_model_visible_changed, notebook); - gimp_color_selector_set_color (private->cur_page, - &selector->rgb, - &selector->hsv); + color = gimp_color_selector_get_color (selector); + gimp_color_selector_set_color (private->cur_page, color); + g_object_unref (color); gimp_color_selector_set_channel (private->cur_page, gimp_color_selector_get_channel (selector)); @@ -390,16 +388,12 @@ gimp_color_notebook_switch_page (GtkNotebook *gtk_notebook, static void gimp_color_notebook_color_changed (GimpColorSelector *page, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorNotebook *notebook) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (notebook); - selector->rgb = *rgb; - selector->hsv = *hsv; - - gimp_color_selector_emit_color_changed (selector); + gimp_color_selector_set_color (selector, color); } static void @@ -434,12 +428,13 @@ gimp_color_notebook_add_page (GimpColorNotebook *notebook, GtkWidget *menu_widget; GtkWidget *image; GtkWidget *label; + GeglColor *color; gboolean show_alpha; - page = gimp_color_selector_new (page_type, - &selector->rgb, - &selector->hsv, + color = gimp_color_selector_get_color (selector); + page = gimp_color_selector_new (page_type, color, gimp_color_selector_get_channel (selector)); + g_object_unref (color); if (! page) return NULL; diff --git a/libgimpwidgets/gimpcolorscale.c b/libgimpwidgets/gimpcolorscale.c index aa617cb956..178df09e41 100644 --- a/libgimpwidgets/gimpcolorscale.c +++ b/libgimpwidgets/gimpcolorscale.c @@ -69,8 +69,7 @@ struct _GimpColorScalePrivate guchar oog_color[3]; GimpColorSelectorChannel channel; - GimpRGB rgb; - GimpHSV hsv; + GeglColor *color; guchar *buf; guint width; @@ -115,6 +114,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (GimpColorScale, gimp_color_scale, GTK_TYPE_SCALE) static const Babl *fish_rgb_to_lch = NULL; static const Babl *fish_lch_to_rgb = NULL; +static const Babl *fish_hsv_to_rgb = NULL; static void @@ -153,6 +153,8 @@ gimp_color_scale_class_init (GimpColorScaleClass *klass) babl_format ("CIE LCH(ab) double")); 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"), + babl_format ("R'G'B' double")); } static void @@ -178,8 +180,7 @@ gimp_color_scale_init (GimpColorScale *scale) gtk_orientable_set_orientation (GTK_ORIENTABLE (range), GTK_ORIENTATION_HORIZONTAL); - gimp_rgba_set (&priv->rgb, 0.0, 0.0, 0.0, 1.0); - gimp_rgb_to_hsv (&priv->rgb, &priv->hsv); + priv->color = gegl_color_new ("black"); gimp_widget_track_monitor (GTK_WIDGET (scale), G_CALLBACK (gimp_color_scale_destroy_transform), @@ -227,6 +228,7 @@ gimp_color_scale_finalize (GObject *object) priv->width = 0; priv->height = 0; priv->rowstride = 0; + g_object_unref (priv->color); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -309,6 +311,7 @@ gimp_color_scale_draw (GtkWidget *widget, GdkRectangle range_rect; GdkRectangle area = { 0, }; cairo_surface_t *buffer; + guchar *buf = NULL; gint slider_start; gint slider_end; gint slider_mid; @@ -336,11 +339,11 @@ gimp_color_scale_draw (GtkWidget *widget, if (priv->transform) { const Babl *format = babl_format ("cairo-RGB24"); - guchar *buf = g_new (guchar, priv->rowstride * priv->height); guchar *src = priv->buf; guchar *dest = buf; guint i; + buf = g_new (guchar, priv->rowstride * priv->height); for (i = 0; i < priv->height; i++) { gimp_color_transform_process_pixels (priv->transform, @@ -548,29 +551,32 @@ gimp_color_scale_set_channel (GimpColorScale *scale, /** * gimp_color_scale_set_color: * @scale: a #GimpColorScale widget - * @rgb: the new color as #GimpRGB - * @hsv: the new color as #GimpHSV + * @color: the new color. * * Changes the color value of the @scale. **/ void gimp_color_scale_set_color (GimpColorScale *scale, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { GimpColorScalePrivate *priv; + GeglColor *old_color; g_return_if_fail (GIMP_IS_COLOR_SCALE (scale)); - g_return_if_fail (rgb != NULL); - g_return_if_fail (hsv != NULL); + g_return_if_fail (GEGL_IS_COLOR (color)); priv = GET_PRIVATE (scale); - priv->rgb = *rgb; - priv->hsv = *hsv; + old_color = priv->color; + priv->color = gegl_color_duplicate (color); - priv->needs_render = TRUE; - gtk_widget_queue_draw (GTK_WIDGET (scale)); + if (! gimp_color_is_perceptually_identical (old_color, priv->color)) + { + priv->needs_render = TRUE; + gtk_widget_queue_draw (GTK_WIDGET (scale)); + } + + g_object_unref (old_color); } /** @@ -646,12 +652,12 @@ gimp_color_scale_render (GimpColorScale *scale) { GimpColorScalePrivate *priv = GET_PRIVATE (scale); GtkRange *range = GTK_RANGE (scale); - GimpRGB rgb; - GimpHSV hsv; - GimpLCH lch; + gdouble rgb[4]; + gdouble hsv[3]; + gdouble lch[3]; gint multiplier = 1; guint x, y; - gdouble *channel_value = NULL; /* shut up compiler */ + gdouble *channel_value = NULL; gboolean from_hsv = FALSE; gboolean from_lch = FALSE; gboolean invert; @@ -667,24 +673,24 @@ gimp_color_scale_render (GimpColorScale *scale) return; } - rgb = priv->rgb; - hsv = priv->hsv; - babl_process (fish_rgb_to_lch, &rgb, &lch, 1); + gegl_color_get_pixel (priv->color, babl_format ("R'G'B'A double"), rgb); + gegl_color_get_pixel (priv->color, babl_format ("HSV double"), 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.h; break; - case GIMP_COLOR_SELECTOR_SATURATION: channel_value = &hsv.s; break; - case GIMP_COLOR_SELECTOR_VALUE: channel_value = &hsv.v; break; + 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_RED: channel_value = &rgb.r; break; - case GIMP_COLOR_SELECTOR_GREEN: channel_value = &rgb.g; break; - case GIMP_COLOR_SELECTOR_BLUE: channel_value = &rgb.b; break; - case GIMP_COLOR_SELECTOR_ALPHA: channel_value = &rgb.a; break; + case GIMP_COLOR_SELECTOR_RED: channel_value = &rgb[0]; break; + case GIMP_COLOR_SELECTOR_GREEN: channel_value = &rgb[1]; break; + case GIMP_COLOR_SELECTOR_BLUE: channel_value = &rgb[2]; break; + case GIMP_COLOR_SELECTOR_ALPHA: channel_value = &rgb[3]; break; - case GIMP_COLOR_SELECTOR_LCH_LIGHTNESS: channel_value = &lch.l; break; - case GIMP_COLOR_SELECTOR_LCH_CHROMA: channel_value = &lch.c; break; - case GIMP_COLOR_SELECTOR_LCH_HUE: channel_value = &lch.h; break; + case GIMP_COLOR_SELECTOR_LCH_LIGHTNESS: channel_value = &lch[0]; break; + case GIMP_COLOR_SELECTOR_LCH_CHROMA: channel_value = &lch[1]; break; + case GIMP_COLOR_SELECTOR_LCH_HUE: channel_value = &lch[2]; break; } switch (priv->channel) @@ -720,7 +726,7 @@ gimp_color_scale_render (GimpColorScale *scale) for (x = 0, d = buf; x < priv->width; x++, d += 4) { gdouble value = (gdouble) x * multiplier / (gdouble) (priv->width - 1); - guchar r, g, b; + guchar u8rgb[3]; if (invert) value = multiplier - value; @@ -728,24 +734,31 @@ gimp_color_scale_render (GimpColorScale *scale) *channel_value = value; if (from_hsv) - gimp_hsv_to_rgb (&hsv, &rgb); + babl_process (fish_hsv_to_rgb, &hsv, &rgb, 1); else if (from_lch) babl_process (fish_lch_to_rgb, &lch, &rgb, 1); - if (rgb.r < 0.0 || rgb.r > 1.0 || - rgb.g < 0.0 || rgb.g > 1.0 || - rgb.b < 0.0 || rgb.b > 1.0) + /* This is only checking if a color is within the sRGB gamut. I want + * to check compared to the image's space (anySpace) or softproof + * space. TODO. + */ + if (rgb[0] < 0.0 || rgb[0] > 1.0 || + rgb[1] < 0.0 || rgb[1] > 1.0 || + rgb[2] < 0.0 || rgb[2] > 1.0) { - r = priv->oog_color[0]; - g = priv->oog_color[1]; - b = priv->oog_color[2]; + u8rgb[0] = priv->oog_color[0]; + u8rgb[1] = priv->oog_color[1]; + u8rgb[2] = priv->oog_color[2]; } else { - gimp_rgb_get_uchar (&rgb, &r, &g, &b); + u8rgb[0] = rgb[0] * 255; + u8rgb[1] = rgb[1] * 255; + u8rgb[2] = rgb[2] * 255; } - GIMP_CAIRO_RGB24_SET_PIXEL (d, r, g, b); + /* TODO: we should move to CAIRO_FORMAT_RGBA128F. */ + GIMP_CAIRO_RGB24_SET_PIXEL (d, u8rgb[0], u8rgb[1], u8rgb[2]); } d = buf + priv->rowstride; @@ -760,7 +773,7 @@ gimp_color_scale_render (GimpColorScale *scale) for (y = 0; y < priv->height; y++) { gdouble value = (gdouble) y * multiplier / (gdouble) (priv->height - 1); - guchar r, g, b; + guchar u8rgb[3]; if (invert) value = multiplier - value; @@ -768,27 +781,27 @@ gimp_color_scale_render (GimpColorScale *scale) *channel_value = value; if (from_hsv) - gimp_hsv_to_rgb (&hsv, &rgb); + babl_process (fish_hsv_to_rgb, &hsv, &rgb, 1); else if (from_lch) babl_process (fish_lch_to_rgb, &lch, &rgb, 1); - if (rgb.r < 0.0 || rgb.r > 1.0 || - rgb.g < 0.0 || rgb.g > 1.0 || - rgb.b < 0.0 || rgb.b > 1.0) + if (rgb[0] < 0.0 || rgb[0] > 1.0 || + rgb[1] < 0.0 || rgb[1] > 1.0 || + rgb[2] < 0.0 || rgb[2] > 1.0) { - r = priv->oog_color[0]; - g = priv->oog_color[1]; - b = priv->oog_color[2]; + u8rgb[0] = priv->oog_color[0]; + u8rgb[1] = priv->oog_color[1]; + u8rgb[2] = priv->oog_color[2]; } else { - gimp_rgb_get_uchar (&rgb, &r, &g, &b); + u8rgb[0] = rgb[0] * 255; + u8rgb[1] = rgb[1] * 255; + u8rgb[2] = rgb[2] * 255; } for (x = 0, d = buf; x < priv->width; x++, d += 4) - { - GIMP_CAIRO_RGB24_SET_PIXEL (d, r, g, b); - } + GIMP_CAIRO_RGB24_SET_PIXEL (d, u8rgb[0], u8rgb[1], u8rgb[2]); buf += priv->rowstride; } @@ -801,7 +814,7 @@ gimp_color_scale_render_alpha (GimpColorScale *scale) { GimpColorScalePrivate *priv = GET_PRIVATE (scale); GtkRange *range = GTK_RANGE (scale); - GimpRGB rgb; + gdouble rgb[4]; gboolean invert; gdouble a; guint x, y; @@ -811,7 +824,7 @@ gimp_color_scale_render_alpha (GimpColorScale *scale) invert = should_invert (range); buf = priv->buf; - rgb = priv->rgb; + gegl_color_get_pixel (priv->color, babl_format ("R'G'B'A double"), rgb); switch (gtk_orientable_get_orientation (GTK_ORIENTABLE (range))) { @@ -843,20 +856,20 @@ gimp_color_scale_render_alpha (GimpColorScale *scale) GIMP_CAIRO_RGB24_SET_PIXEL (l, (GIMP_CHECK_LIGHT + - (rgb.r - GIMP_CHECK_LIGHT) * a) * 255.999, + (rgb[0] - GIMP_CHECK_LIGHT) * a) * 255.999, (GIMP_CHECK_LIGHT + - (rgb.g - GIMP_CHECK_LIGHT) * a) * 255.999, + (rgb[1] - GIMP_CHECK_LIGHT) * a) * 255.999, (GIMP_CHECK_LIGHT + - (rgb.b - GIMP_CHECK_LIGHT) * a) * 255.999); + (rgb[2] - GIMP_CHECK_LIGHT) * a) * 255.999); l += 4; GIMP_CAIRO_RGB24_SET_PIXEL (d, (GIMP_CHECK_DARK + - (rgb.r - GIMP_CHECK_DARK) * a) * 255.999, + (rgb[0] - GIMP_CHECK_DARK) * a) * 255.999, (GIMP_CHECK_DARK + - (rgb.g - GIMP_CHECK_DARK) * a) * 255.999, + (rgb[1] - GIMP_CHECK_DARK) * a) * 255.999, (GIMP_CHECK_DARK + - (rgb.b - GIMP_CHECK_DARK) * a) * 255.999); + (rgb[2] - GIMP_CHECK_DARK) * a) * 255.999); d += 4; } @@ -887,19 +900,19 @@ gimp_color_scale_render_alpha (GimpColorScale *scale) GIMP_CAIRO_RGB24_SET_PIXEL (light, (GIMP_CHECK_LIGHT + - (rgb.r - GIMP_CHECK_LIGHT) * a) * 255.999, + (rgb[0] - GIMP_CHECK_LIGHT) * a) * 255.999, (GIMP_CHECK_LIGHT + - (rgb.g - GIMP_CHECK_LIGHT) * a) * 255.999, + (rgb[1] - GIMP_CHECK_LIGHT) * a) * 255.999, (GIMP_CHECK_LIGHT + - (rgb.b - GIMP_CHECK_LIGHT) * a) * 255.999); + (rgb[2] - GIMP_CHECK_LIGHT) * a) * 255.999); GIMP_CAIRO_RGB24_SET_PIXEL (dark, (GIMP_CHECK_DARK + - (rgb.r - GIMP_CHECK_DARK) * a) * 255.999, + (rgb[0] - GIMP_CHECK_DARK) * a) * 255.999, (GIMP_CHECK_DARK + - (rgb.g - GIMP_CHECK_DARK) * a) * 255.999, + (rgb[1] - GIMP_CHECK_DARK) * a) * 255.999, (GIMP_CHECK_DARK + - (rgb.b - GIMP_CHECK_DARK) * a) * 255.999); + (rgb[2] - GIMP_CHECK_DARK) * a) * 255.999); for (x = 0, l = d; x < priv->width; x++, l += 4) { diff --git a/libgimpwidgets/gimpcolorscale.h b/libgimpwidgets/gimpcolorscale.h index f31fbdd504..303086237c 100644 --- a/libgimpwidgets/gimpcolorscale.h +++ b/libgimpwidgets/gimpcolorscale.h @@ -71,8 +71,7 @@ GtkWidget * gimp_color_scale_new (GtkOrientation orienta void gimp_color_scale_set_channel (GimpColorScale *scale, GimpColorSelectorChannel channel); void gimp_color_scale_set_color (GimpColorScale *scale, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); void gimp_color_scale_set_color_config (GimpColorScale *scale, GimpColorConfig *config); diff --git a/libgimpwidgets/gimpcolorscales.c b/libgimpwidgets/gimpcolorscales.c index 2c7ec85e8f..bd7d6d58c2 100644 --- a/libgimpwidgets/gimpcolorscales.c +++ b/libgimpwidgets/gimpcolorscales.c @@ -69,14 +69,6 @@ enum }; -typedef struct _GimpLCH GimpLCH; - -struct _GimpLCH -{ - gdouble l, c, h, a; -}; - - typedef struct _ColorScale ColorScale; struct _ColorScale @@ -143,8 +135,7 @@ static void gimp_color_scales_togg_visible (GimpColorSelector *selector, static void gimp_color_scales_set_show_alpha (GimpColorSelector *selector, gboolean show_alpha); static void gimp_color_scales_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void gimp_color_scales_set_channel (GimpColorSelector *selector, GimpColorSelectorChannel channel); static void gimp_color_scales_set_model_visible @@ -380,7 +371,7 @@ gimp_color_scales_init (GimpColorScales *scales) scales->show_hsv_binding = NULL; /* don't need the toggles for our own operation */ - selector->toggles_visible = FALSE; + gimp_color_selector_set_toggles_visible (selector, FALSE); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (GTK_BOX (scales), hbox, 0, 0, FALSE); @@ -600,8 +591,7 @@ gimp_color_scales_set_show_alpha (GimpColorSelector *selector, static void gimp_color_scales_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { GimpColorScales *scales = GIMP_COLOR_SCALES (selector); @@ -734,29 +724,31 @@ gimp_color_scales_update_scales (GimpColorScales *scales, gint skip) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales); - GimpLCH lch; + GeglColor *color = gimp_color_selector_get_color (selector); + gdouble pixel[4]; gdouble values[G_N_ELEMENTS (scale_defs)]; gint i; - babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1); + gegl_color_get_pixel (color, babl_format ("HSV double"), 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; - values[GIMP_COLOR_SELECTOR_HUE] = selector->hsv.h * 360.0; - values[GIMP_COLOR_SELECTOR_SATURATION] = selector->hsv.s * 100.0; - values[GIMP_COLOR_SELECTOR_VALUE] = selector->hsv.v * 100.0; + gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), pixel); + values[GIMP_COLOR_SELECTOR_RED] = pixel[0] * 100.0; + values[GIMP_COLOR_SELECTOR_GREEN] = pixel[1] * 100.0; + values[GIMP_COLOR_SELECTOR_BLUE] = pixel[2] * 100.0; + values[GIMP_COLOR_SELECTOR_ALPHA] = pixel[3] * 100.0; - values[GIMP_COLOR_SELECTOR_RED] = selector->rgb.r * 100.0; - values[GIMP_COLOR_SELECTOR_GREEN] = selector->rgb.g * 100.0; - values[GIMP_COLOR_SELECTOR_BLUE] = selector->rgb.b * 100.0; - values[GIMP_COLOR_SELECTOR_ALPHA] = selector->rgb.a * 100.0; + values[GIMP_COLOR_SELECTOR_RED_U8] = pixel[0] * 255.0; + values[GIMP_COLOR_SELECTOR_GREEN_U8] = pixel[1] * 255.0; + values[GIMP_COLOR_SELECTOR_BLUE_U8] = pixel[2] * 255.0; + values[GIMP_COLOR_SELECTOR_ALPHA_U8] = pixel[3] * 255.0; - values[GIMP_COLOR_SELECTOR_LCH_LIGHTNESS] = lch.l; - values[GIMP_COLOR_SELECTOR_LCH_CHROMA] = lch.c; - values[GIMP_COLOR_SELECTOR_LCH_HUE] = lch.h; - - values[GIMP_COLOR_SELECTOR_RED_U8] = selector->rgb.r * 255.0; - values[GIMP_COLOR_SELECTOR_GREEN_U8] = selector->rgb.g * 255.0; - values[GIMP_COLOR_SELECTOR_BLUE_U8] = selector->rgb.b * 255.0; - values[GIMP_COLOR_SELECTOR_ALPHA_U8] = selector->rgb.a * 255.0; + gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) double"), pixel); + values[GIMP_COLOR_SELECTOR_LCH_LIGHTNESS] = pixel[0]; + values[GIMP_COLOR_SELECTOR_LCH_CHROMA] = pixel[1]; + values[GIMP_COLOR_SELECTOR_LCH_HUE] = pixel[2]; for (i = 0; i < G_N_ELEMENTS (scale_defs); i++) { @@ -773,9 +765,10 @@ gimp_color_scales_update_scales (GimpColorScales *scales, scales); } - gimp_color_scale_set_color (GIMP_COLOR_SCALE (gimp_scale_entry_get_range (GIMP_SCALE_ENTRY (scales->scales[i]))), - &selector->rgb, &selector->hsv); + gimp_color_scale_set_color (GIMP_COLOR_SCALE (gimp_scale_entry_get_range (GIMP_SCALE_ENTRY (scales->scales[i]))), color); } + + g_object_unref (color); } static void @@ -812,101 +805,102 @@ gimp_color_scales_scale_changed (GtkWidget *scale, GimpColorScales *scales) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales); + GeglColor *color = gimp_color_selector_get_color (selector); gdouble value = gimp_label_spin_get_value (GIMP_LABEL_SPIN (scale)); - GimpLCH lch; + gdouble lch[4]; + gdouble hsv[4]; + gdouble rgb[4]; gint i; for (i = 0; i < G_N_ELEMENTS (scale_defs); i++) if (scales->scales[i] == scale) break; + gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), rgb); + gegl_color_get_pixel (color, babl_format ("HSVA double"), hsv); + gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) alpha double"), lch); + switch (i) { case GIMP_COLOR_SELECTOR_HUE: - selector->hsv.h = value / 360.0; + hsv[0] = value / 360.0; break; case GIMP_COLOR_SELECTOR_SATURATION: - selector->hsv.s = value / 100.0; + hsv[1] = value / 100.0; break; case GIMP_COLOR_SELECTOR_VALUE: - selector->hsv.v = value / 100.0; + hsv[2] = value / 100.0; break; case GIMP_COLOR_SELECTOR_RED: - selector->rgb.r = value / 100.0; + rgb[0] = value / 100.0; break; case GIMP_COLOR_SELECTOR_GREEN: - selector->rgb.g = value / 100.0; + rgb[1] = value / 100.0; break; case GIMP_COLOR_SELECTOR_BLUE: - selector->rgb.b = value / 100.0; + rgb[2] = value / 100.0; break; case GIMP_COLOR_SELECTOR_ALPHA: - selector->hsv.a = selector->rgb.a = value / 100.0; + gimp_color_set_alpha (color, value / 100.0); break; case GIMP_COLOR_SELECTOR_LCH_LIGHTNESS: - babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1); - lch.l = value; + lch[0] = value; break; case GIMP_COLOR_SELECTOR_LCH_CHROMA: - babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1); - lch.c = value; + lch[1] = value; break; case GIMP_COLOR_SELECTOR_LCH_HUE: - babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1); - lch.h = value; + lch[2] = value; break; case GIMP_COLOR_SELECTOR_RED_U8: - selector->rgb.r = value / 255.0; + rgb[0] = value / 255.0; break; case GIMP_COLOR_SELECTOR_GREEN_U8: - selector->rgb.g = value / 255.0; + rgb[1] = value / 255.0; break; case GIMP_COLOR_SELECTOR_BLUE_U8: - selector->rgb.b = value / 255.0; + rgb[2] = value / 255.0; break; case GIMP_COLOR_SELECTOR_ALPHA_U8: - selector->hsv.a = selector->rgb.a = value / 255.0; + gimp_color_set_alpha (color, value / 255.0); break; } + if ((i >= GIMP_COLOR_SELECTOR_HUE) && (i <= GIMP_COLOR_SELECTOR_VALUE)) { - gimp_hsv_to_rgb (&selector->hsv, &selector->rgb); + gegl_color_set_pixel (color, babl_format ("HSVA double"), hsv); } else if ((i >= GIMP_COLOR_SELECTOR_LCH_LIGHTNESS) && (i <= GIMP_COLOR_SELECTOR_LCH_HUE)) { - babl_process (fish_lch_to_rgb, &lch, &selector->rgb, 1); - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); + gegl_color_set_pixel (color, babl_format ("CIE LCH(ab) alpha double"), lch); } - else if ((i >= GIMP_COLOR_SELECTOR_RED) && - (i <= GIMP_COLOR_SELECTOR_BLUE)) + else if (((i >= GIMP_COLOR_SELECTOR_RED) && + (i <= GIMP_COLOR_SELECTOR_BLUE)) || + ((i >= GIMP_COLOR_SELECTOR_RED_U8) && + (i <= GIMP_COLOR_SELECTOR_BLUE_U8))) { - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - } - else if ((i >= GIMP_COLOR_SELECTOR_RED_U8) && - (i <= GIMP_COLOR_SELECTOR_BLUE_U8)) - { - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); + gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), rgb); } - gimp_color_scales_update_scales (scales, i); + gimp_color_selector_set_color (selector, color); - gimp_color_selector_emit_color_changed (selector); + g_object_unref (color); } static void diff --git a/libgimpwidgets/gimpcolorselect.c b/libgimpwidgets/gimpcolorselect.c index e91c5f2a3c..6efce801a4 100644 --- a/libgimpwidgets/gimpcolorselect.c +++ b/libgimpwidgets/gimpcolorselect.c @@ -171,9 +171,9 @@ struct _ColorSelectFill gint y; gint width; gint height; - GimpRGB rgb; - GimpHSV hsv; - GimpLCH lch; + gdouble rgb[4]; + gdouble hsv[4]; + gdouble lch[4]; guchar oog_color[3]; ColorSelectRenderFunc render_line; @@ -187,8 +187,7 @@ static void gimp_color_select_togg_visible (GimpColorSelector *selector, static void gimp_color_select_togg_sensitive (GimpColorSelector *selector, gboolean sensitive); static void gimp_color_select_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void gimp_color_select_set_channel (GimpColorSelector *selector, GimpColorSelectorChannel channel); static void gimp_color_select_set_model_visible @@ -239,8 +238,7 @@ static void gimp_color_select_render (GtkWidget *widget, gint height, gint rowstride, ColorSelectFillType fill_type, - const GimpHSV *hsv, - const GimpRGB *rgb, + GeglColor *color, const guchar *oog_color); static void color_select_render_red (ColorSelectFill *csf); @@ -306,7 +304,6 @@ static const ColorSelectRenderFunc render_funcs[] = color_select_render_lch_chroma_lightness }; -static const Babl *fish_rgb_to_lch = NULL; static const Babl *fish_lch_to_rgb = NULL; static const Babl *fish_lch_to_rgb_u8 = NULL; @@ -331,8 +328,6 @@ gimp_color_select_class_init (GimpColorSelectClass *klass) gtk_widget_class_set_css_name (GTK_WIDGET_CLASS (klass), "GimpColorSelect"); - fish_rgb_to_lch = babl_fish (babl_format ("R'G'B'A double"), - babl_format ("CIE LCH(ab) double")); fish_lch_to_rgb = babl_fish (babl_format ("CIE LCH(ab) double"), babl_format ("R'G'B' double")); fish_lch_to_rgb_u8 = babl_fish (babl_format ("CIE LCH(ab) double"), @@ -543,8 +538,7 @@ gimp_color_select_togg_sensitive (GimpColorSelector *selector, static void gimp_color_select_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { GimpColorSelect *select = GIMP_COLOR_SELECT (selector); @@ -690,153 +684,144 @@ gimp_color_select_update (GimpColorSelect *select, select->z_needs_render = TRUE; gtk_widget_queue_draw (select->z_color); } - - if (update & UPDATE_CALLER) - gimp_color_selector_emit_color_changed (GIMP_COLOR_SELECTOR (select)); } static void gimp_color_select_update_values (GimpColorSelect *select) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (select); - GimpLCH lch; + GeglColor *color = gimp_color_selector_get_color (selector); + gdouble values[3]; + const Babl *rgb_format; + + /* TODO: we want to select colors in the image space! */ + rgb_format = babl_format_with_space ("R'G'B' double", NULL); switch (select->z_color_fill) { case COLOR_SELECT_RED: - selector->rgb.g = select->pos[0]; - selector->rgb.b = select->pos[1]; - selector->rgb.r = select->pos[2]; + values[0] = select->pos[2]; + values[1] = select->pos[0]; + values[2] = select->pos[1]; + gegl_color_set_pixel (color, rgb_format, values); break; case COLOR_SELECT_GREEN: - selector->rgb.r = select->pos[0]; - selector->rgb.b = select->pos[1]; - selector->rgb.g = select->pos[2]; + values[0] = select->pos[0]; + values[1] = select->pos[2]; + values[2] = select->pos[1]; + gegl_color_set_pixel (color, rgb_format, values); break; case COLOR_SELECT_BLUE: - selector->rgb.r = select->pos[0]; - selector->rgb.g = select->pos[1]; - selector->rgb.b = select->pos[2]; + gegl_color_set_pixel (color, rgb_format, select->pos); break; case COLOR_SELECT_HUE: - selector->hsv.s = select->pos[0]; - selector->hsv.v = select->pos[1]; - selector->hsv.h = select->pos[2]; + values[0] = select->pos[2]; + values[1] = select->pos[0]; + values[2] = select->pos[1]; + gegl_color_set_pixel (color, babl_format ("HSV double"), values); break; case COLOR_SELECT_SATURATION: - selector->hsv.h = select->pos[0]; - selector->hsv.v = select->pos[1]; - selector->hsv.s = select->pos[2]; + values[0] = select->pos[0]; + values[1] = select->pos[2]; + values[2] = select->pos[1]; + gegl_color_set_pixel (color, babl_format ("HSV double"), values); break; case COLOR_SELECT_VALUE: - selector->hsv.h = select->pos[0]; - selector->hsv.s = select->pos[1]; - selector->hsv.v = select->pos[2]; + gegl_color_set_pixel (color, babl_format ("HSV double"), select->pos); break; case COLOR_SELECT_LCH_LIGHTNESS: - lch.h = select->pos[0] * 360; - lch.c = select->pos[1] * 200; - lch.l = select->pos[2] * 100; + values[0] = select->pos[2] * 100.0; + values[1] = select->pos[1] * 200.0; + values[2] = select->pos[0] * 360.0; + gegl_color_set_pixel (color, babl_format ("CIE LCH(ab) double"), values); break; case COLOR_SELECT_LCH_CHROMA: - lch.h = select->pos[0] * 360; - lch.l = select->pos[1] * 100; - lch.c = select->pos[2] * 200; + values[0] = select->pos[1] * 100.0; + values[1] = select->pos[2] * 200.0; + values[2] = select->pos[0] * 360.0; + gegl_color_set_pixel (color, babl_format ("CIE LCH(ab) double"), values); break; case COLOR_SELECT_LCH_HUE: - lch.c = select->pos[0] * 200; - lch.l = select->pos[1] * 100; - lch.h = select->pos[2] * 360; + values[0] = select->pos[1] * 100.0; + values[1] = select->pos[0] * 200.0; + values[2] = select->pos[2] * 360.0; + gegl_color_set_pixel (color, babl_format ("CIE LCH(ab) double"), values); break; default: break; } - switch (select->z_color_fill) - { - case COLOR_SELECT_RED: - case COLOR_SELECT_GREEN: - case COLOR_SELECT_BLUE: - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - break; + gimp_color_selector_set_color (selector, color); - case COLOR_SELECT_HUE: - case COLOR_SELECT_SATURATION: - case COLOR_SELECT_VALUE: - gimp_hsv_to_rgb (&selector->hsv, &selector->rgb); - break; - - case COLOR_SELECT_LCH_LIGHTNESS: - case COLOR_SELECT_LCH_CHROMA: - case COLOR_SELECT_LCH_HUE: - babl_process (fish_lch_to_rgb, &lch, &selector->rgb, 1); - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - break; - - default: - break; - } + g_object_unref (color); } static void gimp_color_select_update_pos (GimpColorSelect *select) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (select); - GimpLCH lch; + GeglColor *color = gimp_color_selector_get_color (selector); + gdouble rgb[3]; + gdouble lch[3]; + gdouble hsv[3]; - babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1); + /* TODO select RGB and HSV within the target RGB space. */ + gegl_color_get_pixel (color, babl_format ("R'G'B' double"), rgb); + gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) double"), lch); + gegl_color_get_pixel (color, babl_format ("HSV double"), hsv); + g_object_unref (color); switch (select->z_color_fill) { case COLOR_SELECT_RED: - select->pos[0] = CLAMP (selector->rgb.g, 0.0, 1.0); - select->pos[1] = CLAMP (selector->rgb.b, 0.0, 1.0); - select->pos[2] = CLAMP (selector->rgb.r, 0.0, 1.0); + select->pos[0] = CLAMP (rgb[1], 0.0, 1.0); + select->pos[1] = CLAMP (rgb[2], 0.0, 1.0); + select->pos[2] = CLAMP (rgb[0], 0.0, 1.0); break; case COLOR_SELECT_GREEN: - select->pos[0] = CLAMP (selector->rgb.r, 0.0, 1.0); - select->pos[1] = CLAMP (selector->rgb.b, 0.0, 1.0); - select->pos[2] = CLAMP (selector->rgb.g, 0.0, 1.0); + select->pos[0] = CLAMP (rgb[0], 0.0, 1.0); + select->pos[1] = CLAMP (rgb[2], 0.0, 1.0); + select->pos[2] = CLAMP (rgb[1], 0.0, 1.0); break; case COLOR_SELECT_BLUE: - select->pos[0] = CLAMP (selector->rgb.r, 0.0, 1.0); - select->pos[1] = CLAMP (selector->rgb.g, 0.0, 1.0); - select->pos[2] = CLAMP (selector->rgb.b, 0.0, 1.0); + select->pos[0] = CLAMP (rgb[0], 0.0, 1.0); + select->pos[1] = CLAMP (rgb[1], 0.0, 1.0); + select->pos[2] = CLAMP (rgb[2], 0.0, 1.0); break; case COLOR_SELECT_HUE: - select->pos[0] = CLAMP (selector->hsv.s, 0.0, 1.0); - select->pos[1] = CLAMP (selector->hsv.v, 0.0, 1.0); - select->pos[2] = CLAMP (selector->hsv.h, 0.0, 1.0); + select->pos[0] = CLAMP (hsv[1], 0.0, 1.0); + select->pos[1] = CLAMP (hsv[2], 0.0, 1.0); + select->pos[2] = CLAMP (hsv[0], 0.0, 1.0); break; case COLOR_SELECT_SATURATION: - select->pos[0] = CLAMP (selector->hsv.h, 0.0, 1.0); - select->pos[1] = CLAMP (selector->hsv.v, 0.0, 1.0); - select->pos[2] = CLAMP (selector->hsv.s, 0.0, 1.0); + select->pos[0] = CLAMP (hsv[0], 0.0, 1.0); + select->pos[1] = CLAMP (hsv[2], 0.0, 1.0); + select->pos[2] = CLAMP (hsv[1], 0.0, 1.0); break; case COLOR_SELECT_VALUE: - select->pos[0] = CLAMP (selector->hsv.h, 0.0, 1.0); - select->pos[1] = CLAMP (selector->hsv.s, 0.0, 1.0); - select->pos[2] = CLAMP (selector->hsv.v, 0.0, 1.0); + select->pos[0] = CLAMP (hsv[0], 0.0, 1.0); + select->pos[1] = CLAMP (hsv[1], 0.0, 1.0); + select->pos[2] = CLAMP (hsv[2], 0.0, 1.0); break; case COLOR_SELECT_LCH_LIGHTNESS: - select->pos[0] = CLAMP (lch.h / 360, 0.0, 1.0); - select->pos[1] = CLAMP (lch.c / 200, 0.0, 1.0); - select->pos[2] = CLAMP (lch.l / 100, 0.0, 1.0); + select->pos[0] = CLAMP (lch[2] / 360, 0.0, 1.0); + select->pos[1] = CLAMP (lch[1] / 200, 0.0, 1.0); + select->pos[2] = CLAMP (lch[0] / 100, 0.0, 1.0); break; case COLOR_SELECT_LCH_CHROMA: - select->pos[0] = CLAMP (lch.h / 360, 0.0, 1.0); - select->pos[1] = CLAMP (lch.l / 100, 0.0, 1.0); - select->pos[2] = CLAMP (lch.c / 200, 0.0, 1.0); + select->pos[0] = CLAMP (lch[2] / 360, 0.0, 1.0); + select->pos[1] = CLAMP (lch[0] / 100, 0.0, 1.0); + select->pos[2] = CLAMP (lch[1] / 200, 0.0, 1.0); break; case COLOR_SELECT_LCH_HUE: - select->pos[0] = CLAMP (lch.c / 200, 0.0, 1.0); - select->pos[1] = CLAMP (lch.l / 100, 0.0, 1.0); - select->pos[2] = CLAMP (lch.h / 360, 0.0, 1.0); + select->pos[0] = CLAMP (lch[1] / 200, 0.0, 1.0); + select->pos[1] = CLAMP (lch[0] / 100, 0.0, 1.0); + select->pos[2] = CLAMP (lch[2] / 360, 0.0, 1.0); break; default: @@ -902,6 +887,7 @@ gimp_color_select_xy_draw (GtkWidget *widget, if (select->xy_needs_render) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (select); + GeglColor *color = gimp_color_selector_get_color (selector); gimp_color_select_render (select->xy_color, select->xy_buf, @@ -909,10 +895,11 @@ gimp_color_select_xy_draw (GtkWidget *widget, select->xy_height, select->xy_rowstride, select->xy_color_fill, - &selector->hsv, - &selector->rgb, + color, select->oog_color); select->xy_needs_render = FALSE; + + g_object_unref (color); } if (! select->transform) @@ -1099,6 +1086,7 @@ gimp_color_select_z_draw (GtkWidget *widget, if (select->z_needs_render) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (select); + GeglColor *color = gimp_color_selector_get_color (selector); gimp_color_select_render (select->z_color, select->z_buf, @@ -1106,10 +1094,11 @@ gimp_color_select_z_draw (GtkWidget *widget, select->z_height, select->z_rowstride, select->z_color_fill, - &selector->hsv, - &selector->rgb, + color, select->oog_color); select->z_needs_render = FALSE; + + g_object_unref (color); } gtk_widget_get_allocation (widget, &allocation); @@ -1256,24 +1245,23 @@ gimp_color_select_render (GtkWidget *preview, gint height, gint rowstride, ColorSelectFillType fill_type, - const GimpHSV *hsv, - const GimpRGB *rgb, + GeglColor *color, const guchar *oog_color) { ColorSelectFill csf; csf.width = width; csf.height = height; - csf.hsv = *hsv; - csf.rgb = *rgb; csf.render_line = render_funcs[fill_type]; + gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), csf.rgb); + gegl_color_get_pixel (color, babl_format ("HSVA double"), csf.hsv); + gegl_color_get_pixel (color, babl_format ("CIE LCH(ab) alpha double"), csf.lch); + csf.oog_color[0] = oog_color[0]; csf.oog_color[1] = oog_color[1]; csf.oog_color[2] = oog_color[2]; - babl_process (fish_rgb_to_lch, rgb, &csf.lch, 1); - for (csf.y = 0; csf.y < csf.height; csf.y++) { csf.buffer = buf; @@ -1437,11 +1425,11 @@ static void color_select_render_lch_lightness (ColorSelectFill *csf) { guchar *p = csf->buffer; - GimpLCH lch = { 0.0, 0.0, 0.0, 1.0 }; + gdouble lch[4] = { 0.0, 0.0, 0.0, 1.0 }; guchar rgb[3]; gint i; - lch.l = (csf->height - 1 - csf->y) * 100.0 / csf->height; + lch[0] = (csf->height - 1 - csf->y) * 100.0 / csf->height; babl_process (fish_lch_to_rgb_u8, &lch, &rgb, 1); for (i = 0; i < csf->width; i++) @@ -1456,11 +1444,11 @@ static void color_select_render_lch_chroma (ColorSelectFill *csf) { guchar *p = csf->buffer; - GimpLCH lch = { 80.0, 0.0, 0.0, 1.0 }; + gdouble lch[4] = { 80.0, 0.0, 0.0, 1.0 }; guchar rgb[3]; gint i; - lch.c = (csf->height - 1 - csf->y) * 200.0 / csf->height ; + lch[1] = (csf->height - 1 - csf->y) * 200.0 / csf->height ; babl_process (fish_lch_to_rgb_u8, &lch, &rgb, 1); for (i = 0; i < csf->width; i++) @@ -1474,12 +1462,12 @@ color_select_render_lch_chroma (ColorSelectFill *csf) static void color_select_render_lch_hue (ColorSelectFill *csf) { - guchar *p = csf->buffer; - GimpLCH lch = { 80.0, 200.0, 0.0, 1.0 }; + guchar *p = csf->buffer; + gdouble lch[4] = { 80.0, 200.0, 0.0, 1.0 }; guchar rgb[3]; gint i; - lch.h = (csf->height - 1 - csf->y) * 360.0 / csf->height; + lch[2] = (csf->height - 1 - csf->y) * 360.0 / csf->height; babl_process (fish_lch_to_rgb_u8, &lch, &rgb, 1); for (i = 0; i < csf->width; i++) @@ -1500,7 +1488,7 @@ color_select_render_red_green (ColorSelectFill *csf) gfloat dr = 0; gint i; - b = csf->rgb.b * 255.0; + b = csf->rgb[2] * 255.0; if (b < 0.0 || b > 255.0) { @@ -1535,7 +1523,7 @@ color_select_render_red_blue (ColorSelectFill *csf) gfloat dr = 0; gint i; - g = csf->rgb.g * 255.0; + g = csf->rgb[1] * 255.0; if (g < 0.0 || g > 255.0) { @@ -1570,7 +1558,7 @@ color_select_render_green_blue (ColorSelectFill *csf) gfloat dg = 0; gint i; - r = csf->rgb.r * 255.0; + r = csf->rgb[0] * 255.0; if (r < 0.0 || r > 255.0) { @@ -1603,7 +1591,7 @@ color_select_render_hue_saturation (ColorSelectFill *csf) gint f; gint i; - v = csf->hsv.v; + v = csf->hsv[2]; s = (gfloat) csf->y / csf->height; s = CLAMP (s, 0.0, 1.0); @@ -1680,7 +1668,7 @@ color_select_render_hue_value (ColorSelectFill *csf) gint f; gint i; - s = csf->hsv.s; + s = csf->hsv[1]; v = (gfloat) csf->y / csf->height; v = CLAMP (v, 0.0, 1.0); @@ -1757,7 +1745,7 @@ color_select_render_saturation_value (ColorSelectFill *csf) gint f; gint i; - h = (gfloat) csf->hsv.h * 360.0; + h = (gfloat) csf->hsv[0] * 360.0; if (h >= 360) h -= 360; h /= 60; @@ -1839,23 +1827,23 @@ static void color_select_render_lch_chroma_lightness (ColorSelectFill *csf) { guchar *p = csf->buffer; - GimpLCH lch; + gdouble lch[3]; gint i; - lch.l = (csf->height - 1 - csf->y) * 100.0 / csf->height; - lch.h = csf->lch.h; + lch[0] = (csf->height - 1 - csf->y) * 100.0 / csf->height; + lch[2] = csf->lch[2]; for (i = 0; i < csf->width; i++) { - GimpRGB rgb; + gdouble rgb[3]; - lch.c = i * 200.0 / csf->width; + lch[1] = i * 200.0 / csf->width; babl_process (fish_lch_to_rgb, &lch, &rgb, 1); - if (rgb.r < 0.0 || rgb.r > 1.0 || - rgb.g < 0.0 || rgb.g > 1.0 || - rgb.b < 0.0 || rgb.b > 1.0) + if (rgb[0] < 0.0 || rgb[0] > 1.0 || + rgb[1] < 0.0 || rgb[1] > 1.0 || + rgb[2] < 0.0 || rgb[2] > 1.0) { p[0] = csf->oog_color[0]; p[1] = csf->oog_color[1]; @@ -1863,7 +1851,9 @@ color_select_render_lch_chroma_lightness (ColorSelectFill *csf) } else { - gimp_rgb_get_uchar (&rgb, p, p + 1, p + 2); + p[0] = rgb[0] * 255; + p[1] = rgb[1] * 255; + p[2] = rgb[2] * 255; } p += 3; @@ -1874,23 +1864,26 @@ static void color_select_render_lch_hue_lightness (ColorSelectFill *csf) { guchar *p = csf->buffer; - GimpLCH lch; + gdouble lch[3]; gint i; - lch.l = (csf->height - 1 - csf->y) * 100.0 / csf->height; - lch.c = csf->lch.c; + lch[0] = (csf->height - 1 - csf->y) * 100.0 / csf->height; + lch[1] = csf->lch[1]; for (i = 0; i < csf->width; i++) { - GimpRGB rgb; + gdouble rgb[3]; - lch.h = i * 360.0 / csf->width; + lch[2] = i * 360.0 / csf->width; + /* TODO: determine if color is out of target space gammut instead of out + * of sRGB gamut. + */ babl_process (fish_lch_to_rgb, &lch, &rgb, 1); - if (rgb.r < 0.0 || rgb.r > 1.0 || - rgb.g < 0.0 || rgb.g > 1.0 || - rgb.b < 0.0 || rgb.b > 1.0) + if (rgb[0] < 0.0 || rgb[0] > 1.0 || + rgb[1] < 0.0 || rgb[1] > 1.0 || + rgb[2] < 0.0 || rgb[2] > 1.0) { p[0] = csf->oog_color[0]; p[1] = csf->oog_color[1]; @@ -1898,7 +1891,9 @@ color_select_render_lch_hue_lightness (ColorSelectFill *csf) } else { - gimp_rgb_get_uchar (&rgb, p, p + 1, p + 2); + p[0] = rgb[0] * 255; + p[1] = rgb[1] * 255; + p[2] = rgb[2] * 255; } p += 3; @@ -1909,23 +1904,23 @@ static void color_select_render_lch_hue_chroma (ColorSelectFill *csf) { guchar *p = csf->buffer; - GimpLCH lch; + gdouble lch[3]; gint i; - lch.l = csf->lch.l; - lch.c = (csf->height - 1 - csf->y) * 200.0 / csf->height; + lch[0] = csf->lch[0]; + lch[1] = (csf->height - 1 - csf->y) * 200.0 / csf->height; for (i = 0; i < csf->width; i++) { - GimpRGB rgb; + gdouble rgb[3]; - lch.h = i * 360.0 / csf->width; + lch[2] = i * 360.0 / csf->width; babl_process (fish_lch_to_rgb, &lch, &rgb, 1); - if (rgb.r < 0.0 || rgb.r > 1.0 || - rgb.g < 0.0 || rgb.g > 1.0 || - rgb.b < 0.0 || rgb.b > 1.0) + if (rgb[0] < 0.0 || rgb[0] > 1.0 || + rgb[1] < 0.0 || rgb[1] > 1.0 || + rgb[2] < 0.0 || rgb[2] > 1.0) { p[0] = csf->oog_color[0]; p[1] = csf->oog_color[1]; @@ -1933,7 +1928,9 @@ color_select_render_lch_hue_chroma (ColorSelectFill *csf) } else { - gimp_rgb_get_uchar (&rgb, p, p + 1, p + 2); + p[0] = rgb[0] * 255; + p[1] = rgb[1] * 255; + p[2] = rgb[2] * 255; } p += 3; diff --git a/libgimpwidgets/gimpcolorselection.c b/libgimpwidgets/gimpcolorselection.c index def159f97d..ef17ad7c7e 100644 --- a/libgimpwidgets/gimpcolorselection.c +++ b/libgimpwidgets/gimpcolorselection.c @@ -111,12 +111,10 @@ static void gimp_color_selection_switch_page (GtkWidget *widget guint page_num, GimpColorSelection *selection); static void gimp_color_selection_notebook_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorSelection *selection); static void gimp_color_selection_scales_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorSelection *selection); static void gimp_color_selection_color_picked (GtkWidget *widget, const GimpRGB *rgb, @@ -182,8 +180,6 @@ gimp_color_selection_init (GimpColorSelection *selection) GtkWidget *button; GtkSizeGroup *new_group; GtkSizeGroup *old_group; - GimpRGB rgb; - GimpHSV hsv; selection->priv = gimp_color_selection_get_instance_private (selection); @@ -194,11 +190,7 @@ gimp_color_selection_init (GimpColorSelection *selection) gtk_orientable_set_orientation (GTK_ORIENTABLE (selection), GTK_ORIENTATION_VERTICAL); - priv->color = gegl_color_new ("black"); - - gegl_color_get_pixel (priv->color, babl_format ("R'G'B'A double"), &rgb); - gegl_color_get_pixel (priv->color, babl_format ("HSVA double"), &hsv); - + priv->color = gegl_color_new ("black"); priv->channel = GIMP_COLOR_SELECTOR_RED; main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); @@ -217,8 +209,7 @@ gimp_color_selection_init (GimpColorSelection *selection) _gimp_ensure_modules_func (); } - priv->notebook = gimp_color_selector_new (GIMP_TYPE_COLOR_NOTEBOOK, - &rgb, &hsv, priv->channel); + priv->notebook = gimp_color_selector_new (GIMP_TYPE_COLOR_NOTEBOOK, priv->color, priv->channel); if (_gimp_ensure_modules_func) g_type_class_unref (g_type_class_peek (GIMP_TYPE_COLOR_SELECT)); @@ -306,8 +297,8 @@ gimp_color_selection_init (GimpColorSelection *selection) TRUE, TRUE, 0); gtk_widget_show (priv->right_vbox); - priv->scales = gimp_color_selector_new (GIMP_TYPE_COLOR_SCALES, - &rgb, &hsv, priv->channel); + priv->scales = gimp_color_selector_new (GIMP_TYPE_COLOR_SCALES, priv->color, priv->channel); + gimp_color_selector_set_toggles_visible (GIMP_COLOR_SELECTOR (priv->scales), TRUE); gimp_color_selector_set_show_alpha (GIMP_COLOR_SELECTOR (priv->scales), @@ -462,18 +453,23 @@ gimp_color_selection_set_color (GimpColorSelection *selection, GeglColor *color) { GimpColorSelectionPrivate *priv; + GeglColor *old_color; g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); g_return_if_fail (GEGL_IS_COLOR (color)); priv = GET_PRIVATE (selection); - g_object_unref (priv->color); + old_color = priv->color; priv->color = gegl_color_duplicate (color); - gimp_color_selection_update (selection, UPDATE_ALL); + if (! gimp_color_is_perceptually_identical (priv->color, old_color)) + { + gimp_color_selection_update (selection, UPDATE_ALL); + gimp_color_selection_color_changed (selection); + } - gimp_color_selection_color_changed (selection); + g_object_unref (old_color); } /** @@ -681,32 +677,44 @@ gimp_color_selection_switch_page (GtkWidget *widget, static void gimp_color_selection_notebook_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorSelection *selection) { GimpColorSelectionPrivate *priv = GET_PRIVATE (selection); + GeglColor *old_color; - gegl_color_set_pixel (priv->color, babl_format ("HSVA double"), hsv); + old_color = priv->color; + priv->color = gegl_color_duplicate (color); - gimp_color_selection_update (selection, - UPDATE_SCALES | UPDATE_ENTRY | UPDATE_COLOR); - gimp_color_selection_color_changed (selection); + if (! gimp_color_is_perceptually_identical (priv->color, old_color)) + { + gimp_color_selection_update (selection, + UPDATE_SCALES | UPDATE_ENTRY | UPDATE_COLOR); + gimp_color_selection_color_changed (selection); + } + + g_object_unref (old_color); } static void gimp_color_selection_scales_changed (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorSelection *selection) { GimpColorSelectionPrivate *priv = GET_PRIVATE (selection); + GeglColor *old_color; - gegl_color_set_pixel (priv->color, babl_format ("HSVA double"), hsv); + old_color = priv->color; + priv->color = gegl_color_duplicate (color); - gimp_color_selection_update (selection, - UPDATE_ENTRY | UPDATE_NOTEBOOK | UPDATE_COLOR); - gimp_color_selection_color_changed (selection); + if (! gimp_color_is_perceptually_identical (priv->color, old_color)) + { + gimp_color_selection_update (selection, + UPDATE_ENTRY | UPDATE_NOTEBOOK | UPDATE_COLOR); + gimp_color_selection_color_changed (selection); + } + + g_object_unref (old_color); } static void @@ -768,11 +776,6 @@ gimp_color_selection_update (GimpColorSelection *selection, UpdateType update) { GimpColorSelectionPrivate *priv = GET_PRIVATE (selection); - GimpRGB rgb; - GimpHSV hsv; - - gegl_color_get_pixel (priv->color, babl_format ("R'G'B'A double"), &rgb); - gegl_color_get_pixel (priv->color, babl_format ("HSVA double"), &hsv); if (update & UPDATE_NOTEBOOK) { @@ -780,8 +783,7 @@ gimp_color_selection_update (GimpColorSelection *selection, gimp_color_selection_notebook_changed, selection); - gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (priv->notebook), - &rgb, &hsv); + gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (priv->notebook), priv->color); g_signal_handlers_unblock_by_func (priv->notebook, gimp_color_selection_notebook_changed, @@ -794,8 +796,7 @@ gimp_color_selection_update (GimpColorSelection *selection, gimp_color_selection_scales_changed, selection); - gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (priv->scales), - &rgb, &hsv); + gimp_color_selector_set_color (GIMP_COLOR_SELECTOR (priv->scales), priv->color); g_signal_handlers_unblock_by_func (priv->scales, gimp_color_selection_scales_changed, diff --git a/libgimpwidgets/gimpcolorselector.c b/libgimpwidgets/gimpcolorselector.c index 0f15e92f86..ff112608c1 100644 --- a/libgimpwidgets/gimpcolorselector.c +++ b/libgimpwidgets/gimpcolorselector.c @@ -60,13 +60,25 @@ enum struct _GimpColorSelectorPrivate { - gboolean model_visible[3]; + gboolean toggles_visible; + gboolean toggles_sensitive; + gboolean show_alpha; + gboolean model_visible[3]; + + GimpColorSelectorChannel channel; + + GeglColor *color; }; #define GET_PRIVATE(obj) (((GimpColorSelector *) (obj))->priv) -static void gimp_color_selector_dispose (GObject *object); +static void gimp_color_selector_dispose (GObject *object); + +static void gimp_color_selector_emit_color_changed (GimpColorSelector *selector); +static void gimp_color_selector_emit_channel_changed (GimpColorSelector *selector); +static void gimp_color_selector_emit_model_visible_changed (GimpColorSelector *selector, + GimpColorSelectorModel model); G_DEFINE_TYPE_WITH_PRIVATE (GimpColorSelector, gimp_color_selector, @@ -89,11 +101,9 @@ gimp_color_selector_class_init (GimpColorSelectorClass *klass) G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GimpColorSelectorClass, color_changed), - NULL, NULL, - _gimp_widgets_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - GIMP_TYPE_RGB, - GIMP_TYPE_RGB); + NULL, NULL, NULL, + G_TYPE_NONE, 1, + GEGL_TYPE_COLOR); selector_signals[CHANNEL_CHANGED] = g_signal_new ("channel-changed", @@ -140,18 +150,16 @@ gimp_color_selector_init (GimpColorSelector *selector) priv = GET_PRIVATE (selector); - selector->toggles_visible = TRUE; - selector->toggles_sensitive = TRUE; - selector->show_alpha = TRUE; + priv->toggles_visible = TRUE; + priv->toggles_sensitive = TRUE; + priv->show_alpha = TRUE; gtk_orientable_set_orientation (GTK_ORIENTABLE (selector), GTK_ORIENTATION_VERTICAL); - gimp_rgba_set (&selector->rgb, 0.0, 0.0, 0.0, 1.0); - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - - selector->channel = GIMP_COLOR_SELECTOR_RED; + priv->channel = GIMP_COLOR_SELECTOR_RED; + priv->color = gegl_color_new ("black"); priv->model_visible[GIMP_COLOR_SELECTOR_MODEL_RGB] = TRUE; priv->model_visible[GIMP_COLOR_SELECTOR_MODEL_LCH] = TRUE; priv->model_visible[GIMP_COLOR_SELECTOR_MODEL_HSV] = FALSE; @@ -160,7 +168,10 @@ gimp_color_selector_init (GimpColorSelector *selector) static void gimp_color_selector_dispose (GObject *object) { - gimp_color_selector_set_config (GIMP_COLOR_SELECTOR (object), NULL); + GimpColorSelector *selector = GIMP_COLOR_SELECTOR (object); + + gimp_color_selector_set_config (selector, NULL); + g_clear_object (&selector->priv->color); G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -171,8 +182,7 @@ gimp_color_selector_dispose (GObject *object) /** * gimp_color_selector_new: * @selector_type: The #GType of the selector to create. - * @rgb: The initial color to be edited. - * @hsv: The same color in HSV. + * @color: The initial color to be edited. * @channel: The selector's initial channel. * * Creates a new #GimpColorSelector widget of type @selector_type. @@ -186,20 +196,17 @@ gimp_color_selector_dispose (GObject *object) **/ GtkWidget * gimp_color_selector_new (GType selector_type, - const GimpRGB *rgb, - const GimpHSV *hsv, + GeglColor *color, GimpColorSelectorChannel channel) { GimpColorSelector *selector; - g_return_val_if_fail (g_type_is_a (selector_type, GIMP_TYPE_COLOR_SELECTOR), - NULL); - g_return_val_if_fail (rgb != NULL, NULL); - g_return_val_if_fail (hsv != NULL, NULL); + g_return_val_if_fail (g_type_is_a (selector_type, GIMP_TYPE_COLOR_SELECTOR), NULL); + g_return_val_if_fail (GEGL_IS_COLOR (color), NULL); selector = g_object_new (selector_type, NULL); - gimp_color_selector_set_color (selector, rgb, hsv); + gimp_color_selector_set_color (selector, color); gimp_color_selector_set_channel (selector, channel); return GTK_WIDGET (selector); @@ -221,11 +228,11 @@ gimp_color_selector_set_toggles_visible (GimpColorSelector *selector, { g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - if (selector->toggles_visible != visible) + if (selector->priv->toggles_visible != visible) { GimpColorSelectorClass *selector_class; - selector->toggles_visible = visible ? TRUE : FALSE; + selector->priv->toggles_visible = visible ? TRUE : FALSE; selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (selector); @@ -249,7 +256,7 @@ gimp_color_selector_get_toggles_visible (GimpColorSelector *selector) { g_return_val_if_fail (GIMP_IS_COLOR_SELECTOR (selector), FALSE); - return selector->toggles_visible; + return selector->priv->toggles_visible; } /** @@ -268,11 +275,11 @@ gimp_color_selector_set_toggles_sensitive (GimpColorSelector *selector, { g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - if (selector->toggles_sensitive != sensitive) + if (selector->priv->toggles_sensitive != sensitive) { GimpColorSelectorClass *selector_class; - selector->toggles_sensitive = sensitive ? TRUE : FALSE; + selector->priv->toggles_sensitive = sensitive ? TRUE : FALSE; selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (selector); @@ -296,7 +303,7 @@ gimp_color_selector_get_toggles_sensitive (GimpColorSelector *selector) { g_return_val_if_fail (GIMP_IS_COLOR_SELECTOR (selector), FALSE); - return selector->toggles_sensitive; + return selector->priv->toggles_sensitive; } /** @@ -312,11 +319,11 @@ gimp_color_selector_set_show_alpha (GimpColorSelector *selector, { g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - if (show_alpha != selector->show_alpha) + if (show_alpha != selector->priv->show_alpha) { GimpColorSelectorClass *selector_class; - selector->show_alpha = show_alpha ? TRUE : FALSE; + selector->priv->show_alpha = show_alpha ? TRUE : FALSE; selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (selector); @@ -340,61 +347,64 @@ gimp_color_selector_get_show_alpha (GimpColorSelector *selector) { g_return_val_if_fail (GIMP_IS_COLOR_SELECTOR (selector), FALSE); - return selector->show_alpha; + return selector->priv->show_alpha; } /** * gimp_color_selector_set_color: * @selector: A #GimpColorSelector widget. - * @rgb: The new color. - * @hsv: The same color in HSV. + * @color: The new color. * * Sets the color shown in the @selector widget. **/ void gimp_color_selector_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { - GimpColorSelectorClass *selector_class; + GimpColorSelectorClass *selector_class; + GimpColorSelectorPrivate *priv; + GeglColor *old_color; g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - g_return_if_fail (rgb != NULL); - g_return_if_fail (hsv != NULL); + g_return_if_fail (GEGL_IS_COLOR (color)); - selector->rgb = *rgb; - selector->hsv = *hsv; + priv = GET_PRIVATE (selector); + + old_color = priv->color; + priv->color = gegl_color_duplicate (color); selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (selector); - if (selector_class->set_color) - selector_class->set_color (selector, rgb, hsv); + if (! gimp_color_is_perceptually_identical (priv->color, old_color)) + { + if (selector_class->set_color) + selector_class->set_color (selector, priv->color); - gimp_color_selector_emit_color_changed (selector); + gimp_color_selector_emit_color_changed (selector); + } + + g_object_unref (old_color); } /** * gimp_color_selector_get_color: * @selector: A #GimpColorSelector widget. - * @rgb: (out caller-allocates): Return location for the color. - * @hsv: (out caller-allocates): Return location for the same same - * color in HSV. * * Retrieves the color shown in the @selector widget. * + * Returns: (transfer full): a copy of the selected color. * Since: 2.10 **/ -void -gimp_color_selector_get_color (GimpColorSelector *selector, - GimpRGB *rgb, - GimpHSV *hsv) +GeglColor * +gimp_color_selector_get_color (GimpColorSelector *selector) { - g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - g_return_if_fail (rgb != NULL); - g_return_if_fail (hsv != NULL); + GimpColorSelectorPrivate *priv; - *rgb = selector->rgb; - *hsv = selector->hsv; + g_return_val_if_fail (GIMP_IS_COLOR_SELECTOR (selector), NULL); + + priv = GET_PRIVATE (selector); + + return gegl_color_duplicate (priv->color); } /** @@ -414,12 +424,12 @@ gimp_color_selector_set_channel (GimpColorSelector *selector, { g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - if (channel != selector->channel) + if (channel != selector->priv->channel) { GimpColorSelectorClass *selector_class; GimpColorSelectorModel model = -1; - selector->channel = channel; + selector->priv->channel = channel; switch (channel) { @@ -496,7 +506,7 @@ gimp_color_selector_get_channel (GimpColorSelector *selector) g_return_val_if_fail (GIMP_IS_COLOR_SELECTOR (selector), GIMP_COLOR_SELECTOR_RED); - return selector->channel; + return selector->priv->channel; } /** @@ -562,59 +572,6 @@ gimp_color_selector_get_model_visible (GimpColorSelector *selector, return priv->model_visible[model]; } -/** - * gimp_color_selector_emit_color_changed: - * @selector: A #GimpColorSelector widget. - * - * Emits the "color-changed" signal. - */ -void -gimp_color_selector_emit_color_changed (GimpColorSelector *selector) -{ - g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - - g_signal_emit (selector, selector_signals[COLOR_CHANGED], 0, - &selector->rgb, &selector->hsv); -} - -/** - * gimp_color_selector_emit_channel_changed: - * @selector: A #GimpColorSelector widget. - * - * Emits the "channel-changed" signal. - */ -void -gimp_color_selector_emit_channel_changed (GimpColorSelector *selector) -{ - g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - - g_signal_emit (selector, selector_signals[CHANNEL_CHANGED], 0, - selector->channel); -} - -/** - * gimp_color_selector_emit_model_visible_changed: - * @selector: A #GimpColorSelector widget. - * @model: The #GimpColorSelectorModel where visibility changed. - * - * Emits the "model-visible-changed" signal. - * - * Since: 2.10 - */ -void -gimp_color_selector_emit_model_visible_changed (GimpColorSelector *selector, - GimpColorSelectorModel model) -{ - GimpColorSelectorPrivate *priv; - - g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); - - priv = GET_PRIVATE (selector); - - g_signal_emit (selector, selector_signals[MODEL_VISIBLE_CHANGED], 0, - model, priv->model_visible[model]); -} - /** * gimp_color_selector_set_config: * @selector: a #GimpColorSelector widget. @@ -666,3 +623,62 @@ gimp_color_selector_set_simulation (GimpColorSelector *selector, if (selector_class->set_simulation) selector_class->set_simulation (selector, profile, intent, bpc); } + + +/* Private functions. */ + +/** + * gimp_color_selector_emit_color_changed: + * @selector: A #GimpColorSelector widget. + * + * Emits the "color-changed" signal. + */ +static void +gimp_color_selector_emit_color_changed (GimpColorSelector *selector) +{ + GimpColorSelectorPrivate *priv; + + g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); + + priv = GET_PRIVATE (selector); + + g_signal_emit (selector, selector_signals[COLOR_CHANGED], 0, priv->color); +} + +/** + * gimp_color_selector_emit_channel_changed: + * @selector: A #GimpColorSelector widget. + * + * Emits the "channel-changed" signal. + */ +static void +gimp_color_selector_emit_channel_changed (GimpColorSelector *selector) +{ + g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); + + g_signal_emit (selector, selector_signals[CHANNEL_CHANGED], 0, + selector->priv->channel); +} + +/** + * gimp_color_selector_emit_model_visible_changed: + * @selector: A #GimpColorSelector widget. + * @model: The #GimpColorSelectorModel where visibility changed. + * + * Emits the "model-visible-changed" signal. + * + * Since: 2.10 + */ +static void +gimp_color_selector_emit_model_visible_changed (GimpColorSelector *selector, + GimpColorSelectorModel model) +{ + GimpColorSelectorPrivate *priv; + + g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); + + priv = GET_PRIVATE (selector); + + g_signal_emit (selector, selector_signals[MODEL_VISIBLE_CHANGED], 0, + model, priv->model_visible[model]); +} diff --git a/libgimpwidgets/gimpcolorselector.h b/libgimpwidgets/gimpcolorselector.h index 214f364fee..aac31feebd 100644 --- a/libgimpwidgets/gimpcolorselector.h +++ b/libgimpwidgets/gimpcolorselector.h @@ -67,16 +67,6 @@ struct _GimpColorSelector GtkBox parent_instance; GimpColorSelectorPrivate *priv; - - /* FIXME MOVE TO PRIVATE */ - gboolean toggles_visible; - gboolean toggles_sensitive; - gboolean show_alpha; - - GimpRGB rgb; - GimpHSV hsv; - - GimpColorSelectorChannel channel; }; struct _GimpColorSelectorClass @@ -95,8 +85,7 @@ struct _GimpColorSelectorClass void (* set_show_alpha) (GimpColorSelector *selector, gboolean show_alpha); void (* set_color) (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); void (* set_channel) (GimpColorSelector *selector, GimpColorSelectorChannel channel); void (* set_model_visible) (GimpColorSelector *selector, @@ -112,8 +101,7 @@ struct _GimpColorSelectorClass /* signals */ void (* color_changed) (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); void (* channel_changed) (GimpColorSelector *selector, GimpColorSelectorChannel channel); void (* model_visible_changed) (GimpColorSelector *selector, @@ -132,54 +120,45 @@ struct _GimpColorSelectorClass }; -GType gimp_color_selector_get_type (void) G_GNUC_CONST; -GtkWidget * gimp_color_selector_new (GType selector_type, - const GimpRGB *rgb, - const GimpHSV *hsv, - GimpColorSelectorChannel channel); +GType gimp_color_selector_get_type (void) G_GNUC_CONST; +GtkWidget * gimp_color_selector_new (GType selector_type, + GeglColor *color, + GimpColorSelectorChannel channel); -void gimp_color_selector_set_toggles_visible (GimpColorSelector *selector, - gboolean visible); -gboolean gimp_color_selector_get_toggles_visible (GimpColorSelector *selector); +void gimp_color_selector_set_toggles_visible (GimpColorSelector *selector, + gboolean visible); +gboolean gimp_color_selector_get_toggles_visible (GimpColorSelector *selector); -void gimp_color_selector_set_toggles_sensitive (GimpColorSelector *selector, - gboolean sensitive); -gboolean gimp_color_selector_get_toggles_sensitive (GimpColorSelector *selector); +void gimp_color_selector_set_toggles_sensitive (GimpColorSelector *selector, + gboolean sensitive); +gboolean gimp_color_selector_get_toggles_sensitive (GimpColorSelector *selector); -void gimp_color_selector_set_show_alpha (GimpColorSelector *selector, - gboolean show_alpha); -gboolean gimp_color_selector_get_show_alpha (GimpColorSelector *selector); +void gimp_color_selector_set_show_alpha (GimpColorSelector *selector, + gboolean show_alpha); +gboolean gimp_color_selector_get_show_alpha (GimpColorSelector *selector); -void gimp_color_selector_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); -void gimp_color_selector_get_color (GimpColorSelector *selector, - GimpRGB *rgb, - GimpHSV *hsv); +void gimp_color_selector_set_color (GimpColorSelector *selector, + GeglColor *color); +GeglColor * gimp_color_selector_get_color (GimpColorSelector *selector); -void gimp_color_selector_set_channel (GimpColorSelector *selector, - GimpColorSelectorChannel channel); +void gimp_color_selector_set_channel (GimpColorSelector *selector, + GimpColorSelectorChannel channel); GimpColorSelectorChannel - gimp_color_selector_get_channel (GimpColorSelector *selector); + gimp_color_selector_get_channel (GimpColorSelector *selector); -void gimp_color_selector_set_model_visible (GimpColorSelector *selector, - GimpColorSelectorModel model, - gboolean visible); -gboolean gimp_color_selector_get_model_visible (GimpColorSelector *selector, - GimpColorSelectorModel model); +void gimp_color_selector_set_model_visible (GimpColorSelector *selector, + GimpColorSelectorModel model, + gboolean visible); +gboolean gimp_color_selector_get_model_visible (GimpColorSelector *selector, + GimpColorSelectorModel model); -void gimp_color_selector_emit_color_changed (GimpColorSelector *selector); -void gimp_color_selector_emit_channel_changed (GimpColorSelector *selector); -void gimp_color_selector_emit_model_visible_changed (GimpColorSelector *selector, - GimpColorSelectorModel model); +void gimp_color_selector_set_config (GimpColorSelector *selector, + GimpColorConfig *config); -void gimp_color_selector_set_config (GimpColorSelector *selector, - GimpColorConfig *config); - -void gimp_color_selector_set_simulation (GimpColorSelector *selector, - GimpColorProfile *profile, - GimpColorRenderingIntent intent, - gboolean bpc); +void gimp_color_selector_set_simulation (GimpColorSelector *selector, + GimpColorProfile *profile, + GimpColorRenderingIntent intent, + gboolean bpc); G_END_DECLS diff --git a/libgimpwidgets/gimpwidgets.def b/libgimpwidgets/gimpwidgets.def index 09609d511c..e6c143e76c 100644 --- a/libgimpwidgets/gimpwidgets.def +++ b/libgimpwidgets/gimpwidgets.def @@ -128,9 +128,6 @@ EXPORTS gimp_color_selection_set_show_alpha gimp_color_selection_set_simulation gimp_color_selector_channel_get_type - gimp_color_selector_emit_channel_changed - gimp_color_selector_emit_color_changed - gimp_color_selector_emit_model_visible_changed gimp_color_selector_get_channel gimp_color_selector_get_color gimp_color_selector_get_model_visible diff --git a/modules/color-selector-cmyk.c b/modules/color-selector-cmyk.c index df756dab92..770234a965 100644 --- a/modules/color-selector-cmyk.c +++ b/modules/color-selector-cmyk.c @@ -67,8 +67,7 @@ GType colorsel_cmyk_get_type (void); static void colorsel_cmyk_dispose (GObject *object); static void colorsel_cmyk_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void colorsel_cmyk_set_config (GimpColorSelector *selector, GimpColorConfig *config); static void colorsel_cmyk_set_simulation (GimpColorSelector *selector, @@ -209,16 +208,13 @@ colorsel_cmyk_dispose (GObject *object) static void colorsel_cmyk_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { - GimpColorProfile *cmyk_profile = NULL; - GimpColorRenderingIntent intent = GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC; - const Babl *fish = NULL; - const Babl *space = NULL; - ColorselCmyk *module = COLORSEL_CMYK (selector); - gfloat values[4]; - gint i; + GimpColorProfile *cmyk_profile = NULL; + GimpColorRenderingIntent intent = GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC; + const Babl *space = NULL; + ColorselCmyk *module = COLORSEL_CMYK (selector); + gfloat cmyk[4]; /* Try Image Soft-proofing profile first, then default CMYK profile */ if (module->simulation_profile) @@ -236,19 +232,16 @@ colorsel_cmyk_set_color (GimpColorSelector *selector, NULL); } - fish = babl_fish (babl_format ("R'G'B'A double"), - babl_format_with_space ("CMYK float", space)); + gegl_color_get_pixel (color, babl_format_with_space ("CMYK float", space), cmyk); - babl_process (fish, rgb, values, 1); - - for (i = 0; i < 4; i++) + for (gint i = 0; i < 4; i++) { g_signal_handlers_block_by_func (module->scales[i], colorsel_cmyk_scale_update, module); - values[i] *= 100.0; - gimp_label_spin_set_value (GIMP_LABEL_SPIN (module->scales[i]), values[i]); + cmyk[i] *= 100.0; + gimp_label_spin_set_value (GIMP_LABEL_SPIN (module->scales[i]), cmyk[i]); g_signal_handlers_unblock_by_func (module->scales[i], colorsel_cmyk_scale_update, @@ -320,7 +313,12 @@ colorsel_cmyk_set_simulation (GimpColorSelector *selector, module->simulation_bpc = bpc; if (! module->in_destruction) - colorsel_cmyk_set_color (selector, &selector->rgb, &selector->hsv); + { + GeglColor *color = gimp_color_selector_get_color (selector); + + colorsel_cmyk_set_color (selector, color); + g_object_unref (color); + } } static void @@ -330,13 +328,11 @@ colorsel_cmyk_scale_update (GimpLabelSpin *scale, GimpColorProfile *cmyk_profile = NULL; GimpColorSelector *selector = GIMP_COLOR_SELECTOR (module); GimpColorRenderingIntent intent = GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC; - const Babl *fish = NULL; const Babl *space = NULL; + GeglColor *color = gegl_color_new (NULL); gfloat cmyk_values[4]; - gfloat rgb_values[3]; - gint i; - for (i = 0; i < 4; i++) + for (gint i = 0; i < 4; i++) cmyk_values[i] = gimp_label_spin_get_value (GIMP_LABEL_SPIN (module->scales[i])) / 100.0; if (module->simulation_profile) @@ -349,22 +345,12 @@ colorsel_cmyk_scale_update (GimpLabelSpin *scale, { intent = module->simulation_intent; - space = gimp_color_profile_get_space (cmyk_profile, intent, - NULL); + space = gimp_color_profile_get_space (cmyk_profile, intent, NULL); } - fish = babl_fish (babl_format_with_space ("CMYK float", space), - babl_format ("R'G'B'A float")); - - babl_process (fish, cmyk_values, rgb_values, 1); - - selector->rgb.r = rgb_values[0]; - selector->rgb.g = rgb_values[1]; - selector->rgb.b = rgb_values[2]; - - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); - - gimp_color_selector_emit_color_changed (selector); + gegl_color_set_pixel (color, babl_format_with_space ("CMYK float", space), cmyk_values); + gimp_color_selector_set_color (selector, color); + g_object_unref (color); if (cmyk_profile && ! module->simulation_profile) g_object_unref (cmyk_profile); @@ -415,5 +401,10 @@ colorsel_cmyk_config_changed (ColorselCmyk *module) g_object_unref (cmyk_profile); if (! module->in_destruction) - colorsel_cmyk_set_color (selector, &selector->rgb, &selector->hsv); + { + GeglColor *color = gimp_color_selector_get_color (selector); + + colorsel_cmyk_set_color (selector, color); + g_object_unref (color); + } } diff --git a/modules/color-selector-water.c b/modules/color-selector-water.c index 0548d65048..3e90b31831 100644 --- a/modules/color-selector-water.c +++ b/modules/color-selector-water.c @@ -383,14 +383,20 @@ add_pigment (ColorselWater *water, gdouble much) { GimpColorSelector *selector = GIMP_COLOR_SELECTOR (water); + GeglColor *color = gimp_color_selector_get_color (selector); + gdouble rgb[3]; much *= (gdouble) water->pressure_adjust; + /* TODO: both render (draw() function) and selecting colors should navigate + * the target color space, not sRGB. + */ + gegl_color_get_pixel (color, babl_format ("R'G'B' double"), rgb); if (erase) { - selector->rgb.r = 1.0 - (1.0 - selector->rgb.r) * (1.0 - much); - selector->rgb.g = 1.0 - (1.0 - selector->rgb.g) * (1.0 - much); - selector->rgb.b = 1.0 - (1.0 - selector->rgb.b) * (1.0 - much); + rgb[0] = 1.0 - (1.0 - rgb[0]) * (1.0 - much); + rgb[1] = 1.0 - (1.0 - rgb[1]) * (1.0 - much); + rgb[2] = 1.0 - (1.0 - rgb[2]) * (1.0 - much); } else { @@ -398,16 +404,19 @@ add_pigment (ColorselWater *water, gdouble g = calc (x, y, 120) / 256.0; gdouble b = calc (x, y, 240) / 256.0; - selector->rgb.r *= (1.0 - (1.0 - r) * much); - selector->rgb.g *= (1.0 - (1.0 - g) * much); - selector->rgb.b *= (1.0 - (1.0 - b) * much); + rgb[0] *= (1.0 - (1.0 - r) * much); + rgb[1] *= (1.0 - (1.0 - g) * much); + rgb[2] *= (1.0 - (1.0 - b) * much); } - gimp_rgb_clamp (&selector->rgb); + rgb[0] = CLAMP (rgb[0], 0.0, 1.0); + rgb[1] = CLAMP (rgb[1], 0.0, 1.0); + rgb[2] = CLAMP (rgb[2], 0.0, 1.0); + gegl_color_set_pixel (color, babl_format ("R'G'B' double"), rgb); - gimp_rgb_to_hsv (&selector->rgb, &selector->hsv); + gimp_color_selector_set_color (selector, color); - gimp_color_selector_emit_color_changed (selector); + g_object_unref (color); } static void diff --git a/modules/color-selector-wheel.c b/modules/color-selector-wheel.c index b5f8e676b0..991a69fbbd 100644 --- a/modules/color-selector-wheel.c +++ b/modules/color-selector-wheel.c @@ -59,8 +59,7 @@ struct _ColorselWheelClass GType colorsel_wheel_get_type (void); static void colorsel_wheel_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv); + GeglColor *color); static void colorsel_wheel_set_config (GimpColorSelector *selector, GimpColorConfig *config); static void colorsel_wheel_changed (GimpColorWheel *hsv, @@ -131,13 +130,19 @@ colorsel_wheel_init (ColorselWheel *wheel) static void colorsel_wheel_set_color (GimpColorSelector *selector, - const GimpRGB *rgb, - const GimpHSV *hsv) + GeglColor *color) { ColorselWheel *wheel = COLORSEL_WHEEL (selector); + gdouble hsv[3]; - gimp_color_wheel_set_color (GIMP_COLOR_WHEEL (wheel->hsv), - hsv->h, hsv->s, hsv->v); + gegl_color_get_pixel (color, babl_format ("HSV double"), hsv); + g_signal_handlers_block_by_func (wheel->hsv, + G_CALLBACK (colorsel_wheel_changed), + wheel); + gimp_color_wheel_set_color (GIMP_COLOR_WHEEL (wheel->hsv), hsv[0], hsv[1], hsv[2]); + g_signal_handlers_unblock_by_func (wheel->hsv, + G_CALLBACK (colorsel_wheel_changed), + wheel); } static void @@ -151,14 +156,14 @@ colorsel_wheel_set_config (GimpColorSelector *selector, } static void -colorsel_wheel_changed (GimpColorWheel *hsv, +colorsel_wheel_changed (GimpColorWheel *wheel, GimpColorSelector *selector) { - gimp_color_wheel_get_color (hsv, - &selector->hsv.h, - &selector->hsv.s, - &selector->hsv.v); - gimp_hsv_to_rgb (&selector->hsv, &selector->rgb); + GeglColor *color = gegl_color_new (NULL); + gdouble hsv[3]; - gimp_color_selector_emit_color_changed (selector); + gimp_color_wheel_get_color (wheel, &hsv[0], &hsv[1], &hsv[2]); + gegl_color_set_pixel (color, babl_format ("HSV double"), hsv); + gimp_color_selector_set_color (selector, color); + g_object_unref (color); }