diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-16 17:31:04 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-16 17:53:40 +0200 |
commit | 6200fa9bb156ad02e7c6055c8dbd92f8c9a10759 (patch) | |
tree | 0f770a8c4800fffc30c69c0a4b010bf77e0dd51d /spline-widget/spline.cpp | |
parent | 7868302f5611606883e5eddd640ee806bf192481 (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.cpp | 17 |
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; |