2#include <Curve/Envelope.hpp>
3#include <Curve/Segment/CurveSegmentModel.hpp>
6#include <score/serialization/VisitorInterface.hpp>
8#include <ossia/detail/flat_map.hpp>
21#include <score/model/Identifier.hpp>
25class PointArraySegment;
28CURVE_SEGMENT_METADATA(
29 SCORE_PLUGIN_CURVE_EXPORT, Curve::PointArraySegment,
30 "c598b840-db67-4c8f-937a-46cfac87cb59",
"PointArray",
"PointArray",
"hidden")
36class SegmentIdAllocator;
40using PointArraySamples = ossia::flat_map<double, double>;
44struct SCORE_PLUGIN_CURVE_EXPORT PointArraySegmentData
46 double min_x{}, max_x{};
47 double min_y{}, max_y{};
48 std::shared_ptr<const PointArraySamples> points;
50 bool operator==(
const PointArraySegmentData& other)
const noexcept;
56class SCORE_PLUGIN_CURVE_EXPORT PointArraySegment final :
public SegmentModel
58 W_OBJECT(PointArraySegment)
60 MODEL_METADATA_IMPL(PointArraySegment)
62 using data_type = PointArraySegmentData;
64 PointArraySegment(
const SegmentData& dat, QObject* parent);
66 PointArraySegment(
const PointArraySegment& other,
const id_type&
id, QObject* parent);
71 ~PointArraySegment()
override;
73 void on_startChanged()
override;
74 void on_endChanged()
override;
77 void updateData(
int numInterp)
const override;
81 void envelope(
double x0,
double x1,
int columns, std::vector<QPointF>& out)
const;
84 std::size_t samplesBetween(
double x0,
double x1)
const noexcept;
89 double x0,
double width,
int columns, std::vector<QLineF>& out)
const;
90 double valueAt(
double x)
const override;
92 void addPoint(
double,
double);
93 void addPointUnscaled(
double,
double);
94 void simplify(
double ratio);
95 std::vector<SegmentData> toLinearSegments()
const;
96 std::vector<SegmentData> toPowerSegments()
const;
98 double min() {
return min_y; }
99 double max() {
return max_y; }
101 void setMinX(
double y) { min_x = y; }
102 void setMinY(
double y) { min_y = y; }
103 void setMaxX(
double y) { max_x = y; }
104 void setMaxY(
double y) { max_y = y; }
106 const PointArraySamples& points() const noexcept {
return *m_points; }
107 void setData(
const PointArraySegmentData& dat);
108 void setSpecificData(
const QVariant& data)
override;
109 bool specificDataEquals(
const QVariant& data)
const noexcept override;
110 void reserve(std::size_t p);
112 QVariant toSegmentSpecificData()
const override;
114 ossia::curve_segment<double> makeDoubleFunction()
const override;
115 ossia::curve_segment<float> makeFloatFunction()
const override;
116 ossia::curve_segment<int> makeIntFunction()
const override;
117 ossia::curve_segment<double>
118 makeScaledDoubleFunction(
double offset,
double factor)
const override;
119 ossia::curve_segment<float>
120 makeScaledFloatFunction(
double offset,
double factor)
const override;
121 ossia::curve_segment<int>
122 makeScaledIntFunction(
double offset,
double factor)
const override;
126 void minChanged(
double arg_1) E_SIGNAL(SCORE_PLUGIN_CURVE_EXPORT, minChanged, arg_1)
127 void maxChanged(
double arg_1) E_SIGNAL(SCORE_PLUGIN_CURVE_EXPORT, maxChanged, arg_1)
130 PointArraySamples& editPoints();
132 std::vector<QPointF> mappedPoints()
const;
135 double min_x{}, max_x{};
136 double min_y{}, max_y{};
140 std::shared_ptr<const PointArraySamples> m_points;
141 mutable int m_dataResolution{-1};
143 const MinMaxPyramid& pyramid()
const;
144 mutable MinMaxPyramid m_pyramid;
147 mutable std::weak_ptr<const PointArraySamples> m_pyramidOf;
152SCORE_PLUGIN_CURVE_EXPORT
153void setSegmentExtent(SegmentData& seg, QPointF start, QPointF end);
158SCORE_PLUGIN_CURVE_EXPORT
159std::vector<SegmentData>
160curveFromSamples(std::span<const float> values, std::size_t editable_max = 10000);
164SCORE_PLUGIN_CURVE_EXPORT
165std::vector<SegmentData> editableSegments(
166 const SegmentData& pointArray,
double tolerance, SegmentIdAllocator& ids);
169SCORE_SERIALIZE_DATASTREAM_DECLARE(
170 SCORE_PLUGIN_CURVE_EXPORT, Curve::PointArraySegmentData)
171Q_DECLARE_METATYPE(Curve::PointArraySegmentData)
172W_REGISTER_ARGTYPE(Curve::PointArraySegmentData)
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
The id_base_t class.
Definition Identifier.hpp:59
Utilities and base classes for 1D curves.
Definition FocusDispatcher.hpp:12
void envelope(std::size_t n, const X &x, const Y &y, const MinMaxPyramid &pyramid, std::size_t pyramid_offset, double x0, double x1, int columns, std::vector< QPointF > &out)
Definition score-plugin-curve/Curve/Envelope.hpp:81
void envelopeColumns(std::size_t n, const X &x, const Y &y, const MinMaxPyramid &pyramid, std::size_t pyramid_offset, double x0, double width, int columns, std::vector< QLineF > &out)
Definition score-plugin-curve/Curve/Envelope.hpp:138