#[repr(C)]pub struct Oklab<T = f32> {
pub l: T,
pub a: T,
pub b: T,
}Expand description
The Oklab color space.
§Characteristics
Oklab is a perceptual color space. It does not relate to an output
device (a monitor or printer) but instead relates to the CIE standard
observer
– an averaging of the results of color matching experiments under
laboratory conditions.
Oklab is a uniform color space (Compare to the HSV color
space). It
is useful for things like:
- Turning an image grayscale, while keeping the perceived lightness the same
- Increasing the saturation of colors, while maintaining perceived hue and lightness
- Creating smooth and uniform looking transitions between colors
Oklab’s structure is similar to L*a*b*. It is based on
the opponent color model of human
vision, where red and green
form an opponent pair, and blue and yellow form an opponent pair.
Oklab uses D65’s
whitepoint – daylight illumination, which is also used by sRGB, rec2020 and
Display P3 color spaces – and assumes normal well-lit viewing conditions,
to which the eye is adapted. Thus Oklabs lightness l technically is a
measure of relative brightness – a subjective measure – not relative
luminance. The lightness is scale/exposure-independend, i.e. independent of
the actual luminance of the color, as displayed by some medium, and even for
blindingly bright colors or very bright or dark viewing conditions assumes,
that the eye is adapted to the color’s luminance and the hue and chroma are
perceived linearly.
Oklab’s chroma is unlimited. Thus it can represent colors of any color
space (including HDR). l is in the range 0.0 .. 1.0 and a and b are
unbounded.
§Conversions
Oklch is a cylindrical form of Oklab.
Oklab colors converted from valid (i.e. clamped) sRGB will be in the
sRGB gamut.
Okhsv, Okhwb and Okhsl reference the sRGB gamut.
The transformation from Oklab to one of them is based on the assumption,
that the transformed Oklab value is within sRGB.
Okhsv, Okhwb and Okhsl are not applicable to HDR, which also come with
color spaces with wider gamuts. They require additional
research.
When a Oklab color is converted from Srgb or a
equivalent color space, e.g. Hsv, Okhsv,
Hsl, Okhsl, Hwb,
Okhwb, it’s lightness will be relative to the (user
controlled) maximum contrast and luminance of the display device, to which
the eye is assumed to be adapted.
§Clamping
Clamping will only clamp l. Clamping does not guarantee
the color to be inside the perceptible or any display-dependent color space
(like sRGB).
To ensure a color is within the sRGB gamut, it can first be converted to
Okhsv, clamped there and converted it back to Oklab.
// Display P3 yellow according to https://colorjs.io/apps/convert/?color=color(display-p3%201%201%200)&precision=17
let oklab = Oklab::from_color_unclamped(LinSrgb::new(1.0, 1.0, -0.098273600140966));
let okhsv: Okhsv<f64> = Okhsv::from_color_unclamped(oklab);
assert!(!okhsv.is_within_bounds());
let clamped_okhsv = okhsv.clamp();
assert!(clamped_okhsv.is_within_bounds());
let linsrgb = LinSrgb::from_color_unclamped(clamped_okhsv);
let expected = LinSrgb::new(1.0, 0.9876530763223166, 0.0);
assert_abs_diff_eq!(expected, linsrgb, epsilon = 0.02);Since the conversion contains a gamut mapping, it will map the color to one
of the perceptually closest locations in the sRGB gamut. Gamut mapping –
unlike clamping – is an expensive operation. To get computationally cheaper
(and perceptually much worse) results, convert directly to Srgb and
clamp there.
§Lightening / Darkening
Lightening and Darkening will change
l, as expected. However, either operation may leave an implicit color
space (the percetible or a display dependent color space like sRGB).
To ensure a color is within the sRGB gamut, first convert it to Okhsl,
lighten/darken it there and convert it back to Oklab.
Fields§
§l: Tl is the lightness of the color. 0 gives absolute black and 1 gives the
full white point luminance of the display medium.
D65 (normalized with Y=1, i.e. white according to the adaption of the
eye) transforms to
L=1,a=0,b=0.
However intermediate values differ from those of CIELab non-linearly.
a: Ta changes the hue from reddish to greenish, when moving from positive
to negative values and becomes more intense with larger absolute values.
The exact orientation is determined by b
b: Tb changes the hue from yellowish to blueish, when moving from positive
to negative values and becomes more intense with larger absolute values.
Implementations§
Source§impl<T> Oklab<T>
impl<T> Oklab<T>
Sourcepub fn into_components(self) -> (T, T, T)
pub fn into_components(self) -> (T, T, T)
Convert to a (L, a, b) tuple.
Sourcepub fn from_components(_: (T, T, T)) -> Oklab<T>
pub fn from_components(_: (T, T, T)) -> Oklab<T>
Convert from a (L, a, b) tuple.
Source§impl<C> Oklab<C>
impl<C> Oklab<C>
Sourcepub fn iter<'a>(&'a self) -> <&'a Oklab<C> as IntoIterator>::IntoIterwhere
&'a Oklab<C>: IntoIterator,
pub fn iter<'a>(&'a self) -> <&'a Oklab<C> as IntoIterator>::IntoIterwhere
&'a Oklab<C>: IntoIterator,
Return an iterator over the colors in the wrapped collections.
Sourcepub fn iter_mut<'a>(
&'a mut self,
) -> <&'a mut Oklab<C> as IntoIterator>::IntoIterwhere
&'a mut Oklab<C>: IntoIterator,
pub fn iter_mut<'a>(
&'a mut self,
) -> <&'a mut Oklab<C> as IntoIterator>::IntoIterwhere
&'a mut Oklab<C>: IntoIterator,
Return an iterator that allows modifying the colors in the wrapped collections.
Sourcepub fn get<'a, I, T>(
&'a self,
index: I,
) -> Option<Oklab<&'a <I as SliceIndex<[T]>>::Output>>
pub fn get<'a, I, T>( &'a self, index: I, ) -> Option<Oklab<&'a <I as SliceIndex<[T]>>::Output>>
Get a color, or slice of colors, with references to the components at index. See slice::get for details.
Sourcepub fn get_mut<'a, I, T>(
&'a mut self,
index: I,
) -> Option<Oklab<&'a mut <I as SliceIndex<[T]>>::Output>>
pub fn get_mut<'a, I, T>( &'a mut self, index: I, ) -> Option<Oklab<&'a mut <I as SliceIndex<[T]>>::Output>>
Get a color, or slice of colors, that allows modifying the components at index. See slice::get_mut for details.
Source§impl<T> Oklab<Vec<T>>
impl<T> Oklab<Vec<T>>
Sourcepub fn with_capacity(capacity: usize) -> Oklab<Vec<T>>
pub fn with_capacity(capacity: usize) -> Oklab<Vec<T>>
Create a struct of vectors with a minimum capacity. See Vec::with_capacity for details.
Sourcepub fn push(&mut self, value: Oklab<T>)
pub fn push(&mut self, value: Oklab<T>)
Push an additional color’s components onto the component vectors. See Vec::push for details.
Sourcepub fn pop(&mut self) -> Option<Oklab<T>>
pub fn pop(&mut self) -> Option<Oklab<T>>
Pop a color’s components from the component vectors. See Vec::pop for details.
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear the component vectors. See Vec::clear for details.
Trait Implementations§
Source§impl<T> AbsDiffEq for Oklab<T>
impl<T> AbsDiffEq for Oklab<T>
Source§fn default_epsilon() -> <Oklab<T> as AbsDiffEq>::Epsilon
fn default_epsilon() -> <Oklab<T> as AbsDiffEq>::Epsilon
Source§fn abs_diff_eq(
&self,
other: &Oklab<T>,
epsilon: <T as AbsDiffEq>::Epsilon,
) -> bool
fn abs_diff_eq( &self, other: &Oklab<T>, epsilon: <T as AbsDiffEq>::Epsilon, ) -> bool
Source§fn abs_diff_ne(
&self,
other: &Oklab<T>,
epsilon: <T as AbsDiffEq>::Epsilon,
) -> bool
fn abs_diff_ne( &self, other: &Oklab<T>, epsilon: <T as AbsDiffEq>::Epsilon, ) -> bool
AbsDiffEq::abs_diff_eq.Source§impl<T> AddAssign<T> for Oklab<T>
impl<T> AddAssign<T> for Oklab<T>
Source§fn add_assign(&mut self, c: T)
fn add_assign(&mut self, c: T)
+= operation. Read moreSource§impl<T> AddAssign for Oklab<T>where
T: AddAssign,
impl<T> AddAssign for Oklab<T>where
T: AddAssign,
Source§fn add_assign(&mut self, other: Oklab<T>)
fn add_assign(&mut self, other: Oklab<T>)
+= operation. Read moreSource§impl<T> ClampAssign for Oklab<T>
impl<T> ClampAssign for Oklab<T>
Source§fn clamp_assign(&mut self)
fn clamp_assign(&mut self)
Source§impl<T> Complementary for Oklab<T>where
T: Neg<Output = T>,
impl<T> Complementary for Oklab<T>where
T: Neg<Output = T>,
Source§fn complementary(self) -> Oklab<T>
fn complementary(self) -> Oklab<T>
self. Read moreSource§impl<T> DivAssign<T> for Oklab<T>
impl<T> DivAssign<T> for Oklab<T>
Source§fn div_assign(&mut self, c: T)
fn div_assign(&mut self, c: T)
/= operation. Read moreSource§impl<T> DivAssign for Oklab<T>where
T: DivAssign,
impl<T> DivAssign for Oklab<T>where
T: DivAssign,
Source§fn div_assign(&mut self, other: Oklab<T>)
fn div_assign(&mut self, other: Oklab<T>)
/= operation. Read moreSource§impl<T> EuclideanDistance for Oklab<T>
impl<T> EuclideanDistance for Oklab<T>
Source§fn distance_squared(
self,
other: Oklab<T>,
) -> <Oklab<T> as EuclideanDistance>::Scalar
fn distance_squared( self, other: Oklab<T>, ) -> <Oklab<T> as EuclideanDistance>::Scalar
Source§impl<T, C> Extend<Oklab<T>> for Oklab<C>where
C: Extend<T>,
impl<T, C> Extend<Oklab<T>> for Oklab<C>where
C: Extend<T>,
Source§fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = Oklab<T>>,
fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = Oklab<T>>,
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<T, _C, _A> FromColorUnclamped<Alpha<_C, _A>> for Oklab<T>where
_C: IntoColorUnclamped<Oklab<T>>,
impl<T, _C, _A> FromColorUnclamped<Alpha<_C, _A>> for Oklab<T>where
_C: IntoColorUnclamped<Oklab<T>>,
Source§impl<T, _S> FromColorUnclamped<Hsl<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hsl<_S, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T, _S> FromColorUnclamped<Hsl<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hsl<_S, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Hsluv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Hsluv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Hsluv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Hsluv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T, _S> FromColorUnclamped<Hsv<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hsv<_S, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T, _S> FromColorUnclamped<Hsv<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hsv<_S, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T, _S> FromColorUnclamped<Hwb<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hwb<_S, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T, _S> FromColorUnclamped<Hwb<_S, T>> for Oklab<T>where
_S: RgbStandard,
<_S as RgbStandard>::Space: RgbSpace<WhitePoint = D65>,
D65: WhitePoint<T>,
Rgb<_S, T>: FromColorUnclamped<Hwb<_S, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Lab<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lab<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Lab<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lab<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Lch<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lch<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Lch<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lch<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Lchuv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lchuv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Lchuv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Lchuv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T, _S> FromColorUnclamped<Luma<_S, T>> for Oklab<T>where
_S: LumaStandard<WhitePoint = D65>,
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Luma<_S, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T, _S> FromColorUnclamped<Luma<_S, T>> for Oklab<T>where
_S: LumaStandard<WhitePoint = D65>,
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Luma<_S, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Luv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Luv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Luv<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Luv<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T> FromColorUnclamped<Okhsl<T>> for Oklab<T>where
T: RealAngle + One + Zero + Arithmetics + Sqrt + MinMax + PartialOrd + HasBoolMask<Mask = bool> + Powi + Cbrt + Trigonometry + Clone,
Oklab<T>: IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
§See
See okhsl_to_srgb
impl<T> FromColorUnclamped<Okhsl<T>> for Oklab<T>where
T: RealAngle + One + Zero + Arithmetics + Sqrt + MinMax + PartialOrd + HasBoolMask<Mask = bool> + Powi + Cbrt + Trigonometry + Clone,
Oklab<T>: IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
§See
See okhsl_to_srgb
Source§impl<T> FromColorUnclamped<Okhsv<T>> for Oklab<T>where
T: RealAngle + PartialOrd + HasBoolMask<Mask = bool> + MinMax + Powi + Arithmetics + Clone + One + Zero + Cbrt + Trigonometry,
Oklab<T>: IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
impl<T> FromColorUnclamped<Okhsv<T>> for Oklab<T>where
T: RealAngle + PartialOrd + HasBoolMask<Mask = bool> + MinMax + Powi + Arithmetics + Clone + One + Zero + Cbrt + Trigonometry,
Oklab<T>: IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
Source§impl<T> FromColorUnclamped<Okhwb<T>> for Oklab<T>
impl<T> FromColorUnclamped<Okhwb<T>> for Oklab<T>
Source§impl<S, T> FromColorUnclamped<Oklab<T>> for Hsl<S, T>
impl<S, T> FromColorUnclamped<Oklab<T>> for Hsl<S, T>
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Hsluv<Wp, T>where
Wp: WhitePoint<T>,
Lchuv<Wp, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Hsluv<Wp, T>>,
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Hsluv<Wp, T>where
Wp: WhitePoint<T>,
Lchuv<Wp, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Hsluv<Wp, T>>,
Source§impl<S, T> FromColorUnclamped<Oklab<T>> for Hsv<S, T>
impl<S, T> FromColorUnclamped<Oklab<T>> for Hsv<S, T>
Source§impl<S, T> FromColorUnclamped<Oklab<T>> for Hwb<S, T>
impl<S, T> FromColorUnclamped<Oklab<T>> for Hwb<S, T>
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lab<Wp, T>
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lab<Wp, T>
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lch<Wp, T>
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lch<Wp, T>
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lchuv<Wp, T>where
Wp: WhitePoint<T>,
Luv<Wp, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Lchuv<Wp, T>>,
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Lchuv<Wp, T>where
Wp: WhitePoint<T>,
Luv<Wp, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Lchuv<Wp, T>>,
Source§impl<S, T> FromColorUnclamped<Oklab<T>> for Luma<S, T>where
S: LumaStandard,
Xyz<<S as LumaStandard>::WhitePoint, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Luma<S, T>>,
impl<S, T> FromColorUnclamped<Oklab<T>> for Luma<S, T>where
S: LumaStandard,
Xyz<<S as LumaStandard>::WhitePoint, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Luma<S, T>>,
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Luv<Wp, T>
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Luv<Wp, T>
Source§impl<T> FromColorUnclamped<Oklab<T>> for Okhsl<T>where
T: Zero + Arithmetics + Powi + Sqrt + Hypot + MinMax + Cbrt + IsValidDivisor<Mask = bool, Mask = bool> + HasBoolMask + Real + PartialOrd + Clone + One,
Oklab<T>: GetHue<Hue = OklabHue<T>> + IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
§See
See srgb_to_okhsl
impl<T> FromColorUnclamped<Oklab<T>> for Okhsl<T>where
T: Zero + Arithmetics + Powi + Sqrt + Hypot + MinMax + Cbrt + IsValidDivisor<Mask = bool, Mask = bool> + HasBoolMask + Real + PartialOrd + Clone + One,
Oklab<T>: GetHue<Hue = OklabHue<T>> + IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
§See
See srgb_to_okhsl
Source§impl<T> FromColorUnclamped<Oklab<T>> for Okhsv<T>where
T: Clone + Powi + Sqrt + Cbrt + Arithmetics + Trigonometry + Zero + Hypot + One + IsValidDivisor<Mask = bool, Mask = bool> + HasBoolMask + Real + PartialOrd + MinMax,
Oklab<T>: GetHue<Hue = OklabHue<T>> + IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
Converts lab to Okhsv in the bounds of sRGB.
impl<T> FromColorUnclamped<Oklab<T>> for Okhsv<T>where
T: Clone + Powi + Sqrt + Cbrt + Arithmetics + Trigonometry + Zero + Hypot + One + IsValidDivisor<Mask = bool, Mask = bool> + HasBoolMask + Real + PartialOrd + MinMax,
Oklab<T>: GetHue<Hue = OklabHue<T>> + IntoColorUnclamped<Rgb<Linear<Srgb>, T>>,
Converts lab to Okhsv in the bounds of sRGB.
§See
See srgb_to_okhsv.
This implementation differs from srgb_to_okhsv in that it starts with the lab
value and produces hues in degrees, whereas srgb_to_okhsv produces degree/360.
Source§impl<T> FromColorUnclamped<Oklab<T>> for Okhwb<T>
impl<T> FromColorUnclamped<Oklab<T>> for Okhwb<T>
Source§impl<T> FromColorUnclamped<Oklab<T>> for Oklab<T>
impl<T> FromColorUnclamped<Oklab<T>> for Oklab<T>
Source§impl<T> FromColorUnclamped<Oklab<T>> for Oklch<T>
impl<T> FromColorUnclamped<Oklab<T>> for Oklch<T>
Source§impl<S, T> FromColorUnclamped<Oklab<T>> for Rgb<S, T>where
T: Real + Arithmetics + Copy,
S: RgbStandard,
<S as RgbStandard>::TransferFn: FromLinear<T, T>,
<S as RgbStandard>::Space: RgbSpace<WhitePoint = D65> + 'static,
Rgb<Linear<Srgb>, T>: IntoColorUnclamped<Rgb<S, T>>,
Xyz<D65, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Rgb<S, T>>,
impl<S, T> FromColorUnclamped<Oklab<T>> for Rgb<S, T>where
T: Real + Arithmetics + Copy,
S: RgbStandard,
<S as RgbStandard>::TransferFn: FromLinear<T, T>,
<S as RgbStandard>::Space: RgbSpace<WhitePoint = D65> + 'static,
Rgb<Linear<Srgb>, T>: IntoColorUnclamped<Rgb<S, T>>,
Xyz<D65, T>: FromColorUnclamped<Oklab<T>> + IntoColorUnclamped<Rgb<S, T>>,
Source§impl<Wp, T> FromColorUnclamped<Oklab<T>> for Yxy<Wp, T>
impl<Wp, T> FromColorUnclamped<Oklab<T>> for Yxy<Wp, T>
Source§impl<T> FromColorUnclamped<Oklch<T>> for Oklab<T>
impl<T> FromColorUnclamped<Oklch<T>> for Oklab<T>
Source§impl<S, T> FromColorUnclamped<Rgb<S, T>> for Oklab<T>where
T: Real + Cbrt + Arithmetics + Copy,
S: RgbStandard,
<S as RgbStandard>::TransferFn: IntoLinear<T, T>,
<S as RgbStandard>::Space: RgbSpace<WhitePoint = D65> + 'static,
Xyz<D65, T>: FromColorUnclamped<Rgb<S, T>>,
impl<S, T> FromColorUnclamped<Rgb<S, T>> for Oklab<T>where
T: Real + Cbrt + Arithmetics + Copy,
S: RgbStandard,
<S as RgbStandard>::TransferFn: IntoLinear<T, T>,
<S as RgbStandard>::Space: RgbSpace<WhitePoint = D65> + 'static,
Xyz<D65, T>: FromColorUnclamped<Rgb<S, T>>,
Source§impl<T> FromColorUnclamped<Yxy<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Yxy<D65, T>> + IntoColorUnclamped<Oklab<T>>,
impl<T> FromColorUnclamped<Yxy<D65, T>> for Oklab<T>where
D65: WhitePoint<T>,
Xyz<D65, T>: FromColorUnclamped<Yxy<D65, T>> + IntoColorUnclamped<Oklab<T>>,
Source§impl<T, C> FromIterator<Oklab<T>> for Oklab<C>
impl<T, C> FromIterator<Oklab<T>> for Oklab<C>
Source§impl<T> HasBoolMask for Oklab<T>where
T: HasBoolMask,
impl<T> HasBoolMask for Oklab<T>where
T: HasBoolMask,
Source§type Mask = <T as HasBoolMask>::Mask
type Mask = <T as HasBoolMask>::Mask
Self values.Source§impl<'a, 'b, T> IntoIterator for &'a Oklab<&'b [T]>
impl<'a, 'b, T> IntoIterator for &'a Oklab<&'b [T]>
Source§impl<'a, 'b, T> IntoIterator for &'a Oklab<&'b mut [T]>
impl<'a, 'b, T> IntoIterator for &'a Oklab<&'b mut [T]>
Source§impl<'a, T> IntoIterator for &'a Oklab<Vec<T>>
impl<'a, T> IntoIterator for &'a Oklab<Vec<T>>
Source§impl<'a, 'b, T> IntoIterator for &'a mut Oklab<&'b mut [T]>
impl<'a, 'b, T> IntoIterator for &'a mut Oklab<&'b mut [T]>
Source§impl<'a, T> IntoIterator for &'a mut Oklab<Vec<T>>
impl<'a, T> IntoIterator for &'a mut Oklab<Vec<T>>
Source§impl<'a, T> IntoIterator for Oklab<&'a [T]>
impl<'a, T> IntoIterator for Oklab<&'a [T]>
Source§impl<'a, T> IntoIterator for Oklab<&'a mut [T]>
impl<'a, T> IntoIterator for Oklab<&'a mut [T]>
Source§impl<T> IntoIterator for Oklab<Vec<T>>
impl<T> IntoIterator for Oklab<Vec<T>>
Source§impl<T> IsWithinBounds for Oklab<T>where
T: PartialCmp + Zero + One,
<T as HasBoolMask>::Mask: BitAnd<Output = <T as HasBoolMask>::Mask>,
impl<T> IsWithinBounds for Oklab<T>where
T: PartialCmp + Zero + One,
<T as HasBoolMask>::Mask: BitAnd<Output = <T as HasBoolMask>::Mask>,
Source§fn is_within_bounds(&self) -> <T as HasBoolMask>::Mask
fn is_within_bounds(&self) -> <T as HasBoolMask>::Mask
Source§impl<T> Lighten for Oklab<T>where
T: Real + Zero + MinMax + Clamp + Arithmetics + PartialCmp + Clone + One,
<T as HasBoolMask>::Mask: LazySelect<T>,
impl<T> Lighten for Oklab<T>where
T: Real + Zero + MinMax + Clamp + Arithmetics + PartialCmp + Clone + One,
<T as HasBoolMask>::Mask: LazySelect<T>,
Source§impl<T> LightenAssign for Oklab<T>where
T: Real + Zero + MinMax + ClampAssign + AddAssign + Arithmetics + PartialCmp + Clone + One,
<T as HasBoolMask>::Mask: LazySelect<T>,
impl<T> LightenAssign for Oklab<T>where
T: Real + Zero + MinMax + ClampAssign + AddAssign + Arithmetics + PartialCmp + Clone + One,
<T as HasBoolMask>::Mask: LazySelect<T>,
Source§fn lighten_assign(&mut self, factor: T)
fn lighten_assign(&mut self, factor: T)
Source§fn lighten_fixed_assign(&mut self, amount: T)
fn lighten_fixed_assign(&mut self, amount: T)
Source§impl<T> MulAssign<T> for Oklab<T>
impl<T> MulAssign<T> for Oklab<T>
Source§fn mul_assign(&mut self, c: T)
fn mul_assign(&mut self, c: T)
*= operation. Read moreSource§impl<T> MulAssign for Oklab<T>where
T: MulAssign,
impl<T> MulAssign for Oklab<T>where
T: MulAssign,
Source§fn mul_assign(&mut self, other: Oklab<T>)
fn mul_assign(&mut self, other: Oklab<T>)
*= operation. Read moreSource§impl<T> Premultiply for Oklab<T>where
T: Stimulus + Zero + IsValidDivisor + Mul<Output = T> + Div<Output = T> + Real + Clone,
<T as HasBoolMask>::Mask: LazySelect<T> + Clone,
impl<T> Premultiply for Oklab<T>where
T: Stimulus + Zero + IsValidDivisor + Mul<Output = T> + Div<Output = T> + Real + Clone,
<T as HasBoolMask>::Mask: LazySelect<T> + Clone,
Source§impl<T> RelativeContrast for Oklab<T>where
T: Real + Arithmetics + PartialCmp,
<T as HasBoolMask>::Mask: LazySelect<T>,
Xyz<D65, T>: FromColor<Oklab<T>>,
impl<T> RelativeContrast for Oklab<T>where
T: Real + Arithmetics + PartialCmp,
<T as HasBoolMask>::Mask: LazySelect<T>,
Xyz<D65, T>: FromColor<Oklab<T>>,
Source§type Scalar = T
type Scalar = T
palette::color_difference::Wcag21RelativeContrastSource§fn get_contrast_ratio(self, other: Oklab<T>) -> T
fn get_contrast_ratio(self, other: Oklab<T>) -> T
palette::color_difference::Wcag21RelativeContrastSource§fn has_min_contrast_text(
self,
other: Self,
) -> <Self::Scalar as HasBoolMask>::Mask
fn has_min_contrast_text( self, other: Self, ) -> <Self::Scalar as HasBoolMask>::Mask
palette::color_difference::Wcag21RelativeContrastSource§fn has_min_contrast_large_text(
self,
other: Self,
) -> <Self::Scalar as HasBoolMask>::Mask
fn has_min_contrast_large_text( self, other: Self, ) -> <Self::Scalar as HasBoolMask>::Mask
palette::color_difference::Wcag21RelativeContrastSource§fn has_enhanced_contrast_text(
self,
other: Self,
) -> <Self::Scalar as HasBoolMask>::Mask
fn has_enhanced_contrast_text( self, other: Self, ) -> <Self::Scalar as HasBoolMask>::Mask
palette::color_difference::Wcag21RelativeContrastSource§fn has_enhanced_contrast_large_text(
self,
other: Self,
) -> <Self::Scalar as HasBoolMask>::Mask
fn has_enhanced_contrast_large_text( self, other: Self, ) -> <Self::Scalar as HasBoolMask>::Mask
palette::color_difference::Wcag21RelativeContrastSource§fn has_min_contrast_graphics(
self,
other: Self,
) -> <Self::Scalar as HasBoolMask>::Mask
fn has_min_contrast_graphics( self, other: Self, ) -> <Self::Scalar as HasBoolMask>::Mask
palette::color_difference::Wcag21RelativeContrastSource§impl<T> RelativeEq for Oklab<T>
impl<T> RelativeEq for Oklab<T>
Source§fn default_max_relative() -> <T as AbsDiffEq>::Epsilon
fn default_max_relative() -> <T as AbsDiffEq>::Epsilon
Source§fn relative_eq(
&self,
other: &Oklab<T>,
epsilon: <T as AbsDiffEq>::Epsilon,
max_relative: <T as AbsDiffEq>::Epsilon,
) -> bool
fn relative_eq( &self, other: &Oklab<T>, epsilon: <T as AbsDiffEq>::Epsilon, max_relative: <T as AbsDiffEq>::Epsilon, ) -> bool
Source§fn relative_ne(
&self,
other: &Oklab<T>,
epsilon: <T as AbsDiffEq>::Epsilon,
max_relative: <T as AbsDiffEq>::Epsilon,
) -> bool
fn relative_ne( &self, other: &Oklab<T>, epsilon: <T as AbsDiffEq>::Epsilon, max_relative: <T as AbsDiffEq>::Epsilon, ) -> bool
RelativeEq::relative_eq.Source§impl<T> SaturatingAdd<T> for Oklab<T>where
T: SaturatingAdd<Output = T> + Clone,
impl<T> SaturatingAdd<T> for Oklab<T>where
T: SaturatingAdd<Output = T> + Clone,
Source§fn saturating_add(self, c: T) -> <Oklab<T> as SaturatingAdd<T>>::Output
fn saturating_add(self, c: T) -> <Oklab<T> as SaturatingAdd<T>>::Output
self and other, but saturates instead of overflowing.Source§impl<T> SaturatingAdd for Oklab<T>where
T: SaturatingAdd<Output = T>,
impl<T> SaturatingAdd for Oklab<T>where
T: SaturatingAdd<Output = T>,
Source§impl<T> SaturatingSub<T> for Oklab<T>where
T: SaturatingSub<Output = T> + Clone,
impl<T> SaturatingSub<T> for Oklab<T>where
T: SaturatingSub<Output = T> + Clone,
Source§fn saturating_sub(self, c: T) -> <Oklab<T> as SaturatingSub<T>>::Output
fn saturating_sub(self, c: T) -> <Oklab<T> as SaturatingSub<T>>::Output
self and other, but saturates instead of overflowing.Source§impl<T> SaturatingSub for Oklab<T>where
T: SaturatingSub<Output = T>,
impl<T> SaturatingSub for Oklab<T>where
T: SaturatingSub<Output = T>,
Source§impl<T> SubAssign<T> for Oklab<T>
impl<T> SubAssign<T> for Oklab<T>
Source§fn sub_assign(&mut self, c: T)
fn sub_assign(&mut self, c: T)
-= operation. Read moreSource§impl<T> SubAssign for Oklab<T>where
T: SubAssign,
impl<T> SubAssign for Oklab<T>where
T: SubAssign,
Source§fn sub_assign(&mut self, other: Oklab<T>)
fn sub_assign(&mut self, other: Oklab<T>)
-= operation. Read moreSource§impl<T> UlpsEq for Oklab<T>
impl<T> UlpsEq for Oklab<T>
Source§fn default_max_ulps() -> u32
fn default_max_ulps() -> u32
Source§impl<T, _A> WithAlpha<_A> for Oklab<T>where
_A: Stimulus,
impl<T, _A> WithAlpha<_A> for Oklab<T>where
_A: Stimulus,
Source§fn with_alpha(self, alpha: _A) -> <Oklab<T> as WithAlpha<_A>>::WithAlpha
fn with_alpha(self, alpha: _A) -> <Oklab<T> as WithAlpha<_A>>::WithAlpha
Self already has a transparency, it is
overwritten. Read moreSource§fn without_alpha(self) -> <Oklab<T> as WithAlpha<_A>>::Color
fn without_alpha(self) -> <Oklab<T> as WithAlpha<_A>>::Color
Self::Color has
an internal transparency field, that field will be set to
A::max_intensity() to make it opaque. Read moreSource§fn split(self) -> (<Oklab<T> as WithAlpha<_A>>::Color, _A)
fn split(self) -> (<Oklab<T> as WithAlpha<_A>>::Color, _A)
impl<T> Copy for Oklab<T>where
T: Copy,
impl<T> Eq for Oklab<T>where
T: Eq,
Auto Trait Implementations§
impl<T> Freeze for Oklab<T>where
T: Freeze,
impl<T> RefUnwindSafe for Oklab<T>where
T: RefUnwindSafe,
impl<T> Send for Oklab<T>where
T: Send,
impl<T> Sync for Oklab<T>where
T: Sync,
impl<T> Unpin for Oklab<T>where
T: Unpin,
impl<T> UnwindSafe for Oklab<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptFrom<S, Swp, Dwp, T> for Dwhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
S: IntoColorUnclamped<Xyz<Swp, T>>,
D: FromColorUnclamped<Xyz<Dwp, T>>,
impl<S, D, Swp, Dwp, T> AdaptFrom<S, Swp, Dwp, T> for Dwhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
S: IntoColorUnclamped<Xyz<Swp, T>>,
D: FromColorUnclamped<Xyz<Dwp, T>>,
Source§fn adapt_from_using<M>(color: S, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_from_using<M>(color: S, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_from(color: S) -> Self
fn adapt_from(color: S) -> Self
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<C> BlendWith for C
impl<C> BlendWith for C
Source§fn blend_with<F>(self, other: C, blend_function: F) -> C
fn blend_with<F>(self, other: C, blend_function: F) -> C
destination, using
blend_function. Anything that implements BlendFunction is
acceptable, including functions and closures. Read moreSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<C> Compose for C
impl<C> Compose for C
Source§fn over(self, other: C) -> C
fn over(self, other: C) -> C
self over other. This is the good old common alpha composition
equation.Source§fn inside(self, other: C) -> C
fn inside(self, other: C) -> C
self that overlaps the visible parts of
other.Source§impl<T> Downcast for T
impl<T> Downcast for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromColor<T> for Uwhere
U: FromColorUnclamped<T> + Clamp,
impl<T, U> FromColor<T> for Uwhere
U: FromColorUnclamped<T> + Clamp,
Source§fn from_color(t: T) -> U
fn from_color(t: T) -> U
Source§impl<T, U> FromColorMut<U> for T
impl<T, U> FromColorMut<U> for T
Source§fn from_color_mut(color: &mut U) -> FromColorMutGuard<'_, T, U>
fn from_color_mut(color: &mut U) -> FromColorMutGuard<'_, T, U>
Source§impl<T, U> FromColorUnclampedMut<U> for Twhere
T: FromColorUnclamped<U> + ArrayCast + Clone,
U: FromColorUnclamped<T> + ArrayCast<Array = <T as ArrayCast>::Array> + Clone,
impl<T, U> FromColorUnclampedMut<U> for Twhere
T: FromColorUnclamped<U> + ArrayCast + Clone,
U: FromColorUnclamped<T> + ArrayCast<Array = <T as ArrayCast>::Array> + Clone,
Source§fn from_color_unclamped_mut(
color: &mut U,
) -> FromColorUnclampedMutGuard<'_, T, U>
fn from_color_unclamped_mut( color: &mut U, ) -> FromColorUnclampedMutGuard<'_, T, U>
Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorMut<T> for U
impl<T, U> IntoColorMut<T> for U
Source§fn into_color_mut(&mut self) -> FromColorMutGuard<'_, T, U>
fn into_color_mut(&mut self) -> FromColorMutGuard<'_, T, U>
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T, U> IntoColorUnclampedMut<T> for U
impl<T, U> IntoColorUnclampedMut<T> for U
Source§fn into_color_unclamped_mut(&mut self) -> FromColorUnclampedMutGuard<'_, T, U>
fn into_color_unclamped_mut(&mut self) -> FromColorUnclampedMutGuard<'_, T, U>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryFromColor<T> for U
impl<T, U> TryFromColor<T> for U
Source§fn try_from_color(t: T) -> Result<U, OutOfBounds<U>>
fn try_from_color(t: T) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read moreSource§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more