app, libgimpwidgets, modules: color selectors are now partly space-invaded.

What this commit does is keep the same code logic while moving to
GeglColor. Yet it's not **really** space-invaded yet. What we need to do
now:

1. Take into account the image space, and this is what we must navigate
   through, in particular for various representations of RGB or HSV.
   I.e. that if the active image is in anyRGB, the RGB values shown must
   be within anyRGB. Right now, everything is still shown/used as sRGB
   (even though it's properly retrieved and transformed to the target
   space thanks to GeglColor).
2. Show space info to make things clear and explicit, by adding some
   label somewhere.
3. Allow to switch between image and softproof spaces, regarding
   out-of-gamut display. I.e. that while RGB/HSV must be shown within
   the image space (assuming it's anyRGB), we may want to show
   out-of-gamut area (pink areas) within the softproof space. This may
   mean adding a checkbox. Or maybe simply taking into account whether
   we are in softproof mode or not?
4. We can likely move off gimp_widget_get_color_transform() into using
   gimp_widget_get_render_space() for display drawing. We don't need any
   soft-proofing or black point compensation for any of these widgets so
   pure babl is fine. Indeed we want to show any in-gamut color
   correctly (and not transformed according to specific intents or
   through soft-proofing). We will take care of the proofing case with
   out-of-gamut area showing only.
5. In the various drawing functions, we should move to
   CAIRO_FORMAT_RGBA128F. The color selection area might be wide enough
   that it makes sense to be more accurate, especially as we are
   essentially showing color gradients in 1 or 2 directions in these
   various widgets.
This commit is contained in:
Jehan 2023-12-12 17:01:17 +09:00
parent 4d798ecfed
commit 9833ebd0ee
14 changed files with 571 additions and 602 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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)
{

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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]);
}

View File

@ -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

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);
}