Engauge Digitizer 2
Loading...
Searching...
No Matches
ColorFilterSettings.cpp
1/******************************************************************************************************
2 * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
7#include "CmdMediator.h"
8#include "ColorConstants.h"
9#include "ColorFilterSettings.h"
10#include "DocumentSerialize.h"
11#include "EngaugeAssert.h"
12#include "GridCoordDisable.h"
13#include "Logger.h"
14#include <QTextStream>
15#include <QXmlStreamWriter>
16#include "Xml.h"
17
19 m_colorFilterMode (COLOR_FILTER_MODE_INTENSITY),
20 m_intensityLow (INTENSITY_LOW_DEFAULT),
21 m_intensityHigh (INTENSITY_HIGH_DEFAULT),
22 m_foregroundLow (FOREGROUND_LOW_DEFAULT),
23 m_foregroundHigh (FOREGROUND_HIGH_DEFAULT),
24 m_hueLow (HUE_LOW_DEFAULT),
25 m_hueHigh (HUE_HIGH_DEFAULT),
26 m_saturationLow (SATURATION_LOW_DEFAULT),
27 m_saturationHigh (SATURATION_HIGH_DEFAULT),
28 m_valueLow (VALUE_LOW_DEFAULT),
29 m_valueHigh (VALUE_HIGH_DEFAULT)
30{
31}
32
33ColorFilterSettings::ColorFilterSettings(ColorFilterMode colorFilterMode,
34 int intensityLow,
35 int intensityHigh,
36 int foregroundLow,
37 int foregroundHigh,
38 int hueLow,
39 int hueHigh,
40 int saturationLow,
41 int saturationHigh,
42 int valueLow,
43 int valueHigh) :
44 m_colorFilterMode (colorFilterMode),
45 m_intensityLow (intensityLow),
46 m_intensityHigh (intensityHigh),
47 m_foregroundLow (foregroundLow),
48 m_foregroundHigh (foregroundHigh),
49 m_hueLow (hueLow),
50 m_hueHigh (hueHigh),
51 m_saturationLow (saturationLow),
52 m_saturationHigh (saturationHigh),
53 m_valueLow (valueLow),
54 m_valueHigh (valueHigh)
55{
56}
57
59 m_colorFilterMode (other.colorFilterMode()),
60 m_intensityLow (other.intensityLow()),
61 m_intensityHigh (other.intensityHigh()),
62 m_foregroundLow (other.foregroundLow()),
63 m_foregroundHigh (other.foregroundHigh()),
64 m_hueLow (other.hueLow()),
65 m_hueHigh (other.hueHigh()),
66 m_saturationLow (other.saturationLow()),
67 m_saturationHigh (other.saturationHigh()),
68 m_valueLow (other.valueLow()),
69 m_valueHigh (other.valueHigh())
70{
71}
72
74{
75 loadXml(reader);
76}
77
79{
80 m_colorFilterMode = other.colorFilterMode();
81 m_intensityLow = other.intensityLow();
82 m_intensityHigh = other.intensityHigh();
83 m_foregroundLow = other.foregroundLow();
84 m_foregroundHigh = other.foregroundHigh();
85 m_hueLow = other.hueLow();
86 m_hueHigh = other.hueHigh();
87 m_saturationLow = other.saturationLow();
88 m_saturationHigh = other.saturationHigh();
89 m_valueLow = other.valueLow();
90 m_valueHigh = other.valueHigh();
91
92 return *this;
93}
94
96{
97 return m_colorFilterMode;
98}
99
104
106{
107 return m_foregroundHigh;
108}
109
111{
112 return m_foregroundLow;
113}
114
116{
117 switch (m_colorFilterMode)
118 {
119 case COLOR_FILTER_MODE_FOREGROUND:
120 return (double) (m_foregroundHigh - FOREGROUND_MIN) /
121 (double) (FOREGROUND_MAX - FOREGROUND_MIN);
122
123 case COLOR_FILTER_MODE_HUE:
124 return (double) (m_hueHigh - HUE_MIN) /
125 ((double) HUE_MAX - HUE_MIN);
126
127 case COLOR_FILTER_MODE_INTENSITY:
128 return (double) (m_intensityHigh - INTENSITY_MIN) /
129 (double) (INTENSITY_MAX - INTENSITY_MIN);
130
131 case COLOR_FILTER_MODE_SATURATION:
132 return (double) (m_saturationHigh - SATURATION_MIN) /
133 (double) (SATURATION_MAX - SATURATION_MIN);
134
135 case COLOR_FILTER_MODE_VALUE:
136 return (double) (m_valueHigh - VALUE_MIN) /
137 (double) (VALUE_MAX - VALUE_MIN);
138
139 default:
140 ENGAUGE_ASSERT (false);
141 return (double) (m_intensityHigh - INTENSITY_MIN) /
142 (double) (INTENSITY_MAX - INTENSITY_MIN); // Default when asserts are disabled
143 }
144}
145
147{
148 return m_hueHigh;
149}
150
152{
153 return m_hueLow;
154}
155
157{
158 return m_intensityHigh;
159}
160
162{
163 return m_intensityLow;
164}
165
166void ColorFilterSettings::loadXml(QXmlStreamReader &reader)
167{
168 LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::loadXml";
169
170 bool success = true;
171
172 QXmlStreamAttributes attributes = reader.attributes();
173
174 if (attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE) &&
175 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW) &&
176 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH) &&
177 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW) &&
178 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH) &&
179 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW) &&
180 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH) &&
181 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW) &&
182 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH) &&
183 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW) &&
184 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH)) {
185
186 setColorFilterMode ((ColorFilterMode) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE).toInt());
187 setIntensityLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW).toInt());
188 setIntensityHigh ((GridCoordDisable) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH).toInt());
189 setForegroundLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW).toInt());
190 setForegroundHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH).toInt());
191 setHueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW).toInt());
192 setHueHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH).toInt());
193 setSaturationLow ((GridCoordDisable) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW).toInt());
194 setSaturationHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH).toInt());
195 setValueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW).toInt());
196 setValueHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH).toInt());
197
198 // Read until end of this subtree
199 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
200 (reader.name() != DOCUMENT_SERIALIZE_COLOR_FILTER)){
201 loadNextFromReader(reader);
202
203 if (reader.atEnd()) {
204 success = false;
205 break;
206 }
207 }
208 }
209
210 if (!success) {
211 reader.raiseError (QObject::tr ("Cannot read curve filter data"));
212 }
213}
214
216{
217 switch (m_colorFilterMode)
218 {
219 case COLOR_FILTER_MODE_FOREGROUND:
220 return (double) (m_foregroundLow - FOREGROUND_MIN) /
221 (double) (FOREGROUND_MAX - FOREGROUND_MIN);
222
223 case COLOR_FILTER_MODE_HUE:
224 return (double) (m_hueLow - HUE_MIN) /
225 ((double) HUE_MAX - HUE_MIN);
226
227 case COLOR_FILTER_MODE_INTENSITY:
228 return (double) (m_intensityLow - INTENSITY_MIN) /
229 (double) (INTENSITY_MAX - INTENSITY_MIN);
230
231 case COLOR_FILTER_MODE_SATURATION:
232 return (double) (m_saturationLow - SATURATION_MIN) /
233 (double) (SATURATION_MAX - SATURATION_MIN);
234
235 case COLOR_FILTER_MODE_VALUE:
236 return (double) (m_valueLow - VALUE_MIN) /
237 (double) (VALUE_MAX - VALUE_MIN);
238
239 default:
240 ENGAUGE_ASSERT (false);
241 return (double) (m_intensityLow - INTENSITY_MIN) /
242 (double) (INTENSITY_MAX - INTENSITY_MIN); // Default when asserts are disabled
243 }
244}
245
246void ColorFilterSettings::printStream (QString indentation,
247 QTextStream &str) const
248{
249 str << indentation << "ColorFilterSettings\n";
250
251 indentation += INDENTATION_DELTA;
252
253 switch (m_colorFilterMode) {
254 case COLOR_FILTER_MODE_INTENSITY:
255 str << indentation << "intensityLow=" << m_intensityLow << "\n";
256 str << indentation << "intensityHigh=" << m_intensityHigh << "\n";
257 break;
258
259 case COLOR_FILTER_MODE_FOREGROUND:
260 str << indentation << "foregroundLow=" << m_foregroundLow << "\n";
261 str << indentation << "foregroundHigh=" << m_foregroundHigh << "\n";
262 break;
263
264 case COLOR_FILTER_MODE_HUE:
265 str << indentation << "hueLow=" << m_hueLow << "\n";
266 str << indentation << "hueHigh=" << m_hueHigh << "\n";
267 break;
268
269 case COLOR_FILTER_MODE_SATURATION:
270 str << indentation << "saturationLow" << m_saturationLow << "\n";
271 str << indentation << "saturationHigh" << m_saturationHigh << "\n";
272 break;
273
274 case COLOR_FILTER_MODE_VALUE:
275 str << indentation << "valueLow=" << m_valueLow << "\n";
276 str << indentation << "valueHigh=" << m_valueHigh << "\n";
277 break;
278
279 default:
280 break;
281 }
282}
283
285{
286 return m_saturationHigh;
287}
288
290{
291 return m_saturationLow;
292}
293
294void ColorFilterSettings::saveXml(QXmlStreamWriter &writer,
295 const QString &curveName) const
296{
297 LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::saveXml";
298
299 writer.writeStartElement(DOCUMENT_SERIALIZE_COLOR_FILTER);
300 writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, curveName);
301 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE, QString::number (m_colorFilterMode));
302 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE_STRING, colorFilterModeToString (m_colorFilterMode));
303 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW, QString::number (m_intensityLow));
304 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH, QString::number (m_intensityHigh));
305 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW, QString::number (m_foregroundLow));
306 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH, QString::number (m_foregroundHigh));
307 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW, QString::number (m_hueLow));
308 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH, QString::number (m_hueHigh));
309 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW, QString::number (m_saturationLow));
310 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH, QString::number (m_saturationHigh));
311 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW, QString::number (m_valueLow));
312 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH, QString::number (m_valueHigh));
313 writer.writeEndElement();
314}
315
316void ColorFilterSettings::setColorFilterMode(ColorFilterMode colorFilterMode)
317{
318 m_colorFilterMode = colorFilterMode;
319}
320
322{
323 ENGAUGE_ASSERT (FOREGROUND_MIN <= foregroundHigh && foregroundHigh <= FOREGROUND_MAX);
324 m_foregroundHigh = foregroundHigh;
325}
326
328{
329 ENGAUGE_ASSERT (FOREGROUND_MIN <= foregroundLow && foregroundLow <= FOREGROUND_MAX);
330 m_foregroundLow = foregroundLow;
331}
332
334{
335 switch (m_colorFilterMode) {
336 case COLOR_FILTER_MODE_FOREGROUND:
337 setForegroundHigh (FOREGROUND_MIN + s0To1 * (FOREGROUND_MAX - FOREGROUND_MIN));
338 break;
339
340 case COLOR_FILTER_MODE_HUE:
341 setHueHigh (HUE_MIN + s0To1 * (HUE_MAX - HUE_MIN));
342 break;
343
344 case COLOR_FILTER_MODE_INTENSITY:
345 setIntensityHigh (INTENSITY_MIN + s0To1 * (INTENSITY_MAX - INTENSITY_MIN));
346 break;
347
348 case COLOR_FILTER_MODE_SATURATION:
349 setSaturationHigh (SATURATION_MIN + s0To1 * (SATURATION_MAX - SATURATION_MIN));
350 break;
351
352 case COLOR_FILTER_MODE_VALUE:
353 setValueHigh (VALUE_MIN + s0To1 * (VALUE_MAX - VALUE_MIN));
354 break;
355
356 default:
357 ENGAUGE_ASSERT (false);
358 }
359}
360
362{
363 ENGAUGE_ASSERT (HUE_MIN <= hueHigh && hueHigh <= HUE_MAX);
364 m_hueHigh = hueHigh;
365}
366
368{
369 ENGAUGE_ASSERT (HUE_MIN <= hueLow && hueLow <= HUE_MAX);
370 m_hueLow = hueLow;
371}
372
374{
375 ENGAUGE_ASSERT (INTENSITY_MIN <= intensityHigh && intensityHigh <= INTENSITY_MAX);
376 m_intensityHigh = intensityHigh;
377}
378
380{
381 ENGAUGE_ASSERT (INTENSITY_MIN <= intensityLow && intensityLow <= INTENSITY_MAX);
382 m_intensityLow = intensityLow;
383}
384
386{
387 switch (m_colorFilterMode) {
388 case COLOR_FILTER_MODE_FOREGROUND:
389 setForegroundLow (FOREGROUND_MIN + s0To1 * (FOREGROUND_MAX - FOREGROUND_MIN));
390 break;
391
392 case COLOR_FILTER_MODE_HUE:
393 setHueLow (HUE_MIN + s0To1 * (HUE_MAX - HUE_MIN));
394 break;
395
396 case COLOR_FILTER_MODE_INTENSITY:
397 setIntensityLow (INTENSITY_MIN + s0To1 * (INTENSITY_MAX - INTENSITY_MIN));
398 break;
399
400 case COLOR_FILTER_MODE_SATURATION:
401 setSaturationLow (SATURATION_MIN + s0To1 * (SATURATION_MAX - SATURATION_MIN));
402 break;
403
404 case COLOR_FILTER_MODE_VALUE:
405 setValueLow (VALUE_MIN + s0To1 * (VALUE_MAX - VALUE_MIN));
406 break;
407
408 default:
409 ENGAUGE_ASSERT (false);
410 }
411}
412
414{
415 ENGAUGE_ASSERT (SATURATION_MIN <= saturationHigh && saturationHigh <= SATURATION_MAX);
416 m_saturationHigh = saturationHigh;
417}
418
420{
421 ENGAUGE_ASSERT (SATURATION_MIN <= saturationLow && saturationLow <= SATURATION_MAX);
422 m_saturationLow = saturationLow;
423}
424
426{
427 ENGAUGE_ASSERT (VALUE_MIN <= valueHigh && valueHigh <= VALUE_MAX);
428 m_valueHigh = valueHigh;
429}
430
432{
433 ENGAUGE_ASSERT (VALUE_MIN <= valueLow && valueLow <= VALUE_MAX);
434 m_valueLow = valueLow;
435}
436
438{
439 return m_valueHigh;
440}
441
443{
444 return m_valueLow;
445}
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
int foregroundLow() const
Get method for foreground lower bound.
void setIntensityLow(int intensityLow)
Set method for intensity lower bound.
void setForegroundLow(int foregroundLow)
Set method for foreground lower bound.
int saturationLow() const
Get method for saturation lower bound.
ColorFilterSettings()
Default constructor only for use when this class is being stored by a container that requires the def...
void setValueLow(int valueLow)
Set method for value low.
void setValueHigh(int valueHigh)
Set method for value high.
void setSaturationLow(int saturationLow)
Set method for saturation low.
double low() const
Low value of foreground, hue, intensity, saturation or value according to current filter mode,...
void setHueLow(int hueLow)
Set method for hue lower bound.
int intensityHigh() const
Get method for intensity higher bound.
void setHigh(double s0To1)
Set the high value for the current filter mode.
ColorFilterSettings & operator=(const ColorFilterSettings &other)
Assignment operator.
int saturationHigh() const
Get method for saturation higher bound.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
void setColorFilterMode(ColorFilterMode colorFilterMode)
Set method for filter mode.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
ColorFilterMode colorFilterMode() const
Get method for filter mode.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
int valueLow() const
Get method for value low.
void setForegroundHigh(int foregroundHigh)
Set method for foreground higher bound.
void loadXml(QXmlStreamReader &reader)
Load curve filter to stream.
int hueHigh() const
Get method for hue higher bound.
double high() const
High value of foreground, hue, intensity, saturation or value according to current filter mode,...
int foregroundHigh() const
Get method for foreground higher bound.
void setLow(double s0To1)
Set the low value for the current filter mode.
void setIntensityHigh(int intensityHigh)
Set method for intensity higher bound.
int intensityLow() const
Get method for intensity lower bound.
void setSaturationHigh(int saturationHigh)
Set method for saturation high.
void setHueHigh(int hueHigh)
Set method for hue higher bound.
int hueLow() const
Get method for hue lower bound.
int valueHigh() const
Get method for value high.