Engauge Digitizer 2
Loading...
Searching...
No Matches
ColorFilterSettings.cpp
Go to the documentation of this file.
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"
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,
45 int hueLow,
46 int hueHigh,
47 int saturationLow,
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 qDeleteAll (m_strategies);
110}
111
113{
114 return m_colorFilterMode;
115}
116
117void ColorFilterSettings::createStrategies ()
118{
119 qDeleteAll (m_strategies); // Prevent memory leak from one constructor calling another
120
126}
127
132
134{
135 return m_foregroundHigh;
136}
137
139{
140 return m_foregroundLow;
141}
142
144{
145 if (m_strategies.contains (m_colorFilterMode)) {
146
147 // Ignore false positive cmake compiler warning about -Wreturn-stack-address in next line (bug #26396)
148 const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
149 return strategy->high (*this);
150 } else {
151 LOG4CPP_ERROR_S ((*mainCat)) << "ColorFilterSettings::high is missing color filter mode";
152 ENGAUGE_ASSERT (false);
153 return m_strategies [COLOR_FILTER_MODE_INTENSITY]->high (*this);
154 }
155}
156
158{
159 return m_hueHigh;
160}
161
163{
164 return m_hueLow;
165}
166
168{
169 return m_intensityHigh;
170}
171
173{
174 return m_intensityLow;
175}
176
177void ColorFilterSettings::loadXml(QXmlStreamReader &reader)
178{
179 LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::loadXml";
180
181 bool success = true;
182
183 QXmlStreamAttributes attributes = reader.attributes();
184
185 if (attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE) &&
186 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW) &&
187 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH) &&
188 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW) &&
189 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH) &&
190 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW) &&
191 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH) &&
192 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW) &&
193 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH) &&
194 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW) &&
195 attributes.hasAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH)) {
196
197 setColorFilterMode (static_cast<ColorFilterMode> (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE).toInt()));
202 setHueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW).toInt());
203 setHueHigh (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH).toInt());
206 setValueLow (attributes.value(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW).toInt());
208
209 // Read until end of this subtree
210 while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
211 (reader.name() != DOCUMENT_SERIALIZE_COLOR_FILTER)){
212 loadNextFromReader(reader);
213
214 if (reader.atEnd()) {
215 success = false;
216 break;
217 }
218 }
219 }
220
221 if (!success) {
222 reader.raiseError (QObject::tr ("Cannot read curve filter data"));
223 }
224}
225
227{
228 if (m_strategies.contains (m_colorFilterMode)) {
229 const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
230 return strategy->low (*this);
231 } else {
232 LOG4CPP_ERROR_S ((*mainCat)) << "ColorFilterSettings::low is missing color filter mode";
233 ENGAUGE_ASSERT (false);
234 return m_strategies [COLOR_FILTER_MODE_INTENSITY]->low (*this);
235 }
236}
237
238void ColorFilterSettings::printStream (QString indentation,
239 QTextStream &str) const
240{
241 str << indentation << "ColorFilterSettings\n";
242
243 indentation += INDENTATION_DELTA;
244
245 if (m_strategies.contains (m_colorFilterMode)) {
246 const ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies.value (m_colorFilterMode);
247 return strategy->printStream (*this,
248 indentation,
249 str);
250 }
251}
252
254{
255 return m_saturationHigh;
256}
257
259{
260 return m_saturationLow;
261}
262
263void ColorFilterSettings::saveXml(QXmlStreamWriter &writer,
264 const QString &curveName) const
265{
266 LOG4CPP_INFO_S ((*mainCat)) << "ColorFilterSettings::saveXml";
267
268 writer.writeStartElement(DOCUMENT_SERIALIZE_COLOR_FILTER);
269 writer.writeAttribute(DOCUMENT_SERIALIZE_CURVE_NAME, curveName);
270 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE, QString::number (m_colorFilterMode));
271 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_MODE_STRING, colorFilterModeToString (m_colorFilterMode));
272 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW, QString::number (m_intensityLow));
273 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH, QString::number (m_intensityHigh));
274 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW, QString::number (m_foregroundLow));
275 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH, QString::number (m_foregroundHigh));
276 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW, QString::number (m_hueLow));
277 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH, QString::number (m_hueHigh));
278 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW, QString::number (m_saturationLow));
279 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH, QString::number (m_saturationHigh));
280 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW, QString::number (m_valueLow));
281 writer.writeAttribute(DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH, QString::number (m_valueHigh));
282 writer.writeEndElement();
283}
284
289
295
301
303{
304 if (m_strategies.contains (m_colorFilterMode)) {
305 ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies [m_colorFilterMode];
306 return strategy->setHigh (*this,
307 s0To1);
308 } else {
309 LOG4CPP_ERROR_S ((*mainCat)) << "ColorFilterSettings::setHigh is missing color filter mode";
310 ENGAUGE_ASSERT (false);
311 }
312}
313
315{
317 m_hueHigh = hueHigh;
318}
319
321{
323 m_hueLow = hueLow;
324}
325
331
337
339{
340 if (m_strategies.contains (m_colorFilterMode)) {
341 ColorFilterSettingsStrategyAbstractBase *strategy = m_strategies [m_colorFilterMode];
342 return strategy->setLow (*this,
343 s0To1);
344 } else {
345 LOG4CPP_ERROR_S ((*mainCat)) << "ColorFilterSettings::setLow is missing color filter mode";
346 ENGAUGE_ASSERT (false);
347 }
348}
349
355
361
367
373
375{
376 return m_valueHigh;
377}
378
380{
381 return m_valueLow;
382}
const int SATURATION_MAX
const int HUE_HIGH_DEFAULT
const int FOREGROUND_MAX
const int FOREGROUND_LOW_DEFAULT
const int SATURATION_HIGH_DEFAULT
const int HUE_MAX
const int SATURATION_MIN
const int VALUE_HIGH_DEFAULT
const int HUE_MIN
const int SATURATION_LOW_DEFAULT
const int INTENSITY_LOW_DEFAULT
const int INTENSITY_MAX
const int HUE_LOW_DEFAULT
const int FOREGROUND_MIN
const int FOREGROUND_HIGH_DEFAULT
const int VALUE_MAX
const int VALUE_MIN
const int INTENSITY_HIGH_DEFAULT
const int VALUE_LOW_DEFAULT
const int INTENSITY_MIN
Constants for use by CurveFilter and other curve-related classes.
QString colorFilterModeToString(ColorFilterMode colorFilterMode)
ColorFilterMode
@ COLOR_FILTER_MODE_FOREGROUND
@ COLOR_FILTER_MODE_VALUE
@ COLOR_FILTER_MODE_INTENSITY
@ COLOR_FILTER_MODE_SATURATION
@ COLOR_FILTER_MODE_HUE
const QString DOCUMENT_SERIALIZE_COLOR_FILTER
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_LOW
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_HIGH
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_VALUE_HIGH
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_LOW
const QString DOCUMENT_SERIALIZE_CURVE_NAME
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_HIGH
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_MODE_STRING
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_INTENSITY_HIGH
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_FOREGROUND_LOW
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_HIGH
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_MODE
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_HUE_LOW
const QString DOCUMENT_SERIALIZE_COLOR_FILTER_SATURATION_LOW
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
GridCoordDisable
log4cpp::Category * mainCat
Definition Logger.cpp:14
const QString INDENTATION_DELTA
QXmlStreamReader::TokenType loadNextFromReader(QXmlStreamReader &reader)
Load next token from xml reader.
Definition Xml.cpp:14
Base class for strategy pattern whose subclasses process the different color filter settings modes (o...
virtual double low(const ColorFilterSettings &colorFilterSettings) const =0
Return the low value normalized to 0 to 1.
virtual void setHigh(ColorFilterSettings &colorFilterSettings, double s0To1)=0
Set the high value given the normalized value.
virtual double high(const ColorFilterSettings &colorFilterSettings) const =0
Return the high value normalized to 0 to 1.
virtual void setLow(ColorFilterSettings &colorFilterSettings, double s0To1)=0
Set the low value given the normalized value.
virtual void printStream(const ColorFilterSettings &colorFilterSettings, QString indentation, QTextStream &str) const =0
Print the low and high values.
Leaf class for foreground strategy for ColorFilterSettings.
Leaf class for hue strategy for ColorFilterSettings.
Leaf class for intensity strategy for ColorFilterSettings.
Leaf class for saturation strategy for ColorFilterSettings.
Leaf class for value strategy for ColorFilterSettings.
int foregroundLow() const
Get method for foreground lower bound.
~ColorFilterSettings()
Destructor deallocates memory.
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.
#define LOG4CPP_INFO_S(logger)
Definition convenience.h:18
#define LOG4CPP_ERROR_S(logger)
Definition convenience.h:12