25 std::span<float> samples,
26 std::optional<size_t>& previous,
36 const size_t last = samples.size() - 1;
37 const size_t index =
static_cast<size_t>(std::clamp(
position, 0.F, 1.F) *
static_cast<float>(last));
38 const float target = std::clamp(level, 0.F, 1.F);
40 if (previous && *previous !=
index && *previous <= last) {
41 const size_t from = *previous;
42 const float start = samples[from];
43 const size_t lo = std::min(from,
index);
44 const size_t hi = std::max(from,
index);
45 const auto run =
static_cast<float>(hi - lo);
47 for (
size_t i = lo; i <= hi; ++i) {
48 const size_t travelled = i > from ? i - from : from - i;
49 const float fraction =
static_cast<float>(travelled) /
run;
50 samples[i] = start + (target - start) * fraction;
53 samples[
index] = target;
void stroke_samples(std::span< float > samples, std::optional< size_t > &previous, float position, float level) noexcept
Write a level into an evenly spaced sample array at a fractional position, filling linearly from the ...