Bug 770054 - High bit-depth color selection widgets

This is WIP in the middle of cleaning up GimpColorSelector subclasses:

Add the possibility to switch between LCH and LSV and between 0..100
and 0..255 RGB in to GimpColorScales. Works almost fine, but needs
different UI to change the options...
This commit is contained in:
Michael Natterer 2017-12-31 17:53:13 +01:00
parent 0d27800aa7
commit 6258d525ae
2 changed files with 522 additions and 109 deletions

View File

@ -53,6 +53,22 @@
**/
enum
{
PROP_0,
PROP_SHOW_HSV,
PROP_SHOW_RGB_U8
};
enum
{
GIMP_COLOR_SELECTOR_RED_U8 = GIMP_COLOR_SELECTOR_LCH_HUE + 1,
GIMP_COLOR_SELECTOR_GREEN_U8,
GIMP_COLOR_SELECTOR_BLUE_U8,
GIMP_COLOR_SELECTOR_ALPHA_U8
};
typedef struct _GimpLCH GimpLCH;
struct _GimpLCH
@ -61,6 +77,21 @@ struct _GimpLCH
};
typedef struct _ColorScale ColorScale;
struct _ColorScale
{
GimpColorSelectorChannel channel;
gdouble default_value;
gdouble scale_min_value;
gdouble scale_max_value;
gdouble scale_inc;
gdouble spin_min_value;
gdouble spin_max_value;
};
#define GIMP_COLOR_SCALES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_COLOR_SCALES, GimpColorScalesClass))
#define GIMP_IS_COLOR_SCALES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_COLOR_SCALES))
#define GIMP_COLOR_SCALES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_COLOR_SCALES, GimpColorScalesClass))
@ -72,9 +103,20 @@ struct _GimpColorScales
{
GimpColorSelector parent_instance;
GtkWidget *toggles[10];
GtkWidget *sliders[10];
GtkAdjustment *slider_data[10];
gboolean show_hsv;
gboolean show_rgb_u8;
GtkWidget *lch_group;
GtkWidget *hsv_group;
GtkWidget *rgb_percent_group;
GtkWidget *rgb_u8_group;
GtkWidget *alpha_percent_group;
GtkWidget *alpha_u8_group;
GtkWidget *dummy_u8_toggle;
GtkWidget *toggles[14];
GtkAdjustment *adjustments[14];
GtkWidget *scales[14];
};
struct _GimpColorScalesClass
@ -83,6 +125,16 @@ struct _GimpColorScalesClass
};
static void gimp_color_scales_dispose (GObject *object);
static void gimp_color_scales_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gimp_color_scales_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_color_scales_togg_sensitive (GimpColorSelector *selector,
gboolean sensitive);
static void gimp_color_scales_togg_visible (GimpColorSelector *selector,
@ -98,6 +150,7 @@ static void gimp_color_scales_set_channel (GimpColorSelector *selector,
static void gimp_color_scales_set_config (GimpColorSelector *selector,
GimpColorConfig *config);
static void gimp_color_scales_update_visible (GimpColorScales *scales);
static void gimp_color_scales_update_scales (GimpColorScales *scales,
gint skip);
static void gimp_color_scales_toggle_changed (GtkWidget *widget,
@ -113,12 +166,38 @@ G_DEFINE_TYPE (GimpColorScales, gimp_color_scales, GIMP_TYPE_COLOR_SELECTOR)
static const Babl *fish_rgb_to_lch = NULL;
static const Babl *fish_lch_to_rgb = NULL;
static const ColorScale scale_defs[] =
{
{ GIMP_COLOR_SELECTOR_HUE, 0, 0, 360, 30, 0, 360 },
{ GIMP_COLOR_SELECTOR_SATURATION, 0, 0, 100, 10, 0, 500 },
{ GIMP_COLOR_SELECTOR_VALUE, 0, 0, 100, 10, 0, 500 },
{ GIMP_COLOR_SELECTOR_RED, 0, 0, 100, 10, -500, 500 },
{ GIMP_COLOR_SELECTOR_GREEN, 0, 0, 100, 10, -500, 500 },
{ GIMP_COLOR_SELECTOR_BLUE, 0, 0, 100, 10, -500, 500 },
{ GIMP_COLOR_SELECTOR_ALPHA, 0, 0, 100, 10, 0, 100 },
{ GIMP_COLOR_SELECTOR_LCH_LIGHTNESS, 0, 0, 100, 10, 0, 300 },
{ GIMP_COLOR_SELECTOR_LCH_CHROMA, 0, 0, 200, 10, 0, 300 },
{ GIMP_COLOR_SELECTOR_LCH_HUE, 0, 0, 360, 30, 0, 360 },
{ GIMP_COLOR_SELECTOR_RED_U8, 0, 0, 255, 16, -1275, 1275 },
{ GIMP_COLOR_SELECTOR_GREEN_U8, 0, 0, 255, 16, -1275, 1275 },
{ GIMP_COLOR_SELECTOR_BLUE_U8, 0, 0, 255, 16, -1275, 1275 },
{ GIMP_COLOR_SELECTOR_ALPHA_U8, 0, 0, 255, 16, 0, 255 }
};
static void
gimp_color_scales_class_init (GimpColorScalesClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpColorSelectorClass *selector_class = GIMP_COLOR_SELECTOR_CLASS (klass);
object_class->dispose = gimp_color_scales_dispose;
object_class->get_property = gimp_color_scales_get_property;
object_class->set_property = gimp_color_scales_set_property;
selector_class->name = _("Scales");
selector_class->help_id = "gimp-colorselector-scales";
selector_class->icon_name = GIMP_ICON_DIALOG_TOOL_OPTIONS;
@ -129,113 +208,329 @@ gimp_color_scales_class_init (GimpColorScalesClass *klass)
selector_class->set_channel = gimp_color_scales_set_channel;
selector_class->set_config = gimp_color_scales_set_config;
g_object_class_install_property (object_class, PROP_SHOW_HSV,
g_param_spec_boolean ("show-hsv",
"Show HSV",
"Show HSV scales",
FALSE,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_SHOW_RGB_U8,
g_param_spec_boolean ("show-rgb-u8",
"Show RGB 0..255",
"Show RGB 0..255 scales",
FALSE,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
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"));
}
static void
gimp_color_scales_init (GimpColorScales *scales)
static GtkWidget *
create_group (GimpColorScales *scales,
GSList **radio_group,
GtkSizeGroup *size_group0,
GtkSizeGroup *size_group1,
GtkSizeGroup *size_group2,
GimpColorSelectorChannel first_channel,
GimpColorSelectorChannel last_channel)
{
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
GtkWidget *table;
GEnumClass *enum_class;
GSList *group;
gint row;
gint i;
/*{ H, S, V, R, G, B, A, L, C, H }*/
static const gdouble slider_initial_vals[] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static const gdouble slider_min_vals[] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static const gdouble slider_max_vals[] =
{ 360, 100, 100, 100, 100, 100, 100, 100, 200, 360 };
static const gdouble slider_incs[] =
{ 30, 10, 10, 16, 16, 16, 10, 10, 10, 30 };
static const gdouble spin_min_vals[] =
{ 0, 0, 0, -500, -500, -500, 0, 0, 0, 0 };
static const gdouble spin_max_vals[] =
{ 360, 500, 500, 500, 500, 500, 100, 300, 300, 360 };
/* don't needs the toggles for our own operation */
selector->toggles_visible = FALSE;
table = gtk_table_new (11, 4, FALSE);
table = gtk_table_new (last_channel - first_channel + 1, 4, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 1);
gtk_table_set_row_spacing (GTK_TABLE (table), 2, 5); /* hsv <-> rgb */
gtk_table_set_row_spacing (GTK_TABLE (table), 5, 5); /* rgb <-> alpha */
gtk_table_set_row_spacing (GTK_TABLE (table), 6, 5); /* alpha <-> lch */
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 0);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
gtk_widget_show (table);
enum_class = g_type_class_ref (GIMP_TYPE_COLOR_SELECTOR_CHANNEL);
group = NULL;
for (i = 0; i < 10; i++)
for (i = first_channel, row = 0; i <= last_channel; i++, row++)
{
GimpEnumDesc *enum_desc = gimp_enum_get_desc (enum_class, i);
GimpEnumDesc *enum_desc;
gint enum_value = i;
gboolean is_u8 = FALSE;
if (i == GIMP_COLOR_SELECTOR_ALPHA)
if (enum_value >= GIMP_COLOR_SELECTOR_RED_U8 &&
enum_value <= GIMP_COLOR_SELECTOR_ALPHA_U8)
{
scales->toggles[i] = NULL;
enum_value -= 7;
is_u8 = TRUE;
}
enum_desc = gimp_enum_get_desc (enum_class, enum_value);
if (i == GIMP_COLOR_SELECTOR_ALPHA ||
i == GIMP_COLOR_SELECTOR_ALPHA_U8)
{
/* just to allocate the space via the size group */
scales->toggles[i] = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
}
else
{
scales->toggles[i] = gtk_radio_button_new (group);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (scales->toggles[i]));
gtk_table_attach (GTK_TABLE (table), scales->toggles[i],
0, 1, i, i + 1,
GTK_SHRINK, GTK_EXPAND, 0, 0);
scales->toggles[i] = gtk_radio_button_new (*radio_group);
*radio_group =
gtk_radio_button_get_group (GTK_RADIO_BUTTON (scales->toggles[i]));
if (selector->toggles_visible)
gtk_widget_show (scales->toggles[i]);
gimp_help_set_help_data (scales->toggles[i],
gettext (enum_desc->value_help), NULL);
g_signal_connect (scales->toggles[i], "toggled",
G_CALLBACK (gimp_color_scales_toggle_changed),
scales);
if (is_u8)
{
/* bind the RGB U8 toggles to the RGB percent toggles */
g_object_bind_property (scales->toggles[i - 7], "active",
scales->toggles[i], "active",
G_BINDING_SYNC_CREATE |
G_BINDING_BIDIRECTIONAL);
}
else
{
g_signal_connect (scales->toggles[i], "toggled",
G_CALLBACK (gimp_color_scales_toggle_changed),
scales);
}
}
scales->slider_data[i] = (GtkAdjustment *)
gimp_color_scale_entry_new (GTK_TABLE (table), 1, i,
gtk_table_attach (GTK_TABLE (table), scales->toggles[i],
0, 1, row, row + 1,
GTK_SHRINK, GTK_EXPAND, 0, 0);
if (selector->toggles_visible)
gtk_widget_show (scales->toggles[i]);
gimp_help_set_help_data (scales->toggles[i],
gettext (enum_desc->value_help), NULL);
gtk_size_group_add_widget (size_group0, scales->toggles[i]);
scales->adjustments[i] = (GtkAdjustment *)
gimp_color_scale_entry_new (GTK_TABLE (table), 1, row,
gettext (enum_desc->value_desc),
-1, -1,
slider_initial_vals[i],
slider_min_vals[i],
slider_max_vals[i],
1.0, slider_incs[i],
scale_defs[i].default_value,
scale_defs[i].scale_min_value,
scale_defs[i].scale_max_value,
1.0,
scale_defs[i].scale_inc,
1,
gettext (enum_desc->value_help),
NULL);
gtk_adjustment_configure (scales->slider_data[i],
slider_initial_vals[i],
spin_min_vals[i],
spin_max_vals[i],
gtk_adjustment_configure (scales->adjustments[i],
scale_defs[i].default_value,
scale_defs[i].spin_min_value,
scale_defs[i].spin_max_value,
1.0,
slider_incs[i],
scale_defs[i].scale_inc,
0);
scales->sliders[i] = GIMP_SCALE_ENTRY_SCALE (scales->slider_data[i]);
g_object_add_weak_pointer (G_OBJECT (scales->sliders[i]),
(gpointer) &scales->sliders[i]);
scales->scales[i] = GIMP_SCALE_ENTRY_SCALE (scales->adjustments[i]);
g_object_add_weak_pointer (G_OBJECT (scales->scales[i]),
(gpointer) &scales->scales[i]);
gimp_color_scale_set_channel (GIMP_COLOR_SCALE (scales->sliders[i]), i);
gimp_color_scale_set_channel (GIMP_COLOR_SCALE (scales->scales[i]),
enum_value);
gtk_size_group_add_widget (size_group1, scales->scales[i]);
g_signal_connect (scales->slider_data[i], "value-changed",
gtk_size_group_add_widget (size_group2,
GIMP_SCALE_ENTRY_SPINBUTTON (scales->adjustments[i]));
g_signal_connect (scales->adjustments[i], "value-changed",
G_CALLBACK (gimp_color_scales_scale_changed),
scales);
}
g_type_class_unref (enum_class);
return table;
}
static void
gimp_color_scales_init (GimpColorScales *scales)
{
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
GtkSizeGroup *size_group0;
GtkSizeGroup *size_group1;
GtkSizeGroup *size_group2;
GtkWidget *hbox;
GtkWidget *radio1;
GtkWidget *radio2;
GtkWidget *table;
GSList *group;
GSList *u8_group;
gtk_box_set_spacing (GTK_BOX (scales), 5);
/* don't needs the toggles for our own operation */
selector->toggles_visible = FALSE;
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_pack_start (GTK_BOX (scales), hbox, 0, 0, FALSE);
gtk_widget_show (hbox);
group = NULL;
u8_group = NULL;
scales->dummy_u8_toggle = gtk_radio_button_new (NULL);
g_object_ref_sink (scales->dummy_u8_toggle);
u8_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (scales->dummy_u8_toggle));
size_group0 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
size_group1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
size_group2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
scales->lch_group =
table = create_group (scales, &group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_LCH_LIGHTNESS,
GIMP_COLOR_SELECTOR_LCH_HUE);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
scales->hsv_group =
table = create_group (scales, &group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_HUE,
GIMP_COLOR_SELECTOR_VALUE);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
scales->rgb_percent_group =
table = create_group (scales, &group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_RED,
GIMP_COLOR_SELECTOR_BLUE);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
scales->rgb_u8_group =
table = create_group (scales, &u8_group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_RED_U8,
GIMP_COLOR_SELECTOR_BLUE_U8);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
scales->alpha_percent_group =
table = create_group (scales, &group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_ALPHA,
GIMP_COLOR_SELECTOR_ALPHA);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
scales->alpha_u8_group =
table = create_group (scales, &u8_group,
size_group0, size_group1, size_group2,
GIMP_COLOR_SELECTOR_ALPHA_U8,
GIMP_COLOR_SELECTOR_ALPHA_U8);
gtk_box_pack_start (GTK_BOX (scales), table, FALSE, FALSE, 0);
g_object_unref (size_group0);
g_object_unref (size_group1);
g_object_unref (size_group2);
gimp_color_scales_update_visible (scales);
group = NULL;
radio1 = gtk_radio_button_new_with_label (NULL, _("LCH"));
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1));
radio2 = gtk_radio_button_new_with_label (group, _("HSV"));
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (radio1), FALSE);
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (radio2), FALSE);
gtk_box_pack_start (GTK_BOX (hbox), radio1, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), radio2, FALSE, FALSE, 0);
gtk_widget_show (radio1);
gtk_widget_show (radio2);
if (scales->show_hsv)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio2), TRUE);
g_object_bind_property (G_OBJECT (radio2), "active",
G_OBJECT (scales), "show-hsv",
G_BINDING_SYNC_CREATE |
G_BINDING_BIDIRECTIONAL);
group = NULL;
radio1 = gtk_radio_button_new_with_label (NULL, _("0..100"));
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1));
radio2 = gtk_radio_button_new_with_label (group, _("0..255"));
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (radio1), FALSE);
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (radio2), FALSE);
gtk_box_pack_end (GTK_BOX (hbox), radio2, FALSE, FALSE, 0);
gtk_box_pack_end (GTK_BOX (hbox), radio1, FALSE, FALSE, 0);
gtk_widget_show (radio1);
gtk_widget_show (radio2);
if (scales->show_rgb_u8)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio2), TRUE);
g_object_bind_property (G_OBJECT (radio2), "active",
G_OBJECT (scales), "show-rgb-u8",
G_BINDING_SYNC_CREATE |
G_BINDING_BIDIRECTIONAL);
}
static void
gimp_color_scales_dispose (GObject *object)
{
GimpColorScales *scales = GIMP_COLOR_SCALES (object);
g_clear_object (&scales->dummy_u8_toggle);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gimp_color_scales_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GimpColorScales *scales = GIMP_COLOR_SCALES (object);
switch (property_id)
{
case PROP_SHOW_HSV:
g_value_set_boolean (value, scales->show_hsv);
break;
case PROP_SHOW_RGB_U8:
g_value_set_boolean (value, scales->show_rgb_u8);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_color_scales_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpColorScales *scales = GIMP_COLOR_SCALES (object);
switch (property_id)
{
case PROP_SHOW_HSV:
gimp_color_scales_set_show_hsv (scales, g_value_get_boolean (value));
break;
case PROP_SHOW_RGB_U8:
gimp_color_scales_set_show_rgb_u8 (scales, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
@ -245,7 +540,7 @@ gimp_color_scales_togg_sensitive (GimpColorSelector *selector,
GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
gint i;
for (i = 0; i < 10; i++)
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
if (scales->toggles[i])
gtk_widget_set_sensitive (scales->toggles[i], sensitive);
}
@ -257,7 +552,7 @@ gimp_color_scales_togg_visible (GimpColorSelector *selector,
GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
gint i;
for (i = 0; i < 10; i++)
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
if (scales->toggles[i])
gtk_widget_set_visible (scales->toggles[i], visible);
}
@ -266,26 +561,7 @@ static void
gimp_color_scales_set_show_alpha (GimpColorSelector *selector,
gboolean show_alpha)
{
GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
GtkWidget *label;
GtkWidget *scale;
GtkWidget *spin;
GtkWidget *table;
label = GIMP_SCALE_ENTRY_LABEL (scales->slider_data[6]);
scale = GIMP_SCALE_ENTRY_SCALE (scales->slider_data[6]);
spin = GIMP_SCALE_ENTRY_SPINBUTTON (scales->slider_data[6]);
table = gtk_widget_get_parent (scale);
if (GTK_IS_TABLE (table))
{
gtk_table_set_row_spacing (GTK_TABLE (table), 5, /* rgb <-> alpha */
show_alpha ? 3 : 0);
}
gtk_widget_set_visible (label, show_alpha);
gtk_widget_set_visible (scale, show_alpha);
gtk_widget_set_visible (spin, show_alpha);
gimp_color_scales_update_visible (GIMP_COLOR_SCALES (selector));
}
static void
@ -304,7 +580,7 @@ gimp_color_scales_set_channel (GimpColorSelector *selector,
{
GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
if (scales->toggles[channel])
if (GTK_IS_RADIO_BUTTON (scales->toggles[channel]))
{
g_signal_handlers_block_by_func (scales->toggles[channel],
gimp_color_scales_toggle_changed,
@ -326,21 +602,114 @@ gimp_color_scales_set_config (GimpColorSelector *selector,
GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
gint i;
for (i = 0; i < 10; i++)
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
{
if (scales->sliders[i])
gimp_color_scale_set_color_config (GIMP_COLOR_SCALE (scales->sliders[i]),
if (scales->scales[i])
gimp_color_scale_set_color_config (GIMP_COLOR_SCALE (scales->scales[i]),
config);
}
}
/* public functions */
void
gimp_color_scales_set_show_hsv (GimpColorScales *scales,
gboolean show_hsv)
{
g_return_if_fail (GIMP_IS_COLOR_SCALES (scales));
show_hsv = show_hsv ? TRUE : FALSE;
if (show_hsv != scales->show_hsv)
{
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
GimpColorSelectorChannel channel;
channel = gimp_color_selector_get_channel (selector);
if (show_hsv &&
channel >= GIMP_COLOR_SELECTOR_LCH_LIGHTNESS &&
channel <= GIMP_COLOR_SELECTOR_LCH_HUE)
{
gimp_color_selector_set_channel (selector, channel - 7);
}
else if (! show_hsv &&
channel >= GIMP_COLOR_SELECTOR_HUE &&
channel <= GIMP_COLOR_SELECTOR_VALUE)
{
gimp_color_selector_set_channel (selector, channel + 7);
}
scales->show_hsv = show_hsv;
g_object_notify (G_OBJECT (scales), "show-hsv");
gimp_color_scales_update_visible (scales);
}
}
gboolean
gimp_color_scales_get_show_hsv (GimpColorScales *scales)
{
g_return_val_if_fail (GIMP_IS_COLOR_SCALES (scales), FALSE);
return scales->show_hsv;
}
void
gimp_color_scales_set_show_rgb_u8 (GimpColorScales *scales,
gboolean show_rgb_u8)
{
g_return_if_fail (GIMP_IS_COLOR_SCALES (scales));
show_rgb_u8 = show_rgb_u8 ? TRUE : FALSE;
if (show_rgb_u8 != scales->show_rgb_u8)
{
scales->show_rgb_u8 = show_rgb_u8;
g_object_notify (G_OBJECT (scales), "show-rgb-u8");
gimp_color_scales_update_visible (scales);
}
}
gboolean
gimp_color_scales_get_show_rgb_u8 (GimpColorScales *scales)
{
g_return_val_if_fail (GIMP_IS_COLOR_SCALES (scales), FALSE);
return scales->show_rgb_u8;
}
/* private functions */
static void
gimp_color_scales_update_visible (GimpColorScales *scales)
{
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
gtk_widget_set_visible (scales->lch_group, ! scales->show_hsv);
gtk_widget_set_visible (scales->hsv_group, scales->show_hsv);
gtk_widget_set_visible (scales->rgb_percent_group, ! scales->show_rgb_u8);
gtk_widget_set_visible (scales->rgb_u8_group, scales->show_rgb_u8);
gtk_widget_set_visible (scales->alpha_percent_group,
selector->show_alpha && ! scales->show_rgb_u8);
gtk_widget_set_visible (scales->alpha_u8_group,
selector->show_alpha && scales->show_rgb_u8);
}
static void
gimp_color_scales_update_scales (GimpColorScales *scales,
gint skip)
{
GimpColorSelector *selector = GIMP_COLOR_SELECTOR (scales);
GimpLCH lch;
gdouble values[10];
gdouble values[G_N_ELEMENTS (scale_defs)];
gint i;
babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1);
@ -358,22 +727,27 @@ gimp_color_scales_update_scales (GimpColorScales *scales,
values[GIMP_COLOR_SELECTOR_LCH_CHROMA] = lch.c;
values[GIMP_COLOR_SELECTOR_LCH_HUE] = lch.h;
for (i = 0; i < 10; i++)
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;
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
{
if (i != skip)
{
g_signal_handlers_block_by_func (scales->slider_data[i],
g_signal_handlers_block_by_func (scales->adjustments[i],
gimp_color_scales_scale_changed,
scales);
gtk_adjustment_set_value (scales->slider_data[i], values[i]);
gtk_adjustment_set_value (scales->adjustments[i], values[i]);
g_signal_handlers_unblock_by_func (scales->slider_data[i],
g_signal_handlers_unblock_by_func (scales->adjustments[i],
gimp_color_scales_scale_changed,
scales);
}
gimp_color_scale_set_color (GIMP_COLOR_SCALE (scales->sliders[i]),
gimp_color_scale_set_color (GIMP_COLOR_SCALE (scales->scales[i]),
&selector->rgb, &selector->hsv);
}
}
@ -388,12 +762,22 @@ gimp_color_scales_toggle_changed (GtkWidget *widget,
{
gint i;
for (i = 0; i < 10; i++)
if (widget == scales->toggles[i])
{
selector->channel = (GimpColorSelectorChannel) i;
break;
}
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
{
if (widget == scales->toggles[i])
{
selector->channel = (GimpColorSelectorChannel) i;
if (i < GIMP_COLOR_SELECTOR_RED ||
i > GIMP_COLOR_SELECTOR_BLUE)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scales->dummy_u8_toggle),
TRUE);
}
break;
}
}
gimp_color_selector_channel_changed (selector);
}
@ -408,8 +792,8 @@ gimp_color_scales_scale_changed (GtkAdjustment *adjustment,
GimpLCH lch;
gint i;
for (i = 0; i < 10; i++)
if (scales->slider_data[i] == adjustment)
for (i = 0; i < G_N_ELEMENTS (scale_defs); i++)
if (scales->adjustments[i] == adjustment)
break;
switch (i)
@ -456,6 +840,22 @@ gimp_color_scales_scale_changed (GtkAdjustment *adjustment,
babl_process (fish_rgb_to_lch, &selector->rgb, &lch, 1);
lch.h = value;
break;
case GIMP_COLOR_SELECTOR_RED_U8:
selector->rgb.r = value / 255.0;
break;
case GIMP_COLOR_SELECTOR_GREEN_U8:
selector->rgb.g = value / 255.0;
break;
case GIMP_COLOR_SELECTOR_BLUE_U8:
selector->rgb.b = value / 255.0;
break;
case GIMP_COLOR_SELECTOR_ALPHA_U8:
selector->hsv.a = selector->rgb.a = value / 255.0;
break;
}
if ((i >= GIMP_COLOR_SELECTOR_HUE) &&
@ -474,6 +874,11 @@ gimp_color_scales_scale_changed (GtkAdjustment *adjustment,
{
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);
}
gimp_color_scales_update_scales (scales, i);

View File

@ -37,7 +37,15 @@ G_BEGIN_DECLS
#define GIMP_IS_COLOR_SCALES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_COLOR_SCALES))
GType gimp_color_scales_get_type (void) G_GNUC_CONST;
GType gimp_color_scales_get_type (void) G_GNUC_CONST;
void gimp_color_scales_set_show_hsv (GimpColorScales *scales,
gboolean show_hsv);
gboolean gimp_color_scales_get_show_hsv (GimpColorScales *scales);
void gimp_color_scales_set_show_rgb_u8 (GimpColorScales *scales,
gboolean show_rgb_u8);
gboolean gimp_color_scales_get_show_rgb_u8 (GimpColorScales *scales);
G_END_DECLS