Engauge Digitizer  2
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 "ColorFilterSettingsStrategyAbstractBase.h"
11 #include "ColorFilterSettingsStrategyForeground.h"
12 #include "ColorFilterSettingsStrategyHue.h"
13 #include "ColorFilterSettingsStrategyIntensity.h"
14 #include "ColorFilterSettingsStrategySaturation.h"
15 #include "ColorFilterSettingsStrategyValue.h"
16 #include "DocumentSerialize.h"
17 #include "EngaugeAssert.h"
18 #include "GridCoordDisable.h"
19 #include "Logger.h"
20 #include <QTextStream>
21 #include <QXmlStreamWriter>
22 #include "Xml.h"
23 
25  m_colorFilterMode (COLOR_FILTER_MODE_INTENSITY),
26  m_intensityLow (INTENSITY_LOW_DEFAULT),
27  m_intensityHigh (INTENSITY_HIGH_DEFAULT),
28  m_foregroundLow (FOREGROUND_LOW_DEFAULT),
29  m_foregroundHigh (FOREGROUND_HIGH_DEFAULT),
30  m_hueLow (HUE_LOW_DEFAULT),
31  m_hueHigh (HUE_HIGH_DEFAULT),
32  m_saturationLow (SATURATION_LOW_DEFAULT),
33  m_saturationHigh (SATURATION_HIGH_DEFAULT),
34  m_valueLow (VALUE_LOW_DEFAULT),
35  m_valueHigh (VALUE_HIGH_DEFAULT)
36 {
37  createStrategies ();
38 }
39 
41  int intensityLow,
42  int intensityHigh,
43  int foregroundLow,
44  int foregroundHigh,
45  int hueLow,
46  int hueHigh,
47  int saturationLow,
48  int saturationHigh,
49  int valueLow,
50  int valueHigh) :
51  m_colorFilterMode (colorFilterMode),
52  m_intensityLow (intensityLow),
53  m_intensityHigh (intensityHigh),
54  m_foregroundLow (foregroundLow),
55  m_foregroundHigh (foregroundHigh),
56  m_hueLow (hueLow),
57  m_hueHigh (hueHigh),
58  m_saturationLow (saturationLow),
59  m_saturationHigh (saturationHigh),
60  m_valueLow (valueLow),
61  m_valueHigh (valueHigh)
62 {
63  createStrategies ();
64 }
65 
67  m_colorFilterMode (other.colorFilterMode()),
68  m_intensityLow (other.intensityLow()),
69  m_intensityHigh (other.intensityHigh()),
70  m_foregroundLow (other.foregroundLow()),
71  m_foregroundHigh (other.foregroundHigh()),
72  m_hueLow (other.hueLow()),
73  m_hueHigh (other.hueHigh()),
74  m_saturationLow (other.saturationLow()),
75  m_saturationHigh (other.saturationHigh()),
76  m_valueLow (other.valueLow()),
77  m_valueHigh (other.valueHigh())
78 {
79  createStrategies ();
80 }
81 
83 {
84  loadXml(reader);
85  createStrategies ();
86 }
87 
89 {
90  m_colorFilterMode = other.colorFilterMode();
91  m_intensityLow = other.intensityLow();
92  m_intensityHigh = other.intensityHigh();
93  m_foregroundLow = other.foregroundLow();
94  m_foregroundHigh = other.foregroundHigh();
95  m_hueLow = other.hueLow();
96  m_hueHigh = other.hueHigh();
97  m_saturationLow = other.saturationLow();
98  m_saturationHigh = other.saturationHigh();
99  m_valueLow = other.valueLow();
100  m_valueHigh = other.valueHigh();
101 
102  createStrategies ();
103 
104  return *this;
105 }
106 
108 {
109  return m_colorFilterMode;
110 }
111 
112 void ColorFilterSettings::createStrategies ()
113 {
114  m_strategies [COLOR_FILTER_MODE_FOREGROUND] = new ColorFilterSettingsStrategyForeground ();
115  m_strategies [COLOR_FILTER_MODE_HUE ] = new ColorFilterSettingsStrategyHue ();
116  m_strategies [COLOR_FILTER_MODE_INTENSITY ] = new ColorFilterSettingsStrategyIntensity ();
117  m_strategies [COLOR_FILTER_MODE_SATURATION] = new ColorFilterSettingsStrategySaturation ();
118  m_strategies [COLOR_FILTER_MODE_VALUE ] = new ColorFilterSettingsStrategyValue ();
119 }
120 
122 {
123  return ColorFilterSettings ();
124 }
125 
127 {
128  return m_foregroundHigh;
129 }
130 
132 {
133  return m_foregroundLow;
134 }
135 
137 {
138  if (m_strategies.contains (m_colorFilterMode)) {
139 
140  // Ignore false positive cmake compiler warning about -Wreturn-stack-address in next line (bug #26396)
141  const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
142  return strategy->high (*this);
143  } else {
144  ENGAUGE_ASSERT (false);
145  return m_strategies [COLOR_FILTER_MODE_INTENSITY]->high (*this);
146  }
147 }
148 
150 {
151  return m_hueHigh;
152 }
153 
155 {
156  return m_hueLow;
157 }
158 
160 {
161  return m_intensityHigh;
162 }
163 
165 {
166  return m_intensityLow;
167 }
168 
169 void ColorFilterSettings::loadXml(QXmlStreamReader &reader)
170 {
171  LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::loadXml";
172 
173  bool success = true;
174 
175  QXmlStreamAttributes attributes = reader.attributes();
176 
177  if (attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE) &&
178  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW) &&
179  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH) &&
180  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW) &&
181  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH) &&
182  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW) &&
183  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH) &&
184  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW) &&
185  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH) &&
186  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW) &&
187  attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH)) {
188 
189  setColorFilterMode ((ColorFilterMode) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE).toInt());
190  setIntensityLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW).toInt());
191  setIntensityHigh ((GridCoordDisable) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH).toInt());
192  setForegroundLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW).toInt());
193  setForegroundHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH).toInt());
194  setHueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW).toInt());
195  setHueHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH).toInt());
196  setSaturationLow ((GridCoordDisable) attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW).toInt());
197  setSaturationHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH).toInt());
198  setValueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW).toInt());
199  setValueHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH).toInt());
200 
201  // Read until end of this subtree
202  while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
203  (reader.name() != DOCUMENT_SERIALIZE_COLOR_FILTER)){
204  loadNextFromReader(reader);
205 
206  if (reader.atEnd()) {
207  success = false;
208  break;
209  }
210  }
211  }
212 
213  if (!success) {
214  reader.raiseError (QObject::tr ("Cannot read curve filter data"));
215  }
216 }
217 
219 {
220  if (m_strategies.contains (m_colorFilterMode)) {
221  const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
222  return strategy->low (*this);
223  } else {
224  ENGAUGE_ASSERT (false);
225  return m_strategies [COLOR_FILTER_MODE_INTENSITY]->low (*this);
226  }
227 }
228 
229 void ColorFilterSettings::printStream (QString indentation,
230  QTextStream &str) const
231 {
232  str << indentation << "ColorFilterSettings\n";
233 
234  indentation += INDENTATION_DELTA;
235 
236  if (m_strategies.contains (m_colorFilterMode)) {
237  const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
238  return strategy->printStream (*this,
239  indentation,
240  str);
241  }
242 }
243 
245 {
246  return m_saturationHigh;
247 }
248 
250 {
251  return m_saturationLow;
252 }
253 
254 void ColorFilterSettings::saveXml(QXmlStreamWriter &writer,
255  const QString &curveName) const
256 {
257  LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::saveXml";
258 
259  writer.writeStartElement(DOCUMENT_SERIALIZE_COLOR_FILTER);
260  writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, curveName);
261  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE, QString::number (m_colorFilterMode));
262  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE_STRING, colorFilterModeToString (m_colorFilterMode));
263  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW, QString::number (m_intensityLow));
264  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH, QString::number (m_intensityHigh));
265  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW, QString::number (m_foregroundLow));
266  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH, QString::number (m_foregroundHigh));
267  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW, QString::number (m_hueLow));
268  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH, QString::number (m_hueHigh));
269  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW, QString::number (m_saturationLow));
270  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH, QString::number (m_saturationHigh));
271  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW, QString::number (m_valueLow));
272  writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH, QString::number (m_valueHigh));
273  writer.writeEndElement();
274 }
275 
277 {
278  m_colorFilterMode = colorFilterMode;
279 }
280 
282 {
283  ENGAUGE_ASSERT (FOREGROUND_MIN <= foregroundHigh && foregroundHigh <= FOREGROUND_MAX);
284  m_foregroundHigh = foregroundHigh;
285 }
286 
288 {
289  ENGAUGE_ASSERT (FOREGROUND_MIN <= foregroundLow && foregroundLow <= FOREGROUND_MAX);
290  m_foregroundLow = foregroundLow;
291 }
292 
293 void ColorFilterSettings::setHigh (double s0To1)
294 {
295  if (m_strategies.contains (m_colorFilterMode)) {
296  ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies [m_colorFilterMode];
297  return strategy->setHigh (*this,
298  s0To1);
299  } else {
300  ENGAUGE_ASSERT (false);
301  }
302 }
303 
305 {
306  ENGAUGE_ASSERT (HUE_MIN <= hueHigh && hueHigh <= HUE_MAX);
307  m_hueHigh = hueHigh;
308 }
309 
311 {
312  ENGAUGE_ASSERT (HUE_MIN <= hueLow && hueLow <= HUE_MAX);
313  m_hueLow = hueLow;
314 }
315 
317 {
318  ENGAUGE_ASSERT (INTENSITY_MIN <= intensityHigh && intensityHigh <= INTENSITY_MAX);
319  m_intensityHigh = intensityHigh;
320 }
321 
323 {
324  ENGAUGE_ASSERT (INTENSITY_MIN <= intensityLow && intensityLow <= INTENSITY_MAX);
325  m_intensityLow = intensityLow;
326 }
327 
328 void ColorFilterSettings::setLow (double s0To1)
329 {
330  if (m_strategies.contains (m_colorFilterMode)) {
331  ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies [m_colorFilterMode];
332  return strategy->setLow (*this,
333  s0To1);
334  } else {
335  ENGAUGE_ASSERT (false);
336  }
337 }
338 
340 {
341  ENGAUGE_ASSERT (SATURATION_MIN <= saturationHigh && saturationHigh <= SATURATION_MAX);
342  m_saturationHigh = saturationHigh;
343 }
344 
346 {
347  ENGAUGE_ASSERT (SATURATION_MIN <= saturationLow && saturationLow <= SATURATION_MAX);
348  m_saturationLow = saturationLow;
349 }
350 
352 {
353  ENGAUGE_ASSERT (VALUE_MIN <= valueHigh && valueHigh <= VALUE_MAX);
354  m_valueHigh = valueHigh;
355 }
356 
358 {
359  ENGAUGE_ASSERT (VALUE_MIN <= valueLow && valueLow <= VALUE_MAX);
360  m_valueLow = valueLow;
361 }
362 
364 {
365  return m_valueHigh;
366 }
367 
369 {
370  return m_valueLow;
371 }
void setSaturationLow(int saturationLow)
Set method for saturation low.
void setLow(double s0To1)
Set the low value for the current filter mode.
int valueHigh() const
Get method for value high.
void setHueLow(int hueLow)
Set method for hue lower bound.
Leaf class for hue strategy for ColorFilterSettings.
Color filter parameters for one curve. For a class, this is handled the same as LineStyle and PointSt...
int hueHigh() const
Get method for hue higher bound.
Leaf class for saturation strategy for ColorFilterSettings.
void setColorFilterMode(ColorFilterMode colorFilterMode)
Set method for filter mode.
int foregroundLow() const
Get method for foreground lower bound.
Base class for strategy pattern whose subclasses process the different color filter settings modes (o...
virtual void printStream(const ColorFilterSettings &colorFilterSettings, QString indentation, QTextStream &str) const =0
Print the low and high values.
double high() const
High value of foreground, hue, intensity, saturation or value according to current filter mode...
ColorFilterSettings & operator=(const ColorFilterSettings &other)
Assignment operator.
void setForegroundLow(int foregroundLow)
Set method for foreground lower bound.
double low() const
Low value of foreground, hue, intensity, saturation or value according to current filter mode...
void setHigh(double s0To1)
Set the high value for the current filter mode.
virtual void setHigh(ColorFilterSettings &colorFilterSettings, double s0To1)=0
Set the high value given the normalized value.
virtual void setLow(ColorFilterSettings &colorFilterSettings, double s0To1)=0
Set the low value given the normalized value.
void setHueHigh(int hueHigh)
Set method for hue higher bound.
void printStream(QString indentation, QTextStream &str) const
Debugging method that supports print method of this class and printStream method of some other class(...
void setForegroundHigh(int foregroundHigh)
Set method for foreground higher bound.
Leaf class for value strategy for ColorFilterSettings.
int foregroundHigh() const
Get method for foreground higher bound.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
int intensityHigh() const
Get method for intensity higher bound.
void setIntensityHigh(int intensityHigh)
Set method for intensity higher bound.
int intensityLow() const
Get method for intensity lower bound.
Leaf class for intensity strategy for ColorFilterSettings.
int saturationHigh() const
Get method for saturation higher bound.
void setValueHigh(int valueHigh)
Set method for value high.
void setIntensityLow(int intensityLow)
Set method for intensity lower bound.
int valueLow() const
Get method for value low.
void setValueLow(int valueLow)
Set method for value low.
virtual double high(const ColorFilterSettings &colorFilterSettings) const =0
Return the high value normalized to 0 to 1.
ColorFilterMode colorFilterMode() const
Get method for filter mode.
void setSaturationHigh(int saturationHigh)
Set method for saturation high.
void loadXml(QXmlStreamReader &reader)
Load curve filter to stream.
Leaf class for foreground strategy for ColorFilterSettings.
void saveXml(QXmlStreamWriter &writer, const QString &curveName) const
Save curve filter to stream.
ColorFilterSettings()
Default constructor only for use when this class is being stored by a container that requires the def...
int hueLow() const
Get method for hue lower bound.
virtual double low(const ColorFilterSettings &colorFilterSettings) const =0
Return the low value normalized to 0 to 1.
int saturationLow() const
Get method for saturation lower bound.