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