summaryrefslogtreecommitdiffhomepage
path: root/spline-widget/spline.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2016-09-16 17:31:04 +0200
committerStanislaw Halik <sthalik@misaki.pl>2016-09-16 17:53:40 +0200
commit6200fa9bb156ad02e7c6055c8dbd92f8c9a10759 (patch)
tree0f770a8c4800fffc30c69c0a4b010bf77e0dd51d /spline-widget/spline.cpp
parent7868302f5611606883e5eddd640ee806bf192481 (diff)
spline-widget: simplify/fix drawing logic
The linear things should be drawn in drawFunction() since they change only when some control point is moved and the spline is recalculated anyway. Introduce spline::get_value_no_save to avoid clobbering the tracked value. Draw linear helper before the spline to avoid occluding it. Remove some redundant checks for whether _config exists when all calling sites ensure it already. I still need to de-camel-case these two classes.
Diffstat (limited to 'spline-widget/spline.cpp')
-rw-r--r--spline-widget/spline.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/spline-widget/spline.cpp b/spline-widget/spline.cpp
index 2a118e69..125b266d 100644
--- a/spline-widget/spline.cpp
+++ b/spline-widget/spline.cpp
@@ -94,18 +94,27 @@ qreal spline::maxOutput() const
float spline::getValue(double x)
{
QMutexLocker foo(&_mutex);
+
+ const float ret = get_value_no_save(x);
+ last_input_value.setX(std::fabs(x));
+ last_input_value.setY(double(std::fabs(ret)));
+ return ret;
+}
+
+float spline::get_value_no_save(double x)
+{
+ QMutexLocker foo(&_mutex);
+
float q = float(x * precision(s->points));
int xi = (int)q;
float yi = getValueInternal(xi);
float yiplus1 = getValueInternal(xi+1);
float f = (q-xi);
float ret = yiplus1 * f + yi * (1.0f - f); // at least do a linear interpolation.
- last_input_value.setX(std::fabs(x));
- last_input_value.setY(double(std::fabs(ret)));
return ret;
}
-bool spline::getLastPoint(QPointF& point )
+bool spline::getLastPoint(QPointF& point)
{
QMutexLocker foo(&_mutex);
point = last_input_value;
@@ -115,7 +124,7 @@ bool spline::getLastPoint(QPointF& point )
float spline::getValueInternal(int x)
{
float sign = x < 0 ? -1 : 1;
- x = abs(x);
+ x = std::abs(x);
float ret;
ret = data[std::min(unsigned(x), unsigned(value_count)-1u)];
return ret * sign;