Code

Use subdirectories with icon sizes.
[inkscape.git] / src / widgets / sp-color-scales.cpp
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 )
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     }
115 ColorScales::~ColorScales()
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     }
125 void sp_color_scales_init (SPColorScales *cs)
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     }
135 void ColorScales::init()
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);
187 static void
188 sp_color_scales_destroy (GtkObject *object)
190         if (((GtkObjectClass *) (parent_class))->destroy)
191                 (* ((GtkObjectClass *) (parent_class))->destroy) (object);
194 static void
195 sp_color_scales_show_all (GtkWidget *widget)
197         gtk_widget_show (widget);
200 static void
201 sp_color_scales_hide_all (GtkWidget *widget)
203         gtk_widget_hide (widget);
206 GtkWidget *
207 sp_color_scales_new (void)
209         SPColorScales *csel;
211         csel = (SPColorScales*)gtk_type_new (SP_TYPE_COLOR_SCALES);
213         return GTK_WIDGET (csel);
216 void ColorScales::_recalcColor( gboolean changing )
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     }
257 /* Helpers for setting color value */
258 gfloat ColorScales::getScaled( const GtkAdjustment *a )
260     gfloat val = a->value / a->upper;
261     return val;
264 void ColorScales::setScaled( GtkAdjustment *a, gfloat v )
266     gfloat val = v * a->upper;
267     gtk_adjustment_set_value( a, val );
270 void ColorScales::_setRangeLimit( gdouble upper )
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     }
279 void ColorScales::_colorChanged()
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;
318 void ColorScales::_getRgbaFloatv( gfloat *rgba )
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         }
343 void ColorScales::_getCmykaFloatv( gfloat *cmyka )
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         }
372 guint32 ColorScales::_getRgba32()
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;
384 void ColorScales::setMode(SPColorScalesMode mode)
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         }
495 SPColorScalesMode ColorScales::getMode() const
497         return _mode;
500 void ColorScales::setSubmode( guint submode )
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         }
521 guint ColorScales::getSubmode() const
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;
541 void ColorScales::_adjustmentAnyChanged( GtkAdjustment *adjustment, SPColorScales *cs )
543         gint channel = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (adjustment), "channel"));
545         _adjustmentChanged(cs, channel);
548 void ColorScales::_sliderAnyGrabbed( SPColorSlider *slider, SPColorScales *cs )
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         }
559 void ColorScales::_sliderAnyReleased( SPColorSlider *slider, SPColorScales *cs )
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         }
570 void ColorScales::_sliderAnyChanged( SPColorSlider *slider, SPColorScales *cs )
572     (void)slider;
573     ColorScales* scales = (ColorScales*)(SP_COLOR_SELECTOR(cs)->base);
575     scales->_recalcColor( TRUE );
578 void ColorScales::_adjustmentChanged( SPColorScales *cs, guint channel )
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;
592 void ColorScales::_updateSliders( guint channels )
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
727 static const gchar *
728 sp_color_scales_hue_map (void)
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;