#[repr(transparent)]pub struct AlphaColor<CS> {
pub components: [f32; 4],
pub cs: PhantomData<CS>,
}
Expand description
A color with an alpha channel.
A color in a color space known at compile time, with an alpha channel.
See OpaqueColor
for a discussion of arithmetic traits and interpolation.
Fields§
§components: [f32; 4]
The components, which may be manipulated directly.
The interpretation of the first three components depends on the color space. The fourth component is separate alpha.
cs: PhantomData<CS>
The color space.
Implementations§
Source§impl<CS: ColorSpace> AlphaColor<CS>
impl<CS: ColorSpace> AlphaColor<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 TRANSPARENT: Self
pub const TRANSPARENT: Self
A transparent color.
This is a black color with full alpha.
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 const fn split(self) -> (OpaqueColor<CS>, f32)
pub const fn split(self) -> (OpaqueColor<CS>, f32)
Split into opaque and alpha components.
This function is the inverse of OpaqueColor::with_alpha
.
Sourcepub const fn with_alpha(self, alpha: f32) -> Self
pub const fn with_alpha(self, alpha: f32) -> Self
Set the alpha channel.
This replaces the existing alpha channel. To scale or
or otherwise modify the existing alpha channel, use
AlphaColor::multiply_alpha
or AlphaColor::map
.
let c = color::palette::css::GOLDENROD.with_alpha(0.5);
assert_eq!(0.5, c.split().1);
Sourcepub const fn discard_alpha(self) -> OpaqueColor<CS>
pub const fn discard_alpha(self) -> OpaqueColor<CS>
Split out the opaque components, discarding the alpha.
This is a shorthand for calling split
.
Sourcepub fn convert<TargetCs: ColorSpace>(self) -> AlphaColor<TargetCs>
pub fn convert<TargetCs: ColorSpace>(self) -> AlphaColor<TargetCs>
Convert a color into a different color space.
Sourcepub const fn premultiply(self) -> PremulColor<CS>
pub const fn premultiply(self) -> PremulColor<CS>
Convert a color to the corresponding premultiplied form.
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 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 const fn multiply_alpha(self, rhs: f32) -> Self
pub const fn multiply_alpha(self, rhs: f32) -> Self
Multiply alpha by the given factor.
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 map_in<TargetCS: ColorSpace>(
self,
f: impl Fn(f32, f32, f32, f32) -> [f32; 4],
) -> Self
pub fn map_in<TargetCS: ColorSpace>( self, f: impl Fn(f32, f32, f32, f32) -> [f32; 4], ) -> 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::{AlphaColor, Lab};
let color = AlphaColor::<Lab>::new([40., 4., -17., 1.]);
let lighter = color.map_lightness(|l| l + 0.2);
let expected = AlphaColor::<Lab>::new([60., 4., -17., 1.]);
assert!(lighter.premultiply().difference(expected.premultiply()) < 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::{AlphaColor, Oklab};
let color = AlphaColor::<Oklab>::new([0.5, 0.2, -0.1, 1.]);
let complementary = color.map_hue(|h| (h + 180.) % 360.);
let expected = AlphaColor::<Oklab>::new([0.5, -0.2, 0.1, 1.]);
assert!(complementary.premultiply().difference(expected.premultiply()) < 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 RGBA 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.
§Implementation note
This performs almost-correct rounding to be fast on both x86 and AArch64 hardware. Within the
saturated output range of this method, 0-255
, there is a single color component value
where results differ: 0.0019607842
. This method maps that component to integer value 1
;
it would more precisely be mapped to 0
.
Trait Implementations§
Source§impl<CS: ColorSpace> Add for AlphaColor<CS>
Component-wise addition of components.
impl<CS: ColorSpace> Add for AlphaColor<CS>
Component-wise addition of components.
Source§impl<CS> BitEq for AlphaColor<CS>
impl<CS> BitEq for AlphaColor<CS>
Source§impl<CS> BitHash for AlphaColor<CS>
impl<CS> BitHash for AlphaColor<CS>
Source§impl<CS: Clone> Clone for AlphaColor<CS>
impl<CS: Clone> Clone for AlphaColor<CS>
Source§fn clone(&self) -> AlphaColor<CS>
fn clone(&self) -> AlphaColor<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 AlphaColor<CS>
impl<CS: Debug> Debug for AlphaColor<CS>
Source§impl<CS: ColorSpace> Div<f32> for AlphaColor<CS>
Divide components by a scalar.
impl<CS: ColorSpace> Div<f32> for AlphaColor<CS>
Divide components by a scalar.
Source§impl<CS: ColorSpace> From<AlphaColor<CS>> for DynamicColorwhere
ColorSpaceTag: From<CS>,
Note that the conversion is only lossless for color spaces that have a corresponding tag.
This is why we have this additional trait bound. See also
https://github.com/linebender/color/pull/155 for more discussion.
impl<CS: ColorSpace> From<AlphaColor<CS>> for DynamicColorwhere
ColorSpaceTag: From<CS>,
Note that the conversion is only lossless for color spaces that have a corresponding tag. This is why we have this additional trait bound. See also https://github.com/linebender/color/pull/155 for more discussion.
Source§fn from(value: AlphaColor<CS>) -> Self
fn from(value: AlphaColor<CS>) -> Self
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> FromStr for AlphaColor<CS>
impl<CS: ColorSpace> FromStr for AlphaColor<CS>
Source§impl<CS: ColorSpace> Mul<AlphaColor<CS>> for f32
Multiply components by a scalar.
impl<CS: ColorSpace> Mul<AlphaColor<CS>> for f32
Multiply components by a scalar.
Source§type Output = AlphaColor<CS>
type Output = AlphaColor<CS>
*
operator.Source§impl<CS: ColorSpace> Mul<f32> for AlphaColor<CS>
Multiply components by a scalar.
impl<CS: ColorSpace> Mul<f32> for AlphaColor<CS>
Multiply components by a scalar.
Source§impl<CS: ColorSpace> PartialEq for AlphaColor<CS>
impl<CS: ColorSpace> PartialEq for AlphaColor<CS>
Source§impl<CS: ColorSpace> Sub for AlphaColor<CS>
Component-wise subtraction of components.
impl<CS: ColorSpace> Sub for AlphaColor<CS>
Component-wise subtraction of components.
Source§impl<CS: ColorSpace> TransparentWrapper<[f32; 4]> for AlphaColor<CS>
impl<CS: ColorSpace> TransparentWrapper<[f32; 4]> for AlphaColor<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 AlphaColor<CS>
impl<CS: ColorSpace> Zeroable for AlphaColor<CS>
impl<CS: Copy> Copy for AlphaColor<CS>
impl<CS: ColorSpace> Pod for AlphaColor<CS>
Auto Trait Implementations§
impl<CS> Freeze for AlphaColor<CS>
impl<CS> RefUnwindSafe for AlphaColor<CS>where
CS: RefUnwindSafe,
impl<CS> Send for AlphaColor<CS>where
CS: Send,
impl<CS> Sync for AlphaColor<CS>where
CS: Sync,
impl<CS> Unpin for AlphaColor<CS>where
CS: Unpin,
impl<CS> UnwindSafe for AlphaColor<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.