Engauge Digitizer  2
 All Classes Files Functions Variables Enumerations Enumerator Friends Pages
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 
33 ColorFilterSettings::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 
95 ColorFilterMode ColorFilterSettings::colorFilterMode() const
96 {
97  return m_colorFilterMode;
98 }
99 
101 {
102  return ColorFilterSettings ();
103 }
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 
166 void 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 
246 void 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 
294 void 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 
316 void ColorFilterSettings::setColorFilterMode(ColorFilterMode colorFilterMode)
317 {
318  m_colorFilterMode = colorFilterMode;
319 }
320 
321 void ColorFilterSettings::setForegroundHigh (int foregroundHigh)
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 
333 void ColorFilterSettings::setHigh (double s0To1)
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 
385 void ColorFilterSettings::setLow (double s0To1)
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 
413 void ColorFilterSettings::setSaturationHigh (int saturationHigh)
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 }
void setSaturationLow(int saturationLow)
Set method for saturation low.
void setLow(double s0To1)
Set the low value for the current filter mode.
void setHueLow(int hueLow)
Set method for hue lower bound.
int saturationLow() const
Get method for saturation lower bound.
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
void setColorFilterMode(ColorFilterMode colorFilterMode)
Set method for filter mode.
int hueLow() const
Get method for hue lower bound.
int foregroundHigh() const
Get method for foreground higher bound.
int hueHigh() const
Get method for hue higher bound.
int saturationHigh() const
Get method for saturation higher bound.
ColorFilterSettings & operator=(const ColorFilterSettings &other)
Assignment operator.
void setForegroundLow(int foregroundLow)
Set method for foreground lower bound.
void setHigh(double s0To1)
Set the high value for the current filter mode.
int foregroundLow() const
Get method for foreground lower bound.
void setHueHigh(int hueHigh)
Set method for hue higher bound.
ColorFilterMode colorFilterMode() const
Get method for filter mode.
int valueLow() const
Get method for value low.
void setForegroundHigh(int foregroundHigh)
Set method for foreground higher bound.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
void setIntensityHigh(int intensityHigh)
Set method for intensity higher bound.
int intensityHigh() const
Get method for intensity higher bound.
void setValueHigh(int valueHigh)
Set method for value high.
void setIntensityLow(int intensityLow)
Set method for intensity lower bound.
int valueHigh() const
Get method for value high.
double low() const
Low value of foreground, hue, intensity, saturation or value according to current filter mode...
void setValueLow(int valueLow)
Set method for value low.
void setSaturationHigh(int saturationHigh)
Set method for saturation high.
void loadXml(QXmlStreamReader &reader)
Load curve filter to stream.
double high() const
High value of foreground, hue, intensity, saturation or value according to current filter mode...
ColorFilterSettings()
Default constructor only for use when this class is being stored by a container that requires the def...
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
int intensityLow() const
Get method for intensity lower bound.