summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRoman Hargrave <roman@hargrave.info>2017-08-02 05:02:46 +0000
committerRoman Hargrave <roman@hargrave.info>2017-08-02 05:02:46 +0000
commit5e59eeaf0e7e6fdd05338badfdb4870242cd948c (patch)
treee25d76bfbfebe2d46485ccfb3fa3c70d1d2ba46f /src
parentRename SP_COLOR_SCALES_MODE_HSV to SP_COLOR_SCALES_MODE_HSL (diff)
downloadinkscape-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.cpp4
-rw-r--r--src/ui/widget/color-scales.cpp79
-rw-r--r--src/ui/widget/color-scales.h3
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