diff options
| author | Roman Hargrave <roman@hargrave.info> | 2017-08-02 05:02:46 +0000 |
|---|---|---|
| committer | Roman Hargrave <roman@hargrave.info> | 2017-08-02 05:02:46 +0000 |
| commit | 5e59eeaf0e7e6fdd05338badfdb4870242cd948c (patch) | |
| tree | e25d76bfbfebe2d46485ccfb3fa3c70d1d2ba46f /src | |
| parent | Rename SP_COLOR_SCALES_MODE_HSV to SP_COLOR_SCALES_MODE_HSL (diff) | |
| download | inkscape-5e59eeaf0e7e6fdd05338badfdb4870242cd948c.tar.gz inkscape-5e59eeaf0e7e6fdd05338badfdb4870242cd948c.zip | |
Add HSV picker mode to color scales
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/widget/color-notebook.cpp | 4 | ||||
| -rw-r--r-- | src/ui/widget/color-scales.cpp | 79 | ||||
| -rw-r--r-- | src/ui/widget/color-scales.h | 3 |
3 files changed, 82 insertions, 4 deletions
diff --git a/src/ui/widget/color-notebook.cpp b/src/ui/widget/color-notebook.cpp index 3be6ca3f4..a4df8187f 100644 --- a/src/ui/widget/color-notebook.cpp +++ b/src/ui/widget/color-notebook.cpp @@ -1,6 +1,6 @@ /** * @file - * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages - implementation + * A notebook with RGB, CMYK, CMS, HSL, HSV, and Wheel pages - implementation */ /* Authors: * Lauris Kaplinski <lauris@kaplinski.com> @@ -60,6 +60,8 @@ ColorNotebook::ColorNotebook(SelectedColor &color) _available_pages.push_back(page); page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSL), true); _available_pages.push_back(page); + page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSV), true); + _available_pages.push_back(page); page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_CMYK), true); _available_pages.push_back(page); page = new Page(new ColorWheelSelectorFactory, true); diff --git a/src/ui/widget/color-scales.cpp b/src/ui/widget/color-scales.cpp index 42c710c4c..cb1f36066 100644 --- a/src/ui/widget/color-scales.cpp +++ b/src/ui/widget/color-scales.cpp @@ -40,7 +40,7 @@ namespace Widget { static const gchar *sp_color_scales_hue_map(); -const gchar *ColorScales::SUBMODE_NAMES[] = { N_("None"), N_("RGB"), N_("HSL"), N_("CMYK") }; +const gchar *ColorScales::SUBMODE_NAMES[] = { N_("None"), N_("RGB"), N_("HSL"), N_("CMYK"), N_("HSV") }; ColorScales::ColorScales(SelectedColor &color, SPColorScalesMode mode) : Gtk::Grid() @@ -165,6 +165,7 @@ void ColorScales::_recalcColor() switch (_mode) { case SP_COLOR_SCALES_MODE_RGB: case SP_COLOR_SCALES_MODE_HSL: + case SP_COLOR_SCALES_MODE_HSV: _getRgbaFloatv(c); color.set(c[0], c[1], c[2]); alpha = c[3]; @@ -210,6 +211,12 @@ void ColorScales::_updateDisplay() c[3] = _color.alpha(); c[4] = 0.0; break; + case SP_COLOR_SCALES_MODE_HSV: + sp_color_get_rgb_floatv(&color, tmp); + sp_color_rgb_to_hsv_floatv(c, tmp[0], tmp[1], tmp[2]); + c[3] = _color.alpha(); + c[4] = 0.0; + break; case SP_COLOR_SCALES_MODE_CMYK: sp_color_get_cmyk_floatv(&color, c); c[4] = _color.alpha(); @@ -280,6 +287,10 @@ void ColorScales::_getRgbaFloatv(gfloat *rgba) sp_color_hsl_to_rgb_floatv(rgba, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2])); rgba[3] = getScaled(_a[3]); break; + case SP_COLOR_SCALES_MODE_HSV: + sp_color_hsv_to_rgb_floatv(rgba, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2])); + rgba[3] = getScaled(_a[3]); + break; case SP_COLOR_SCALES_MODE_CMYK: sp_color_cmyk_to_rgb_floatv(rgba, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2]), getScaled(_a[3])); rgba[3] = getScaled(_a[4]); @@ -340,7 +351,7 @@ void ColorScales::setMode(SPColorScalesMode mode) return; if ((_mode == SP_COLOR_SCALES_MODE_RGB) || (_mode == SP_COLOR_SCALES_MODE_HSL) || - (_mode == SP_COLOR_SCALES_MODE_CMYK)) { + (_mode == SP_COLOR_SCALES_MODE_CMYK) || (_mode == SP_COLOR_SCALES_MODE_HSV)) { _getRgbaFloatv(rgba); } else { @@ -412,6 +423,42 @@ void ColorScales::setMode(SPColorScalesMode mode) _updateSliders(CSC_CHANNELS_ALL); _updating = FALSE; break; + case SP_COLOR_SCALES_MODE_HSV: + _setRangeLimit(100.0); + + gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[0]), _("_H:")); + _s[0]->set_tooltip_text(_("Hue")); + gtk_widget_set_tooltip_text(_b[0], _("Hue")); + gtk_adjustment_set_upper(_a[0], 360.0); + + gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[1]), _("_S:")); + _s[1]->set_tooltip_text(_("Saturation")); + gtk_widget_set_tooltip_text(_b[1], _("Saturation")); + + gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[2]), _("_V:")); + _s[2]->set_tooltip_text(_("Value")); + gtk_widget_set_tooltip_text(_b[2], _("Value")); + + gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[3]), _("_A:")); + _s[3]->set_tooltip_text(_("Alpha (opacity)")); + gtk_widget_set_tooltip_text(_b[3], _("Alpha (opacity)")); + _s[0]->setMap((guchar *)(sp_color_scales_hue_map())); + gtk_widget_hide(_l[4]); + _s[4]->hide(); + gtk_widget_hide(_b[4]); + _updating = TRUE; + c[0] = 0.0; + + sp_color_rgb_to_hsv_floatv(c, rgba[0], rgba[1], rgba[2]); + + setScaled(_a[0], c[0]); + setScaled(_a[1], c[1]); + setScaled(_a[2], c[2]); + setScaled(_a[3], rgba[3]); + + _updateSliders(CSC_CHANNELS_ALL); + _updating = FALSE; + break; case SP_COLOR_SCALES_MODE_CMYK: _setRangeLimit(100.0); gtk_label_set_markup_with_mnemonic(GTK_LABEL(_l[0]), _("_C:")); @@ -561,6 +608,34 @@ void ColorScales::_updateSliders(guint channels) SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 1.0)); } break; + case SP_COLOR_SCALES_MODE_HSV: + /* Hue is never updated */ + if ((channels != CSC_CHANNEL_S) && (channels != CSC_CHANNEL_A)) { + /* Update saturation */ + sp_color_hsv_to_rgb_floatv(rgb0, getScaled(_a[0]), 0.0, getScaled(_a[2])); + sp_color_hsv_to_rgb_floatv(rgbm, getScaled(_a[0]), 0.5, getScaled(_a[2])); + sp_color_hsv_to_rgb_floatv(rgb1, getScaled(_a[0]), 1.0, getScaled(_a[2])); + _s[1]->setColors(SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 1.0), + SP_RGBA32_F_COMPOSE(rgbm[0], rgbm[1], rgbm[2], 1.0), + SP_RGBA32_F_COMPOSE(rgb1[0], rgb1[1], rgb1[2], 1.0)); + } + if ((channels != CSC_CHANNEL_V) && (channels != CSC_CHANNEL_A)) { + /* Update value */ + sp_color_hsv_to_rgb_floatv(rgb0, getScaled(_a[0]), getScaled(_a[1]), 0.0); + sp_color_hsv_to_rgb_floatv(rgbm, getScaled(_a[0]), getScaled(_a[1]), 0.5); + sp_color_hsv_to_rgb_floatv(rgb1, getScaled(_a[0]), getScaled(_a[1]), 1.0); + _s[2]->setColors(SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 1.0), + SP_RGBA32_F_COMPOSE(rgbm[0], rgbm[1], rgbm[2], 1.0), + SP_RGBA32_F_COMPOSE(rgb1[0], rgb1[1], rgb1[2], 1.0)); + } + if (channels != CSC_CHANNEL_A) { + /* Update alpha */ + sp_color_hsv_to_rgb_floatv(rgb0, getScaled(_a[0]), getScaled(_a[1]), getScaled(_a[2])); + _s[3]->setColors(SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 0.0), + SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 0.5), + SP_RGBA32_F_COMPOSE(rgb0[0], rgb0[1], rgb0[2], 1.0)); + } + break; case SP_COLOR_SCALES_MODE_CMYK: if ((channels != CSC_CHANNEL_C) && (channels != CSC_CHANNEL_CMYKA)) { /* Update C */ diff --git a/src/ui/widget/color-scales.h b/src/ui/widget/color-scales.h index 2e7f604dc..0b7cae47e 100644 --- a/src/ui/widget/color-scales.h +++ b/src/ui/widget/color-scales.h @@ -19,7 +19,8 @@ typedef enum { SP_COLOR_SCALES_MODE_NONE = 0, SP_COLOR_SCALES_MODE_RGB = 1, SP_COLOR_SCALES_MODE_HSL = 2, - SP_COLOR_SCALES_MODE_CMYK = 3 + SP_COLOR_SCALES_MODE_CMYK = 3, + SP_COLOR_SCALES_MODE_HSV = 4 } SPColorScalesMode; class ColorScales |
