1 /*
2 * bulia byak <buliabyak@users.sf.net>
3 */
5 #ifdef HAVE_CONFIG_H
6 # include "config.h"
7 #endif
8 #include <math.h>
9 #include <gtk/gtk.h>
10 #include <glibmm/i18n.h>
11 #include "../dialogs/dialog-events.h"
12 #include "sp-color-scales.h"
14 #define CSC_CHANNEL_R (1 << 0)
15 #define CSC_CHANNEL_G (1 << 1)
16 #define CSC_CHANNEL_B (1 << 2)
17 #define CSC_CHANNEL_A (1 << 3)
18 #define CSC_CHANNEL_H (1 << 0)
19 #define CSC_CHANNEL_S (1 << 1)
20 #define CSC_CHANNEL_V (1 << 2)
21 #define CSC_CHANNEL_C (1 << 0)
22 #define CSC_CHANNEL_M (1 << 1)
23 #define CSC_CHANNEL_Y (1 << 2)
24 #define CSC_CHANNEL_K (1 << 3)
25 #define CSC_CHANNEL_CMYKA (1 << 4)
27 #define CSC_CHANNELS_ALL 0
30 G_BEGIN_DECLS
32 static void sp_color_scales_class_init (SPColorScalesClass *klass);
33 static void sp_color_scales_init (SPColorScales *cs);
34 static void sp_color_scales_destroy (GtkObject *object);
36 static void sp_color_scales_show_all (GtkWidget *widget);
37 static void sp_color_scales_hide_all (GtkWidget *widget);
39 static const gchar *sp_color_scales_hue_map (void);
41 G_END_DECLS
43 static SPColorSelectorClass *parent_class;
45 #define XPAD 4
46 #define YPAD 1
48 #define noDUMP_CHANGE_INFO 1
50 GType
51 sp_color_scales_get_type (void)
52 {
53 static GType type = 0;
54 if (!type) {
55 static const GTypeInfo info = {
56 sizeof (SPColorScalesClass),
57 NULL, /* base_init */
58 NULL, /* base_finalize */
59 (GClassInitFunc) sp_color_scales_class_init,
60 NULL, /* class_finalize */
61 NULL, /* class_data */
62 sizeof (SPColorScales),
63 0, /* n_preallocs */
64 (GInstanceInitFunc) sp_color_scales_init,
65 NULL
66 };
68 type = g_type_register_static (SP_TYPE_COLOR_SELECTOR,
69 "SPColorScales",
70 &info,
71 static_cast< GTypeFlags > (0) );
72 }
73 return type;
74 }
76 static void
77 sp_color_scales_class_init (SPColorScalesClass *klass)
78 {
79 static const gchar* nameset[] = {N_("RGB"), N_("HSL"), N_("CMYK"), 0};
80 GtkObjectClass *object_class;
81 GtkWidgetClass *widget_class;
82 SPColorSelectorClass *selector_class;
84 object_class = (GtkObjectClass *) klass;
85 widget_class = (GtkWidgetClass *) klass;
86 selector_class = SP_COLOR_SELECTOR_CLASS (klass);
88 parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass));
90 selector_class->name = nameset;
91 selector_class->submode_count = 3;
93 object_class->destroy = sp_color_scales_destroy;
95 widget_class->show_all = sp_color_scales_show_all;
96 widget_class->hide_all = sp_color_scales_hide_all;
97 }
99 ColorScales::ColorScales( SPColorSelector* csel )
100 : ColorSelector( csel ),
101 _mode( SP_COLOR_SCALES_MODE_NONE ),
102 _rangeLimit( 255.0 ),
103 _updating( FALSE ),
104 _dragging( FALSE )
105 {
106 for (gint i = 0; i < 5; i++) {
107 _l[i] = 0;
108 _a[i] = 0;
109 _s[i] = 0;
110 _b[i] = 0;
111 }
112 }
114 ColorScales::~ColorScales()
115 {
116 for (gint i = 0; i < 5; i++) {
117 _l[i] = 0;
118 _a[i] = 0;
119 _s[i] = 0;
120 _b[i] = 0;
121 }
122 }
124 void sp_color_scales_init (SPColorScales *cs)
125 {
126 SP_COLOR_SELECTOR(cs)->base = new ColorScales( SP_COLOR_SELECTOR(cs) );
128 if ( SP_COLOR_SELECTOR(cs)->base )
129 {
130 SP_COLOR_SELECTOR(cs)->base->init();
131 }
132 }
134 void ColorScales::init()
135 {
136 GtkWidget *t;
137 gint i;
139 _updating = FALSE;
140 _dragging = FALSE;
142 _tt = gtk_tooltips_new();
144 t = gtk_table_new (5, 3, FALSE);
145 gtk_widget_show (t);
146 gtk_box_pack_start (GTK_BOX (_csel), t, TRUE, TRUE, 0);
148 /* Create components */
149 for (i = 0; i < static_cast< gint > (G_N_ELEMENTS(_a)) ; i++) {
150 /* Label */
151 _l[i] = gtk_label_new("");
152 gtk_misc_set_alignment (GTK_MISC (_l[i]), 1.0, 0.5);
153 gtk_widget_show (_l[i]);
154 gtk_table_attach (GTK_TABLE (t), _l[i], 0, 1, i, i + 1, GTK_FILL, GTK_FILL, XPAD, YPAD);
155 /* Adjustment */
156 _a[i] = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, _rangeLimit, 1.0, 10.0, 10.0);
157 /* Slider */
158 _s[i] = sp_color_slider_new (_a[i]);
159 gtk_widget_show (_s[i]);
160 gtk_table_attach (GTK_TABLE (t), _s[i], 1, 2, i, i + 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)GTK_FILL, XPAD, YPAD);
162 /* Spinbutton */
163 _b[i] = gtk_spin_button_new (GTK_ADJUSTMENT (_a[i]), 1.0, 0);
164 sp_dialog_defocus_on_enter (_b[i]);
165 gtk_label_set_mnemonic_widget (GTK_LABEL(_l[i]), _b[i]);
166 gtk_widget_show (_b[i]);
167 gtk_table_attach (GTK_TABLE (t), _b[i], 2, 3, i, i + 1, (GtkAttachOptions)0, (GtkAttachOptions)0, XPAD, YPAD);
169 /* Attach channel value to adjustment */
170 gtk_object_set_data (GTK_OBJECT (_a[i]), "channel", GINT_TO_POINTER (i));
171 /* Signals */
172 gtk_signal_connect (GTK_OBJECT (_a[i]), "value_changed",
173 GTK_SIGNAL_FUNC (_adjustmentAnyChanged), _csel);
174 gtk_signal_connect (GTK_OBJECT (_s[i]), "grabbed",
175 GTK_SIGNAL_FUNC (_sliderAnyGrabbed), _csel);
176 gtk_signal_connect (GTK_OBJECT (_s[i]), "released",
177 GTK_SIGNAL_FUNC (_sliderAnyReleased), _csel);
178 gtk_signal_connect (GTK_OBJECT (_s[i]), "changed",
179 GTK_SIGNAL_FUNC (_sliderAnyChanged), _csel);
180 }
182 /* Initial mode is none, so it works */
183 setMode(SP_COLOR_SCALES_MODE_RGB);
184 }
186 static void
187 sp_color_scales_destroy (GtkObject *object)
188 {
189 if (((GtkObjectClass *) (parent_class))->destroy)
190 (* ((GtkObjectClass *) (parent_class))->destroy) (object);
191 }
193 static void
194 sp_color_scales_show_all (GtkWidget *widget)
195 {
196 gtk_widget_show (widget);
197 }
199 static void
200 sp_color_scales_hide_all (GtkWidget *widget)
201 {
202 gtk_widget_hide (widget);
203 }
205 GtkWidget *
206 sp_color_scales_new (void)
207 {
208 SPColorScales *csel;
210 csel = (SPColorScales*)gtk_type_new (SP_TYPE_COLOR_SCALES);
212 return GTK_WIDGET (csel);
213 }
215 void ColorScales::_recalcColor( gboolean changing )
216 {
217 if ( changing )
218 {
219 SPColor color;
220 gfloat alpha = 1.0;
221 gfloat c[5];
223 switch (_mode) {
224 case SP_COLOR_SCALES_MODE_RGB:
225 case SP_COLOR_SCALES_MODE_HSV:
226 _getRgbaFloatv(c);
227 color.set( c[0], c[1], c[2] );
228 alpha = c[3];
229 break;
230 case SP_COLOR_SCALES_MODE_CMYK:
231 {
232 _getCmykaFloatv( c );
234 float rgb[3];
235 sp_color_cmyk_to_rgb_floatv( rgb, c[0], c[1], c[2], c[3] );
236 color.set( rgb[0], rgb[1], rgb[2] );
237 alpha = c[4];
238 break;
239 }
240 default:
241 g_warning ("file %s: line %d: Illegal color selector mode %d", __FILE__, __LINE__, _mode);
242 break;
243 }
244 _updateInternals( color, alpha, _dragging );
245 }
246 else
247 {
248 _updateInternals( _color, _alpha, _dragging );
249 }
250 }
252 /* Helpers for setting color value */
253 gfloat ColorScales::getScaled( const GtkAdjustment *a )
254 {
255 gfloat val = a->value / a->upper;
256 return val;
257 }
259 void ColorScales::setScaled( GtkAdjustment *a, gfloat v )
260 {
261 gfloat val = v * a->upper;
262 gtk_adjustment_set_value( a, val );
263 }
265 void ColorScales::_setRangeLimit( gdouble upper )
266 {
267 _rangeLimit = upper;
268 for ( gint i = 0; i < static_cast<gint>(G_N_ELEMENTS(_a)); i++ ) {
269 _a[i]->upper = upper;
270 gtk_adjustment_changed( _a[i] );
271 }
272 }
274 void ColorScales::_colorChanged()
275 {
276 #ifdef DUMP_CHANGE_INFO
277 g_message("ColorScales::_colorChanged( this=%p, %f, %f, %f, %f)", this, _color.v.c[0], _color.v.c[1], _color.v.c[2], _alpha );
278 #endif
279 gfloat tmp[3];
280 gfloat c[5] = {0.0, 0.0, 0.0, 0.0};
282 switch (_mode) {
283 case SP_COLOR_SCALES_MODE_RGB:
284 sp_color_get_rgb_floatv( &_color, c );
285 c[3] = _alpha;
286 c[4] = 0.0;
287 break;
288 case SP_COLOR_SCALES_MODE_HSV:
289 sp_color_get_rgb_floatv( &_color, tmp );
290 sp_color_rgb_to_hsl_floatv (c, tmp[0], tmp[1], tmp[2]);
291 c[3] = _alpha;
292 c[4] = 0.0;
293 break;
294 case SP_COLOR_SCALES_MODE_CMYK:
295 sp_color_get_cmyk_floatv( &_color, c );
296 c[4] = _alpha;
297 break;
298 default:
299 g_warning ("file %s: line %d: Illegal color selector mode %d", __FILE__, __LINE__, _mode);
300 break;
301 }
303 _updating = TRUE;
304 setScaled( _a[0], c[0] );
305 setScaled( _a[1], c[1] );
306 setScaled( _a[2], c[2] );
307 setScaled( _a[3], c[3] );
308 setScaled( _a[4], c[4] );
309 _updateSliders( CSC_CHANNELS_ALL );
310 _updating = FALSE;
311 }
313 void ColorScales::_getRgbaFloatv( gfloat *rgba )
314 {
315 g_return_if_fail (rgba != NULL);
317 switch (_mode) {
318 case SP_COLOR_SCALES_MODE_RGB:
319 rgba[0] = getScaled(_a[0]);
320 rgba[1] = getScaled(_a[1]);
321 rgba[2] = getScaled(_a[2]);
322 rgba[3] = getScaled(_a[3]);
323 break;
324 case SP_COLOR_SCALES_MODE_HSV:
325 sp_color_hsl_to_rgb_floatv (rgba, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]));
326 rgba[3] = getScaled(_a[3]);
327 break;
328 case SP_COLOR_SCALES_MODE_CMYK:
329 sp_color_cmyk_to_rgb_floatv (rgba, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3]));
330 rgba[3] = getScaled(_a[4]);
331 break;
332 default:
333 g_warning ("file %s: line %d: Illegal color selector mode", __FILE__, __LINE__);
334 break;
335 }
336 }
338 void ColorScales::_getCmykaFloatv( gfloat *cmyka )
339 {
340 gfloat rgb[3];
342 g_return_if_fail (cmyka != NULL);
344 switch (_mode) {
345 case SP_COLOR_SCALES_MODE_RGB:
346 sp_color_rgb_to_cmyk_floatv (cmyka, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]));
347 cmyka[4] = getScaled(_a[3]);
348 break;
349 case SP_COLOR_SCALES_MODE_HSV:
350 sp_color_hsl_to_rgb_floatv (rgb, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]));
351 sp_color_rgb_to_cmyk_floatv (cmyka, rgb[0], rgb[1], rgb[2]);
352 cmyka[4] = getScaled(_a[3]);
353 break;
354 case SP_COLOR_SCALES_MODE_CMYK:
355 cmyka[0] = getScaled(_a[0]);
356 cmyka[1] = getScaled(_a[1]);
357 cmyka[2] = getScaled(_a[2]);
358 cmyka[3] = getScaled(_a[3]);
359 cmyka[4] = getScaled(_a[4]);
360 break;
361 default:
362 g_warning ("file %s: line %d: Illegal color selector mode", __FILE__, __LINE__);
363 break;
364 }
365 }
367 guint32 ColorScales::_getRgba32()
368 {
369 gfloat c[4];
370 guint32 rgba;
372 _getRgbaFloatv(c);
374 rgba = SP_RGBA32_F_COMPOSE (c[0], c[1], c[2], c[3]);
376 return rgba;
377 }
379 void ColorScales::setMode(SPColorScalesMode mode)
380 {
381 gfloat rgba[4];
382 gfloat c[4];
384 if (_mode == mode) return;
386 if ((_mode == SP_COLOR_SCALES_MODE_RGB) ||
387 (_mode == SP_COLOR_SCALES_MODE_HSV) ||
388 (_mode == SP_COLOR_SCALES_MODE_CMYK)) {
389 _getRgbaFloatv(rgba);
390 } else {
391 rgba[0] = rgba[1] = rgba[2] = rgba[3] = 1.0;
392 }
394 _mode = mode;
396 switch (mode) {
397 case SP_COLOR_SCALES_MODE_RGB:
398 _setRangeLimit(255.0);
399 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[0]), _("_R"));
400 gtk_tooltips_set_tip (_tt, _s[0], _("Red"), NULL);
401 gtk_tooltips_set_tip (_tt, _b[0], _("Red"), NULL);
402 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[1]), _("_G"));
403 gtk_tooltips_set_tip (_tt, _s[1], _("Green"), NULL);
404 gtk_tooltips_set_tip (_tt, _b[1], _("Green"), NULL);
405 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[2]), _("_B"));
406 gtk_tooltips_set_tip (_tt, _s[2], _("Blue"), NULL);
407 gtk_tooltips_set_tip (_tt, _b[2], _("Blue"), NULL);
408 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[3]), _("_A"));
409 gtk_tooltips_set_tip (_tt, _s[3], _("Alpha (opacity)"), NULL);
410 gtk_tooltips_set_tip (_tt, _b[3], _("Alpha (opacity)"), NULL);
411 sp_color_slider_set_map (SP_COLOR_SLIDER (_s[0]), NULL);
412 gtk_widget_hide (_l[4]);
413 gtk_widget_hide (_s[4]);
414 gtk_widget_hide (_b[4]);
415 _updating = TRUE;
416 setScaled( _a[0], rgba[0] );
417 setScaled( _a[1], rgba[1] );
418 setScaled( _a[2], rgba[2] );
419 setScaled( _a[3], rgba[3] );
420 _updating = FALSE;
421 _updateSliders( CSC_CHANNELS_ALL );
422 break;
423 case SP_COLOR_SCALES_MODE_HSV:
424 _setRangeLimit(255.0);
425 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[0]), _("_H"));
426 gtk_tooltips_set_tip (_tt, _s[0], _("Hue"), NULL);
427 gtk_tooltips_set_tip (_tt, _b[0], _("Hue"), NULL);
428 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[1]), _("_S"));
429 gtk_tooltips_set_tip (_tt, _s[1], _("Saturation"), NULL);
430 gtk_tooltips_set_tip (_tt, _b[1], _("Saturation"), NULL);
431 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[2]), _("_L"));
432 gtk_tooltips_set_tip (_tt, _s[2], _("Lightness"), NULL);
433 gtk_tooltips_set_tip (_tt, _b[2], _("Lightness"), NULL);
434 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[3]), _("_A"));
435 gtk_tooltips_set_tip (_tt, _s[3], _("Alpha (opacity)"), NULL);
436 gtk_tooltips_set_tip (_tt, _b[3], _("Alpha (opacity)"), NULL);
437 sp_color_slider_set_map (SP_COLOR_SLIDER (_s[0]), (guchar*)sp_color_scales_hue_map ());
438 gtk_widget_hide (_l[4]);
439 gtk_widget_hide (_s[4]);
440 gtk_widget_hide (_b[4]);
441 _updating = TRUE;
442 c[0] = 0.0;
443 sp_color_rgb_to_hsl_floatv (c, rgba[0], rgba[1], rgba[2]);
444 setScaled( _a[0], c[0] );
445 setScaled( _a[1], c[1] );
446 setScaled( _a[2], c[2] );
447 setScaled( _a[3], rgba[3] );
448 _updating = FALSE;
449 _updateSliders( CSC_CHANNELS_ALL );
450 break;
451 case SP_COLOR_SCALES_MODE_CMYK:
452 _setRangeLimit(100.0);
453 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[0]), _("_C"));
454 gtk_tooltips_set_tip (_tt, _s[0], _("Cyan"), NULL);
455 gtk_tooltips_set_tip (_tt, _b[0], _("Cyan"), NULL);
456 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[1]), _("_M"));
457 gtk_tooltips_set_tip (_tt, _s[1], _("Magenta"), NULL);
458 gtk_tooltips_set_tip (_tt, _b[1], _("Magenta"), NULL);
459 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[2]), _("_Y"));
460 gtk_tooltips_set_tip (_tt, _s[2], _("Yellow"), NULL);
461 gtk_tooltips_set_tip (_tt, _b[2], _("Yellow"), NULL);
462 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[3]), _("_K"));
463 gtk_tooltips_set_tip (_tt, _s[3], _("Black"), NULL);
464 gtk_tooltips_set_tip (_tt, _b[3], _("Black"), NULL);
465 gtk_label_set_markup_with_mnemonic (GTK_LABEL (_l[4]), _("_A"));
466 gtk_tooltips_set_tip (_tt, _s[4], _("Alpha (opacity)"), NULL);
467 gtk_tooltips_set_tip (_tt, _b[4], _("Alpha (opacity)"), NULL);
468 sp_color_slider_set_map (SP_COLOR_SLIDER (_s[0]), NULL);
469 gtk_widget_show (_l[4]);
470 gtk_widget_show (_s[4]);
471 gtk_widget_show (_b[4]);
472 _updating = TRUE;
473 sp_color_rgb_to_cmyk_floatv (c, rgba[0], rgba[1], rgba[2]);
474 setScaled( _a[0], c[0] );
475 setScaled( _a[1], c[1] );
476 setScaled( _a[2], c[2] );
477 setScaled( _a[3], c[3] );
478 setScaled( _a[4], rgba[3] );
479 _updating = FALSE;
480 _updateSliders( CSC_CHANNELS_ALL );
481 break;
482 default:
483 g_warning ("file %s: line %d: Illegal color selector mode", __FILE__, __LINE__);
484 break;
485 }
486 }
488 SPColorScalesMode ColorScales::getMode() const
489 {
490 return _mode;
491 }
493 void ColorScales::setSubmode( guint submode )
494 {
495 g_return_if_fail (_csel != NULL);
496 g_return_if_fail (SP_IS_COLOR_SCALES (_csel));
497 g_return_if_fail (submode < 3);
499 switch ( submode )
500 {
501 default:
502 case 0:
503 setMode(SP_COLOR_SCALES_MODE_RGB);
504 break;
505 case 1:
506 setMode(SP_COLOR_SCALES_MODE_HSV);
507 break;
508 case 2:
509 setMode(SP_COLOR_SCALES_MODE_CMYK);
510 break;
511 }
512 }
514 guint ColorScales::getSubmode() const
515 {
516 guint submode = 0;
518 switch ( _mode )
519 {
520 case SP_COLOR_SCALES_MODE_HSV:
521 submode = 1;
522 break;
523 case SP_COLOR_SCALES_MODE_CMYK:
524 submode = 2;
525 break;
526 case SP_COLOR_SCALES_MODE_RGB:
527 default:
528 submode = 0;
529 }
531 return submode;
532 }
534 void ColorScales::_adjustmentAnyChanged( GtkAdjustment *adjustment, SPColorScales *cs )
535 {
536 gint channel = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (adjustment), "channel"));
538 _adjustmentChanged(cs, channel);
539 }
541 void ColorScales::_sliderAnyGrabbed( SPColorSlider *slider, SPColorScales *cs )
542 {
543 (void)slider;
544 ColorScales* scales = (ColorScales*)(SP_COLOR_SELECTOR(cs)->base);
545 if (!scales->_dragging) {
546 scales->_dragging = TRUE;
547 scales->_grabbed();
548 scales->_recalcColor( FALSE );
549 }
550 }
552 void ColorScales::_sliderAnyReleased( SPColorSlider *slider, SPColorScales *cs )
553 {
554 (void)slider;
555 ColorScales* scales = (ColorScales*)(SP_COLOR_SELECTOR(cs)->base);
556 if (scales->_dragging) {
557 scales->_dragging = FALSE;
558 scales->_released();
559 scales->_recalcColor( FALSE );
560 }
561 }
563 void ColorScales::_sliderAnyChanged( SPColorSlider *slider, SPColorScales *cs )
564 {
565 (void)slider;
566 ColorScales* scales = (ColorScales*)(SP_COLOR_SELECTOR(cs)->base);
568 scales->_recalcColor( TRUE );
569 }
571 void ColorScales::_adjustmentChanged( SPColorScales *cs, guint channel )
572 {
573 ColorScales* scales = (ColorScales*)(SP_COLOR_SELECTOR(cs)->base);
574 if (scales->_updating) return;
576 scales->_updating = TRUE;
578 scales->_updateSliders( (1 << channel) );
580 scales->_recalcColor (TRUE);
582 scales->_updating = FALSE;
583 }
585 void ColorScales::_updateSliders( guint channels )
586 {
587 gfloat rgb0[3], rgbm[3], rgb1[3];
588 #ifdef SPCS_PREVIEW
589 guint32 rgba;
590 #endif
591 switch (_mode) {
592 case SP_COLOR_SCALES_MODE_RGB:
593 if ((channels != CSC_CHANNEL_R) && (channels != CSC_CHANNEL_A)) {
594 /* Update red */
595 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[0]),
596 SP_RGBA32_F_COMPOSE (0.0, getScaled(_a[1]), getScaled(_a[2]), 1.0),
597 SP_RGBA32_F_COMPOSE (0.5, getScaled(_a[1]), getScaled(_a[2]), 1.0),
598 SP_RGBA32_F_COMPOSE (1.0, getScaled(_a[1]), getScaled(_a[2]), 1.0));
599 }
600 if ((channels != CSC_CHANNEL_G) && (channels != CSC_CHANNEL_A)) {
601 /* Update green */
602 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[1]),
603 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), 0.0, getScaled(_a[2]), 1.0),
604 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), 0.5, getScaled(_a[2]), 1.0),
605 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), 1.0, getScaled(_a[2]), 1.0));
606 }
607 if ((channels != CSC_CHANNEL_B) && (channels != CSC_CHANNEL_A)) {
608 /* Update blue */
609 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[2]),
610 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), 0.0, 1.0),
611 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), 0.5, 1.0),
612 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), 1.0, 1.0));
613 }
614 if (channels != CSC_CHANNEL_A) {
615 /* Update alpha */
616 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[3]),
617 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 0.0),
618 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 0.5),
619 SP_RGBA32_F_COMPOSE (getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 1.0));
620 }
621 break;
622 case SP_COLOR_SCALES_MODE_HSV:
623 /* Hue is never updated */
624 if ((channels != CSC_CHANNEL_S) && (channels != CSC_CHANNEL_A)) {
625 /* Update saturation */
626 sp_color_hsl_to_rgb_floatv (rgb0, getScaled(_a[0]), 0.0, getScaled(_a[2]));
627 sp_color_hsl_to_rgb_floatv (rgbm, getScaled(_a[0]), 0.5, getScaled(_a[2]));
628 sp_color_hsl_to_rgb_floatv (rgb1, getScaled(_a[0]), 1.0, getScaled(_a[2]));
629 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[1]),
630 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
631 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
632 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
633 }
634 if ((channels != CSC_CHANNEL_V) && (channels != CSC_CHANNEL_A)) {
635 /* Update value */
636 sp_color_hsl_to_rgb_floatv (rgb0, getScaled(_a[0]), getScaled(_a[1]), 0.0);
637 sp_color_hsl_to_rgb_floatv (rgbm, getScaled(_a[0]), getScaled(_a[1]), 0.5);
638 sp_color_hsl_to_rgb_floatv (rgb1, getScaled(_a[0]), getScaled(_a[1]), 1.0);
639 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[2]),
640 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
641 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
642 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
643 }
644 if (channels != CSC_CHANNEL_A) {
645 /* Update alpha */
646 sp_color_hsl_to_rgb_floatv (rgb0, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]));
647 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[3]),
648 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 0.0),
649 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 0.5),
650 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0));
651 }
652 break;
653 case SP_COLOR_SCALES_MODE_CMYK:
654 if ((channels != CSC_CHANNEL_C) && (channels != CSC_CHANNEL_CMYKA)) {
655 /* Update C */
656 sp_color_cmyk_to_rgb_floatv (rgb0, 0.0, getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3]));
657 sp_color_cmyk_to_rgb_floatv (rgbm, 0.5, getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3]));
658 sp_color_cmyk_to_rgb_floatv (rgb1, 1.0, getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3]));
659 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[0]),
660 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
661 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
662 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
663 }
664 if ((channels != CSC_CHANNEL_M) && (channels != CSC_CHANNEL_CMYKA)) {
665 /* Update M */
666 sp_color_cmyk_to_rgb_floatv (rgb0, getScaled(_a[0]), 0.0, getScaled(_a[2]), getScaled(_a[3]));
667 sp_color_cmyk_to_rgb_floatv (rgbm, getScaled(_a[0]), 0.5, getScaled(_a[2]), getScaled(_a[3]));
668 sp_color_cmyk_to_rgb_floatv (rgb1, getScaled(_a[0]), 1.0, getScaled(_a[2]), getScaled(_a[3]));
669 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[1]),
670 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
671 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
672 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
673 }
674 if ((channels != CSC_CHANNEL_Y) && (channels != CSC_CHANNEL_CMYKA)) {
675 /* Update Y */
676 sp_color_cmyk_to_rgb_floatv (rgb0, getScaled(_a[0]), getScaled(_a[1]), 0.0, getScaled(_a[3]));
677 sp_color_cmyk_to_rgb_floatv (rgbm, getScaled(_a[0]), getScaled(_a[1]), 0.5, getScaled(_a[3]));
678 sp_color_cmyk_to_rgb_floatv (rgb1, getScaled(_a[0]), getScaled(_a[1]), 1.0, getScaled(_a[3]));
679 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[2]),
680 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
681 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
682 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
683 }
684 if ((channels != CSC_CHANNEL_K) && (channels != CSC_CHANNEL_CMYKA)) {
685 /* Update K */
686 sp_color_cmyk_to_rgb_floatv (rgb0, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 0.0);
687 sp_color_cmyk_to_rgb_floatv (rgbm, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 0.5);
688 sp_color_cmyk_to_rgb_floatv (rgb1, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), 1.0);
689 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[3]),
690 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0),
691 SP_RGBA32_F_COMPOSE (rgbm[0], rgbm[1], rgbm[2], 1.0),
692 SP_RGBA32_F_COMPOSE (rgb1[0], rgb1[1], rgb1[2], 1.0));
693 }
694 if (channels != CSC_CHANNEL_CMYKA) {
695 /* Update alpha */
696 sp_color_cmyk_to_rgb_floatv (rgb0, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3]));
697 sp_color_slider_set_colors (SP_COLOR_SLIDER (_s[4]),
698 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 0.0),
699 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 0.5),
700 SP_RGBA32_F_COMPOSE (rgb0[0], rgb0[1], rgb0[2], 1.0));
701 }
702 break;
703 default:
704 g_warning ("file %s: line %d: Illegal color selector mode", __FILE__, __LINE__);
705 break;
706 }
708 // Force the internal color to be updated
709 if ( !_updating )
710 {
711 _recalcColor( TRUE );
712 }
714 #ifdef SPCS_PREVIEW
715 rgba = sp_color_scales_get_rgba32 (cs);
716 sp_color_preview_set_rgba32 (SP_COLOR_PREVIEW (_p), rgba);
717 #endif
718 }
720 static const gchar *
721 sp_color_scales_hue_map (void)
722 {
723 static gchar *map = NULL;
725 if (!map) {
726 gchar *p;
727 gint h;
728 map = g_new (gchar, 4 * 1024);
729 p = map;
730 for (h = 0; h < 1024; h++) {
731 gfloat rgb[3];
732 sp_color_hsl_to_rgb_floatv (rgb, h / 1024.0, 1.0, 0.5);
733 *p++ = SP_COLOR_F_TO_U (rgb[0]);
734 *p++ = SP_COLOR_F_TO_U (rgb[1]);
735 *p++ = SP_COLOR_F_TO_U (rgb[2]);
736 *p++ = 255;
737 }
738 }
740 return map;
741 }