Add perceptually uniform rainbow color maps.
[gencolormap.git] / colormapwidgets.hpp
1 /*
2  * Copyright (C) 2015, 2016 Computer Graphics Group, University of Siegen
3  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23
24 #ifndef COLORMAPWIDGETS_HPP
25 #define COLORMAPWIDGETS_HPP
26
27 #include <QVector>
28 #include <QWidget>
29
30 class QSpinBox;
31 class QSlider;
32 class QDoubleSpinBox;
33 class QPushButton;
34
35
36 // Internal helper class for a slider/spinbox combination
37 class ColorMapCombinedSliderSpinBox : public QObject
38 {
39 Q_OBJECT
40
41 private:
42     bool _update_lock;
43
44 public:
45     float minval, maxval, step;
46     QSlider* slider;
47     QDoubleSpinBox* spinbox;
48
49     ColorMapCombinedSliderSpinBox(float minval, float maxval, float step);
50     float value() const;
51     void setValue(float v);
52
53 private slots:
54     void sliderChanged();
55     void spinboxChanged();
56
57 signals:
58     void valueChanged(float);
59 };
60
61 /* The ColorMapWidget interface, implemented by all color map method widgets */
62 class ColorMapWidget : public QWidget
63 {
64 Q_OBJECT
65
66 public:
67     ColorMapWidget();
68     ~ColorMapWidget();
69
70     /* Reset all values to their method-specific defaults */
71     virtual void reset() = 0;
72
73     /* Get the color map corresponding to the current values as a vector of colors */
74     virtual QVector<QColor> colorMap() const = 0;
75
76     /* Get a color map as an image of the specified size. If width or height is zero,
77      * then it will be set to the number of colors in the color map. */
78     QImage colorMapImage(int width, int height);
79
80     /* Get a rich text string containing the relevant literature reference for this method */
81     virtual QString reference() const = 0;
82
83 signals:
84     void colorMapChanged();
85 };
86
87 class ColorMapBrewerSequentialWidget : public ColorMapWidget
88 {
89 Q_OBJECT
90 private:
91     bool _update_lock;
92     QSpinBox* _n_spinbox;
93     ColorMapCombinedSliderSpinBox* _hue_changer;
94     ColorMapCombinedSliderSpinBox* _warmth_changer;
95     ColorMapCombinedSliderSpinBox* _contrast_changer;
96     ColorMapCombinedSliderSpinBox* _saturation_changer;
97     ColorMapCombinedSliderSpinBox* _brightness_changer;
98 private slots:
99     void update();
100
101 public:
102     ColorMapBrewerSequentialWidget();
103     ~ColorMapBrewerSequentialWidget();
104
105     void reset() override;
106     QVector<QColor> colorMap() const override;
107     QString reference() const override;
108     void parameters(int& n, float& hue,
109             float& contrast, float& saturation, float& brightness, float& warmth) const;
110 };
111
112 class ColorMapBrewerDivergingWidget : public ColorMapWidget
113 {
114 Q_OBJECT
115 private:
116     bool _update_lock;
117     QSpinBox* _n_spinbox;
118     ColorMapCombinedSliderSpinBox* _hue_changer;
119     ColorMapCombinedSliderSpinBox* _divergence_changer;
120     ColorMapCombinedSliderSpinBox* _warmth_changer;
121     ColorMapCombinedSliderSpinBox* _contrast_changer;
122     ColorMapCombinedSliderSpinBox* _saturation_changer;
123     ColorMapCombinedSliderSpinBox* _brightness_changer;
124 private slots:
125     void update();
126
127 public:
128     ColorMapBrewerDivergingWidget();
129     ~ColorMapBrewerDivergingWidget();
130
131     void reset() override;
132     QVector<QColor> colorMap() const override;
133     QString reference() const override;
134     void parameters(int& n, float& hue, float& divergence,
135             float& contrast, float& saturation, float& brightness, float& warmth) const;
136 };
137
138 class ColorMapBrewerQualitativeWidget : public ColorMapWidget
139 {
140 Q_OBJECT
141 private:
142     bool _update_lock;
143     QSpinBox* _n_spinbox;
144     ColorMapCombinedSliderSpinBox* _hue_changer;
145     ColorMapCombinedSliderSpinBox* _divergence_changer;
146     ColorMapCombinedSliderSpinBox* _contrast_changer;
147     ColorMapCombinedSliderSpinBox* _saturation_changer;
148     ColorMapCombinedSliderSpinBox* _brightness_changer;
149 private slots:
150     void update();
151
152 public:
153     ColorMapBrewerQualitativeWidget();
154     ~ColorMapBrewerQualitativeWidget();
155
156     void reset() override;
157     QVector<QColor> colorMap() const override;
158     QString reference() const override;
159     void parameters(int& n, float& hue, float& divergence,
160             float& contrast, float& saturation, float& brightness) const;
161 };
162
163 class ColorMapIsoluminantSequentialWidget : public ColorMapWidget
164 {
165 Q_OBJECT
166 private:
167     bool _update_lock;
168     QSpinBox* _n_spinbox;
169     ColorMapCombinedSliderSpinBox* _luminance_changer;
170     ColorMapCombinedSliderSpinBox* _saturation_changer;
171     ColorMapCombinedSliderSpinBox* _hue_changer;
172 private slots:
173     void update();
174
175 public:
176     ColorMapIsoluminantSequentialWidget();
177     ~ColorMapIsoluminantSequentialWidget();
178
179     void reset() override;
180     QVector<QColor> colorMap() const override;
181     QString reference() const override;
182     void parameters(int& n, float& luminance, float& saturation, float& hue) const;
183 };
184
185 class ColorMapIsoluminantDivergingWidget : public ColorMapWidget
186 {
187 Q_OBJECT
188 private:
189     bool _update_lock;
190     QSpinBox* _n_spinbox;
191     ColorMapCombinedSliderSpinBox* _luminance_changer;
192     ColorMapCombinedSliderSpinBox* _saturation_changer;
193     ColorMapCombinedSliderSpinBox* _hue_changer;
194     ColorMapCombinedSliderSpinBox* _divergence_changer;
195 private slots:
196     void update();
197
198 public:
199     ColorMapIsoluminantDivergingWidget();
200     ~ColorMapIsoluminantDivergingWidget();
201
202     void reset() override;
203     QVector<QColor> colorMap() const override;
204     QString reference() const override;
205     void parameters(int& n, float& luminance, float& saturation, float& hue, float& divergence) const;
206 };
207
208 class ColorMapIsoluminantQualitativeWidget : public ColorMapWidget
209 {
210 Q_OBJECT
211 private:
212     bool _update_lock;
213     QSpinBox* _n_spinbox;
214     ColorMapCombinedSliderSpinBox* _luminance_changer;
215     ColorMapCombinedSliderSpinBox* _saturation_changer;
216     ColorMapCombinedSliderSpinBox* _hue_changer;
217 private slots:
218     void update();
219
220 public:
221     ColorMapIsoluminantQualitativeWidget();
222     ~ColorMapIsoluminantQualitativeWidget();
223
224     void reset() override;
225     QVector<QColor> colorMap() const override;
226     QString reference() const override;
227     void parameters(int& n, float& luminance, float& saturation, float& hue) const;
228 };
229
230 class ColorMapUniformRainbowWidget : public ColorMapWidget
231 {
232 Q_OBJECT
233 private:
234     bool _update_lock;
235     QSpinBox* _n_spinbox;
236     ColorMapCombinedSliderSpinBox* _hue_changer;
237     ColorMapCombinedSliderSpinBox* _rotations_changer;
238     ColorMapCombinedSliderSpinBox* _saturation_changer;
239 private slots:
240     void update();
241
242 public:
243     ColorMapUniformRainbowWidget();
244     ~ColorMapUniformRainbowWidget();
245
246     void reset() override;
247     QVector<QColor> colorMap() const override;
248     QString reference() const override;
249     void parameters(int& n, float& hue, float& rotations, float& saturation) const;
250 };
251
252 class ColorMapBlackBodyWidget : public ColorMapWidget
253 {
254 Q_OBJECT
255 private:
256     bool _update_lock;
257     QSpinBox* _n_spinbox;
258     ColorMapCombinedSliderSpinBox* _temperature_changer;
259     ColorMapCombinedSliderSpinBox* _range_changer;
260 private slots:
261     void update();
262
263 public:
264     ColorMapBlackBodyWidget();
265     ~ColorMapBlackBodyWidget();
266
267     void reset() override;
268     QVector<QColor> colorMap() const override;
269     QString reference() const override;
270     void parameters(int& n, float& temperature, float& range) const;
271 };
272
273 class ColorMapCubeHelixWidget : public ColorMapWidget
274 {
275 Q_OBJECT
276 private:
277     bool _update_lock;
278     QSpinBox* _n_spinbox;
279     ColorMapCombinedSliderSpinBox* _hue_changer;
280     ColorMapCombinedSliderSpinBox* _rotations_changer;
281     ColorMapCombinedSliderSpinBox* _saturation_changer;
282     ColorMapCombinedSliderSpinBox* _gamma_changer;
283 private slots:
284     void update();
285
286 public:
287     ColorMapCubeHelixWidget();
288     ~ColorMapCubeHelixWidget();
289
290     void reset() override;
291     QVector<QColor> colorMap() const override;
292     QString reference() const override;
293     void parameters(int& n, float& hue, float& rotations,
294             float& saturation, float& gamma) const;
295 };
296
297 class ColorMapMorelandWidget : public ColorMapWidget
298 {
299 Q_OBJECT
300 private:
301     bool _update_lock;
302     QSpinBox* _n_spinbox;
303     QPushButton* _color0_button;
304     QPushButton* _color1_button;
305 private slots:
306     void chooseColor0();
307     void chooseColor1();
308     void update();
309
310 public:
311     ColorMapMorelandWidget();
312     ~ColorMapMorelandWidget();
313
314     void reset() override;
315     QVector<QColor> colorMap() const override;
316     QString reference() const override;
317     void parameters(int& n,
318             unsigned char& r0, unsigned char& g0, unsigned char& b0,
319             unsigned char& r1, unsigned char& g1, unsigned char& b1) const;
320 };
321
322 class ColorMapMcNamesWidget : public ColorMapWidget
323 {
324 Q_OBJECT
325 private:
326     bool _update_lock;
327     QSpinBox* _n_spinbox;
328     ColorMapCombinedSliderSpinBox* _periods_changer;
329 private slots:
330     void update();
331
332 public:
333     ColorMapMcNamesWidget();
334     ~ColorMapMcNamesWidget();
335
336     void reset() override;
337     QVector<QColor> colorMap() const override;
338     QString reference() const override;
339     void parameters(int& n, float& p) const;
340 };
341
342 #endif