summaryrefslogtreecommitdiffhomepage
path: root/spline/spline.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'spline/spline.hpp')
-rw-r--r--spline/spline.hpp81
1 files changed, 35 insertions, 46 deletions
diff --git a/spline/spline.hpp b/spline/spline.hpp
index 3d2d6e57..a78db8dd 100644
--- a/spline/spline.hpp
+++ b/spline/spline.hpp
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, Stanislaw Halik <sthalik@misaki.pl>
+/* Copyright (c) 2012-2019, Stanislaw Halik <sthalik@misaki.pl>
* Permission to use, copy, modify, and/or distribute this
* software for any purpose with or without fee is hereby granted,
@@ -8,18 +8,15 @@
#pragma once
-#include "compat/copyable-mutex.hpp"
#include "options/options.hpp"
-
#include "axis-opts.hpp"
-
#include "export.hpp"
+#include "compat/mutex.hpp"
#include <cstddef>
#include <vector>
#include <limits>
#include <memory>
-#include <functional>
#include <QObject>
#include <QPointF>
@@ -28,6 +25,7 @@
namespace spline_detail {
+using points_t = QList<QPointF>;
using namespace options;
class OTR_SPLINE_EXPORT base_settings : public QObject
@@ -50,10 +48,10 @@ public:
struct OTR_SPLINE_EXPORT base_spline_
{
- virtual inline ~base_spline_();
+ virtual ~base_spline_();
- virtual float get_value(double x) = 0;
- virtual float get_value_no_save(double x) const = 0;
+ virtual double get_value(double x) const = 0;
+ virtual double get_value_no_save(double x) const = 0;
[[nodiscard]] virtual bool get_last_value(QPointF& point) = 0;
virtual void set_tracking_active(bool value) = 0;
@@ -61,20 +59,16 @@ struct OTR_SPLINE_EXPORT base_spline_
virtual double max_input() const = 0;
virtual double max_output() const = 0;
- using points_t = QList<QPointF>;
-
- virtual points_t const& get_points() const = 0;
+ virtual const points_t& get_points() const = 0;
virtual int get_point_count() const = 0;
};
struct OTR_SPLINE_EXPORT spline_settings_mixin
{
- using base_settings = spline_detail::base_settings;
+ virtual std::shared_ptr<base_settings> get_settings() = 0;
+ virtual std::shared_ptr<const base_settings> get_settings() const = 0;
- virtual std::shared_ptr<spline_detail::base_settings> get_settings() = 0;
- virtual std::shared_ptr<const spline_detail::base_settings> get_settings() const = 0;
-
- virtual inline ~spline_settings_mixin();
+ virtual ~spline_settings_mixin();
};
struct OTR_SPLINE_EXPORT spline_modify_mixin
@@ -85,42 +79,44 @@ struct OTR_SPLINE_EXPORT spline_modify_mixin
virtual void remove_point(int i) = 0;
virtual void clear() = 0;
- virtual inline ~spline_modify_mixin();
+ virtual ~spline_modify_mixin();
};
struct OTR_SPLINE_EXPORT base_spline : base_spline_, spline_modify_mixin, spline_settings_mixin
{
+ ~base_spline() override;
};
class OTR_SPLINE_EXPORT spline : public base_spline
{
+ using f = float;
+
double bucket_size_coefficient(const QList<QPointF>& points) const;
- void update_interp_data();
- float get_value_internal(int x);
- void add_lone_point();
- float get_value_no_save_internal(double x);
+ void update_interp_data() const;
+ double get_value_internal(int x) const;
static bool sort_fn(const QPointF& one, const QPointF& two);
- static QPointF ensure_in_bounds(const QList<QPointF>& points, int i);
+ static void ensure_in_bounds(const QList<QPointF>& points, int i, f& x, f& y);
static int element_count(const QList<QPointF>& points, double max_input);
void disconnect_signals();
+ void invalidate_settings_();
- std::shared_ptr<spline_detail::settings> s;
- QMetaObject::Connection conn_changed, conn_maxx, conn_maxy;
+ mutex mtx { mutex::Recursive };
+ std::shared_ptr<settings> s;
+ QMetaObject::Connection conn_points, conn_maxx, conn_maxy;
- static constexpr inline std::size_t value_count = 4096;
-
- std::vector<float> data = std::vector<float>(value_count, float(-16));
-
- mutex _mutex { mutex::recursive };
- QPointF last_input_value;
std::shared_ptr<QObject> ctx { std::make_shared<QObject>() };
- bool activep = false;
- bool validp = false;
+ mutable QPointF last_input_value{-1, -1};
+ mutable std::vector<float> data = std::vector<float>(value_count, magic_fill_value);
+ mutable points_t points;
+ mutable axis_opts::max_clamp clamp_x = axis_opts::x1000, clamp_y = axis_opts::x1000;
+ mutable bool activep = false;
- points_t points;
+ static constexpr unsigned value_count = 8192;
+ static constexpr float magic_fill_value = -(1 << 24) + 1;
+ static constexpr double c_interp = 5;
public:
void invalidate_settings();
@@ -136,11 +132,10 @@ public:
spline(const QString& name, const QString& axis_name, Axis axis);
~spline() override;
- spline& operator=(const spline&) = default;
spline(const spline&) = default;
- float get_value(double x) override;
- float get_value_no_save(double x) const override;
+ double get_value(double x) const override;
+ double get_value_no_save(double x) const override;
[[nodiscard]] bool get_last_value(QPointF& point) override;
void add_point(QPointF pt) override;
@@ -149,24 +144,18 @@ public:
void remove_point(int i) override;
void clear() override;
- points_t const& get_points() const override;
+ const points_t& get_points() const override;
void set_tracking_active(bool value) override;
bundle get_bundle();
- void ensure_valid(points_t& in_out);
+ void ensure_valid(points_t& in_out) const;
- std::shared_ptr<spline_detail::base_settings> get_settings() override;
- std::shared_ptr<const spline_detail::base_settings> get_settings() const override;
+ std::shared_ptr<base_settings> get_settings() override;
+ std::shared_ptr<const base_settings> get_settings() const override;
int get_point_count() const override;
-
- using settings = spline_detail::settings;
};
-inline base_spline_::~base_spline_() = default;
-inline spline_modify_mixin::~spline_modify_mixin() = default;
-inline spline_settings_mixin::~spline_settings_mixin() = default;
-
} // ns spline_detail
using spline = spline_detail::spline;