42 template <
typename ValueType>
57 ValueType intervalValue,
59 bool useSymmetricSkew =
false) noexcept
68 ValueType rangeEnd) noexcept
77 ValueType intervalValue) noexcept
98 ValueType valueToRemap)>;
116 :
start (rangeStart),
118 convertFrom0To1Function (std::move (convertFrom0To1Func)),
119 convertTo0To1Function (std::move (convertTo0To1Func)),
120 snapToLegalValueFunction (std::move (snapToLegalValueFunc))
130 if (convertTo0To1Function !=
nullptr)
131 return clampTo0To1 (convertTo0To1Function (
start,
end, v));
135 if (
skew == static_cast<ValueType> (1))
139 return std::pow (proportion,
skew);
141 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion - static_cast<ValueType> (1);
143 return (static_cast<ValueType> (1) + std::pow (std::abs (distanceFromMiddle),
skew)
144 * (distanceFromMiddle < ValueType() ? static_cast<ValueType> (-1)
145 : static_cast<ValueType> (1)))
146 /
static_cast<ValueType
> (2);
154 proportion = clampTo0To1 (proportion);
156 if (convertFrom0To1Function !=
nullptr)
157 return convertFrom0To1Function (
start,
end, proportion);
161 if (
skew != static_cast<ValueType> (1) && proportion > ValueType())
162 proportion = std::exp (std::log (proportion) /
skew);
167 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion - static_cast<ValueType> (1);
169 if (
skew != static_cast<ValueType> (1) && distanceFromMiddle !=
static_cast<ValueType
> (0))
170 distanceFromMiddle = std::exp (std::log (std::abs (distanceFromMiddle)) /
skew)
171 * (distanceFromMiddle < ValueType() ? static_cast<ValueType> (-1)
172 : static_cast<ValueType> (1));
174 return start + (
end -
start) / static_cast<ValueType> (2) * (
static_cast<ValueType
> (1) + distanceFromMiddle);
182 if (snapToLegalValueFunction !=
nullptr)
183 return snapToLegalValueFunction (
start,
end, v);
204 jassert (centrePointValue >
start);
205 jassert (centrePointValue <
end);
208 skew = std::log (static_cast<ValueType> (0.5)) / std::log ((centrePointValue -
start) / (
end -
start));
244 void checkInvariants()
const 246 jassert (end > start);
247 jassert (interval >= ValueType());
248 jassert (skew > ValueType());
251 static ValueType clampTo0To1 (ValueType value)
253 auto clampedValue = jlimit (static_cast<ValueType> (0), static_cast<ValueType> (1), value);
257 jassert (clampedValue == value);
262 ValueRemapFunction convertFrom0To1Function, convertTo0To1Function, snapToLegalValueFunction;
Range< ValueType > getRange() const noexcept
Returns the extent of the normalisable range.
void setSkewForCentre(ValueType centrePointValue) noexcept
Given a value which is between the start and end points, this sets the skew such that convertFrom0to1...
NormalisableRange(Range< ValueType > range) noexcept
Creates a NormalisableRange with a given range, continuous interval, but a dummy skew-factor.
ValueType start
The minimum value of the non-normalised range.
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue) noexcept
Creates a NormalisableRange with a given range and interval, but a dummy skew-factor.
ValueType convertTo0to1(ValueType v) const noexcept
Uses the properties of this mapping to convert a non-normalised value to its 0->1 representation...
ValueType skew
An optional skew factor that alters the way values are distribute across the range.
bool symmetricSkew
If true, the skew factor applies from the middle of the slider to each of its ends.
ValueType snapToLegalValue(ValueType v) const noexcept
Takes a non-normalised value and snaps it based on either the interval property of this NormalisableR...
Represents a mapping between an arbitrary range of values and a normalised 0->1 range.
std::function< ValueType(ValueType rangeStart, ValueType rangeEnd, ValueType valueToRemap)> ValueRemapFunction
A function object which can remap a value in some way based on the start and end of a range...
NormalisableRange(Range< ValueType > range, ValueType intervalValue) noexcept
Creates a NormalisableRange with a given range and interval, but a dummy skew-factor.
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueRemapFunction convertFrom0To1Func, ValueRemapFunction convertTo0To1Func, ValueRemapFunction snapToLegalValueFunc={}) noexcept
Creates a NormalisableRange with a given range and an injective mapping function. ...
ValueType convertFrom0to1(ValueType proportion) const noexcept
Uses the properties of this mapping to convert a normalised 0->1 value to its full-range representati...
NormalisableRange(ValueType rangeStart, ValueType rangeEnd) noexcept
Creates a NormalisableRange with a given range, continuous interval, but a dummy skew-factor.
ValueType interval
The snapping interval that should be used (for a non-normalised value).
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue, ValueType skewFactor, bool useSymmetricSkew=false) noexcept
Creates a NormalisableRange with a given range, interval and skew factor.
ValueType end
The maximum value of the non-normalised range.
NormalisableRange()=default
Creates a continuous range that performs a dummy mapping.
A general-purpose range object, that simply represents any linear range with a start and end point...