#[repr(transparent)]pub struct OpaqueColor<CS> {
pub components: [f32; 3],
pub cs: PhantomData<CS>,
}
Expand description
An opaque color.
A color in a color space known at compile time, without transparency. Note that “opaque” refers to the color, not the representation; the components are publicly accessible.
Arithmetic traits are defined on this type, and operate component-wise. A major motivation for including these is to enable weighted sums, including for spline interpolation. For cylindrical color spaces, hue fixup should be applied before interpolation.
Fields§
§components: [f32; 3]
The components, which may be manipulated directly.
The interpretation of the components depends on the color space.
cs: PhantomData<CS>
The color space.
Implementations§
Source§impl<CS: ColorSpace> OpaqueColor<CS>
impl<CS: ColorSpace> OpaqueColor<CS>
Sourcepub const BLACK: Self
pub const BLACK: Self
A black color.
More comprehensive pre-defined colors are available
in the color::palette
module.
Sourcepub const WHITE: Self
pub const WHITE: Self
A white color.
This value is specific to the color space.
More comprehensive pre-defined colors are available
in the color::palette
module.
Sourcepub fn convert<TargetCS: ColorSpace>(self) -> OpaqueColor<TargetCS>
pub fn convert<TargetCS: ColorSpace>(self) -> OpaqueColor<TargetCS>
Convert a color into a different color space.
Sourcepub const fn with_alpha(self, alpha: f32) -> AlphaColor<CS>
pub const fn with_alpha(self, alpha: f32) -> AlphaColor<CS>
Add an alpha channel.
This function is the inverse of AlphaColor::split
.
Sourcepub fn difference(self, other: Self) -> f32
pub fn difference(self, other: Self) -> f32
Difference between two colors by Euclidean metric.
Sourcepub fn lerp_rect(self, other: Self, t: f32) -> Self
pub fn lerp_rect(self, other: Self, t: f32) -> Self
Linearly interpolate colors, without hue fixup.
This method produces meaningful results in rectangular color spaces, or if hue fixup has been applied.
Sourcepub fn fixup_hues(self, other: &mut Self, direction: HueDirection)
pub fn fixup_hues(self, other: &mut Self, direction: HueDirection)
Apply hue fixup for interpolation.
Adjust the hue angle of other
so that linear interpolation results in
the expected hue direction.
Sourcepub fn lerp(self, other: Self, t: f32, direction: HueDirection) -> Self
pub fn lerp(self, other: Self, t: f32, direction: HueDirection) -> Self
Linearly interpolate colors, with hue fixup if needed.
Sourcepub fn scale_chroma(self, scale: f32) -> Self
pub fn scale_chroma(self, scale: f32) -> Self
Scale the chroma by the given amount.
See ColorSpace::scale_chroma
for more details.
Sourcepub fn relative_luminance(self) -> f32
pub fn relative_luminance(self) -> f32
Compute the relative luminance of the color.
This can be useful for choosing contrasting colors, and follows the WCAG 2.1 spec.
Sourcepub fn map_in<TargetCS: ColorSpace>(
self,
f: impl Fn(f32, f32, f32) -> [f32; 3],
) -> Self
pub fn map_in<TargetCS: ColorSpace>( self, f: impl Fn(f32, f32, f32) -> [f32; 3], ) -> Self
Map components in a given color space.
Sourcepub fn map_lightness(self, f: impl Fn(f32) -> f32) -> Self
pub fn map_lightness(self, f: impl Fn(f32) -> f32) -> Self
Map the lightness of the color.
In a color space that naturally has a lightness component, map that value. Otherwise, do the mapping in Oklab. The lightness range is normalized so that 1.0 is white. That is the normal range for Oklab but differs from the range in Lab, Lch, and Hsl.
§Examples
use color::{Lab, OpaqueColor};
let color = OpaqueColor::<Lab>::new([40., 4., -17.]);
let lighter = color.map_lightness(|l| l + 0.2);
let expected = OpaqueColor::<Lab>::new([60., 4., -17.]);
assert!(lighter.difference(expected) < 1e-4);
Sourcepub fn map_hue(self, f: impl Fn(f32) -> f32) -> Self
pub fn map_hue(self, f: impl Fn(f32) -> f32) -> Self
Map the hue of the color.
In a color space that naturally has a hue component, map that value. Otherwise, do the mapping in Oklch. The hue is in degrees.
§Examples
use color::{Oklab, OpaqueColor};
let color = OpaqueColor::<Oklab>::new([0.5, 0.2, -0.1]);
let complementary = color.map_hue(|h| (h + 180.) % 360.);
let expected = OpaqueColor::<Oklab>::new([0.5, -0.2, 0.1]);
assert!(complementary.difference(expected) < 1e-4);
Sourcepub fn to_rgba8(self) -> Rgba8
pub fn to_rgba8(self) -> Rgba8
Convert the color to sRGB if not already in sRGB, and pack into 8 bit per component integer encoding.
The RGB components are mapped from the floating point range of 0.0-1.0
to the integer
range of 0-255
. Component values outside of this range are saturated to 0 or 255. The
alpha component is set to 255.
§Implementation note
This performs almost-correct rounding, see the note on AlphaColor::to_rgba8
.
Trait Implementations§
Source§impl<CS: ColorSpace> Add for OpaqueColor<CS>
Component-wise addition of components.
impl<CS: ColorSpace> Add for OpaqueColor<CS>
Component-wise addition of components.
Source§impl<CS> BitEq for OpaqueColor<CS>
impl<CS> BitEq for OpaqueColor<CS>
Source§impl<CS> BitHash for OpaqueColor<CS>
impl<CS> BitHash for OpaqueColor<CS>
Source§impl<CS: Clone> Clone for OpaqueColor<CS>
impl<CS: Clone> Clone for OpaqueColor<CS>
Source§fn clone(&self) -> OpaqueColor<CS>
fn clone(&self) -> OpaqueColor<CS>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<CS: Debug> Debug for OpaqueColor<CS>
impl<CS: Debug> Debug for OpaqueColor<CS>
Source§impl<CS: ColorSpace> Div<f32> for OpaqueColor<CS>
Divide components by a scalar.
impl<CS: ColorSpace> Div<f32> for OpaqueColor<CS>
Divide components by a scalar.
Source§impl<CS: ColorSpace> From<OpaqueColor<CS>> for AlphaColor<CS>
impl<CS: ColorSpace> From<OpaqueColor<CS>> for AlphaColor<CS>
Source§fn from(value: OpaqueColor<CS>) -> Self
fn from(value: OpaqueColor<CS>) -> Self
Source§impl<CS: ColorSpace> From<OpaqueColor<CS>> for PremulColor<CS>
impl<CS: ColorSpace> From<OpaqueColor<CS>> for PremulColor<CS>
Source§fn from(value: OpaqueColor<CS>) -> Self
fn from(value: OpaqueColor<CS>) -> Self
Source§impl<CS: ColorSpace> FromStr for OpaqueColor<CS>
impl<CS: ColorSpace> FromStr for OpaqueColor<CS>
Source§impl<CS: ColorSpace> Mul<OpaqueColor<CS>> for f32
Multiply components by a scalar.
impl<CS: ColorSpace> Mul<OpaqueColor<CS>> for f32
Multiply components by a scalar.
Source§type Output = OpaqueColor<CS>
type Output = OpaqueColor<CS>
*
operator.Source§impl<CS: ColorSpace> Mul<f32> for OpaqueColor<CS>
Multiply components by a scalar.
impl<CS: ColorSpace> Mul<f32> for OpaqueColor<CS>
Multiply components by a scalar.
Source§impl<CS: ColorSpace> PartialEq for OpaqueColor<CS>
impl<CS: ColorSpace> PartialEq for OpaqueColor<CS>
Source§impl<CS: ColorSpace> Sub for OpaqueColor<CS>
Component-wise subtraction of components.
impl<CS: ColorSpace> Sub for OpaqueColor<CS>
Component-wise subtraction of components.
Source§impl<CS: ColorSpace> TransparentWrapper<[f32; 3]> for OpaqueColor<CS>
impl<CS: ColorSpace> TransparentWrapper<[f32; 3]> for OpaqueColor<CS>
Source§fn wrap_ref(s: &Inner) -> &Self
fn wrap_ref(s: &Inner) -> &Self
Source§fn wrap_mut(s: &mut Inner) -> &mut Self
fn wrap_mut(s: &mut Inner) -> &mut Self
Source§fn wrap_slice(s: &[Inner]) -> &[Self]where
Self: Sized,
fn wrap_slice(s: &[Inner]) -> &[Self]where
Self: Sized,
Source§fn wrap_slice_mut(s: &mut [Inner]) -> &mut [Self]where
Self: Sized,
fn wrap_slice_mut(s: &mut [Inner]) -> &mut [Self]where
Self: Sized,
Source§fn peel_ref(s: &Self) -> &Inner
fn peel_ref(s: &Self) -> &Inner
Source§fn peel_mut(s: &mut Self) -> &mut Inner
fn peel_mut(s: &mut Self) -> &mut Inner
Source§fn peel_slice(s: &[Self]) -> &[Inner]where
Self: Sized,
fn peel_slice(s: &[Self]) -> &[Inner]where
Self: Sized,
Source§fn peel_slice_mut(s: &mut [Self]) -> &mut [Inner]where
Self: Sized,
fn peel_slice_mut(s: &mut [Self]) -> &mut [Inner]where
Self: Sized,
Source§impl<CS: ColorSpace> Zeroable for OpaqueColor<CS>
impl<CS: ColorSpace> Zeroable for OpaqueColor<CS>
impl<CS: Copy> Copy for OpaqueColor<CS>
impl<CS: ColorSpace> Pod for OpaqueColor<CS>
Auto Trait Implementations§
impl<CS> Freeze for OpaqueColor<CS>
impl<CS> RefUnwindSafe for OpaqueColor<CS>where
CS: RefUnwindSafe,
impl<CS> Send for OpaqueColor<CS>where
CS: Send,
impl<CS> Sync for OpaqueColor<CS>where
CS: Sync,
impl<CS> Unpin for OpaqueColor<CS>where
CS: Unpin,
impl<CS> UnwindSafe for OpaqueColor<CS>where
CS: UnwindSafe,
Blanket Implementations§
Source§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<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
Source§type Bits = T
type Bits = T
Self
must have the same layout as the specified Bits
except for
the possible invalid bit patterns being checked during
is_valid_bit_pattern
.Source§fn is_valid_bit_pattern(_bits: &T) -> bool
fn is_valid_bit_pattern(_bits: &T) -> bool
bits
as &Self
.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<I, T> TransparentWrapperAlloc<I> for T
impl<I, T> TransparentWrapperAlloc<I> for T
Source§fn wrap_vec(s: Vec<Inner>) -> Vec<Self>where
Self: Sized,
fn wrap_vec(s: Vec<Inner>) -> Vec<Self>where
Self: Sized,
Source§fn wrap_box(s: Box<Inner>) -> Box<Self>
fn wrap_box(s: Box<Inner>) -> Box<Self>
Source§fn wrap_rc(s: Rc<Inner>) -> Rc<Self>
fn wrap_rc(s: Rc<Inner>) -> Rc<Self>
Rc
to the inner type into an Rc
to the wrapper type.Source§fn wrap_arc(s: Arc<Inner>) -> Arc<Self>
fn wrap_arc(s: Arc<Inner>) -> Arc<Self>
Arc
to the inner type into an Arc
to the wrapper type.