#![allow(dead_code)]
use crate::PointeeSizeExpressible;
use crate::matan::is_curve_descending;
use num_traits::AsPrimitive;
pub(crate) fn limit_slope<T: Copy + AsPrimitive<f32> + PartialOrd + PointeeSizeExpressible>(
curve: &mut [T],
value_cap: f32,
) where
f32: AsPrimitive<T>,
{
let at_begin = (curve.len() as f32 * 0.02 + 0.5).floor() as usize; if at_begin == 0 {
return;
}
let at_end = curve.len() - at_begin - 1; let (begin_val, end_val) = if is_curve_descending(curve) {
(value_cap, 0.)
} else {
(0., value_cap)
};
let val = curve[at_begin].as_();
let slope = (val - begin_val) / at_begin as f32;
let beta = val - slope * at_begin as f32;
if T::FINITE {
for v in curve.iter_mut().take(at_begin) {
*v = (v.as_() * slope + beta)
.round()
.min(value_cap)
.max(0.0)
.as_();
}
} else {
for v in curve.iter_mut().take(at_begin) {
*v = (v.as_() * slope + beta).min(value_cap).max(0.0).as_();
}
}
let val = curve[at_end].as_();
let slope = (end_val - val) / at_begin as f32;
let beta = val - slope * at_end as f32;
if T::FINITE {
for v in curve.iter_mut().skip(at_end) {
*v = (v.as_() * slope + beta)
.round()
.min(value_cap)
.max(0.0)
.as_();
}
} else {
for v in curve.iter_mut().skip(at_end) {
*v = (v.as_() * slope + beta).min(value_cap).max(0.0).as_();
}
}
}