summaryrefslogtreecommitdiff
path: root/src/pmview/colorscale.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmview/colorscale.cpp')
-rw-r--r--src/pmview/colorscale.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/pmview/colorscale.cpp b/src/pmview/colorscale.cpp
new file mode 100644
index 0000000..c90658d
--- /dev/null
+++ b/src/pmview/colorscale.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 1997 Silicon Graphics, Inc. All Rights Reserved.
+ * Copyright (c) 2009 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include "main.h"
+#include "colorscale.h"
+
+ColorStep::~ColorStep()
+{
+}
+
+ColorStep::ColorStep(SbColor col, float val)
+: _color(),
+ _min(val)
+{
+ _color.setValue(col.getValue());
+}
+
+ColorStep::ColorStep(float r, float g, float b, float val)
+: _color(),
+ _min(val)
+{
+ SbColor tmp(r, g, b);
+ _color.setValue(tmp.getValue());
+}
+
+ColorStep::ColorStep(uint32_t col, float val)
+: _color(),
+ _min(val)
+{
+ float dummy = 0.0;
+ _color.setPackedValue(col, dummy);
+}
+
+ColorStep::ColorStep(const ColorStep &rhs)
+: _color(),
+ _min(rhs._min)
+{
+ _color.setValue(rhs._color.getValue());
+}
+
+const ColorStep &
+ColorStep::operator=(const ColorStep &rhs)
+{
+ if (this != &rhs) {
+ _color.setValue(rhs._color.getValue());
+ _min = rhs._min;
+ }
+ return *this;
+}
+
+ColorScale::~ColorScale()
+{
+ int i;
+
+ for (i = 0; i < _colors.size(); i++)
+ delete _colors.takeAt(i);
+}
+
+ColorScale::ColorScale(const SbColor &col)
+: _colors()
+{
+ add(new ColorStep(col));
+}
+
+ColorScale::ColorScale(float r, float g, float b)
+: _colors()
+{
+ add(new ColorStep(r, g, b));
+}
+
+ColorScale::ColorScale(uint32_t col)
+: _colors()
+{
+ add(new ColorStep(col));
+}
+
+ColorScale::ColorScale(const ColorScale &rhs)
+: _colors()
+{
+ int i;
+
+ for (i = 0; i < rhs._colors.size(); i++)
+ add(new ColorStep(rhs[i]));
+}
+
+const ColorScale &
+ColorScale::operator=(const ColorScale &rhs)
+{
+ int i;
+
+ if (this != &rhs) {
+ for (i = 0; i < _colors.size(); i++)
+ delete _colors.takeAt(i);
+ for (i = 0; i < rhs._colors.size(); i++)
+ add(new ColorStep(rhs[i]));
+ }
+ return *this;
+}
+
+int
+ColorScale::add(ColorStep *ptr)
+{
+ if (_colors.size()) {
+ float prev = _colors.last()->min();
+ if (prev >= ptr->min()) {
+ warningMsg(_POS_,
+ "Color step (%f) was less than previous step (%f), skipping.",
+ ptr->min(), prev);
+ return -1;
+ }
+ }
+ _colors.append(ptr);
+
+ return 0;
+}
+
+const ColorStep &
+ColorScale::step(float value)
+{
+ int i = _colors.size();
+
+ while (i > 0 && _colors[i-1]->min() > value)
+ i--;
+
+ if (i == 0)
+ return *(_colors[0]);
+ return *(_colors[i-1]);
+}
+
+QTextStream&
+operator<<(QTextStream &os, const ColorScale &rhs)
+{
+ int i;
+
+ if (rhs._colors.size() > 0) {
+ os << '[' << rhs[0].min();
+ for (i = 1; i < rhs.numSteps(); i++)
+ os << ", " << rhs[i].min();
+ os << ']';
+ }
+ else {
+ os << "empty";
+ }
+
+ return os;
+}
+