pub struct RGBColor {
pub r: f64,
pub g: f64,
pub b: f64,
}
Expand description
A color with red, green, and blue primaries of specified intensity, specifically in the sRGB
gamut: most computer screens use this to display colors. The attributes r
, g
, and b
are
floating-point numbers from 0 to 1 for visible colors, allowing the avoidance of rounding errors
or clamping errors when converting to and from RGB. Many conveniences are afforded so that
working with RGB as if it were instead three integers from 0-255 is painless. Note that the
integers generated from the underlying floating-point numbers round away from 0.
Examples of this abound: this is used ubiquitously in Scarlet. Check the
Color
documentation for plenty.
Fields§
§r: f64
The red component. Ranges from 0 to 1 for numbers displayable by sRGB machines.
g: f64
The green component. Ranges from 0 to 1 for numbers displayable by sRGB machines.
b: f64
The blue component. Ranges from 0 to 1 for numbers displayable by sRGB machines.
Implementations§
source§impl RGBColor
impl RGBColor
sourcepub fn int_r(&self) -> u8
pub fn int_r(&self) -> u8
Gets an 8-byte version of the red component, as a u8
. Clamps values outside of the range 0-1
and discretizes, so this may not correspond to the exact values kept internally.
Example
let super_red = RGBColor{r: 1.2, g: 0., b: 0.};
let non_integral_red = RGBColor{r: 0.999, g: 0., b: 0.};
// the first one will get clamped in range, the second one will be rounded
assert_eq!(super_red.int_r(), non_integral_red.int_r());
assert_eq!(super_red.int_r(), 255);
sourcepub fn int_g(&self) -> u8
pub fn int_g(&self) -> u8
Gets an 8-byte version of the green component, as a u8
. Clamps values outside of the range 0-1
and discretizes, so this may not correspond to the exact values kept internally.
Example
let super_green = RGBColor{r: 0., g: 1.2, b: 0.};
let non_integral_green = RGBColor{r: 0., g: 0.999, b: 0.};
// the first one will get clamped in range, the second one will be rounded
assert_eq!(super_green.int_g(), non_integral_green.int_g());
assert_eq!(super_green.int_g(), 255);
sourcepub fn int_b(&self) -> u8
pub fn int_b(&self) -> u8
Gets an 8-byte version of the blue component, as a u8
. Clamps values outside of the range 0-1
and discretizes, so this may not correspond to the exact values kept internally.
Example
let super_blue = RGBColor{r: 0., g: 0., b: 1.2};
let non_integral_blue = RGBColor{r: 0., g: 0., b: 0.999};
// the first one will get clamped in range, the second one will be rounded
assert_eq!(super_blue.int_b(), non_integral_blue.int_b());
assert_eq!(super_blue.int_b(), 255);
sourcepub fn int_rgb_tup(&self) -> (u8, u8, u8)
pub fn int_rgb_tup(&self) -> (u8, u8, u8)
Purely for convenience: gives a tuple with the three integer versions of the components. Used over standard conversion traits to avoid ambiguous operations.
Example
let color = RGBColor{r: 0.3, g: 0.6, b: 0.7};
assert_eq!(color.int_rgb_tup(), (color.int_r(), color.int_g(), color.int_b()));
source§impl RGBColor
impl RGBColor
sourcepub fn from_hex_code(hex: &str) -> Result<RGBColor, RGBParseError>
pub fn from_hex_code(hex: &str) -> Result<RGBColor, RGBParseError>
Given a string that represents a hex code, returns the RGB color that the given hex code
represents. Four formats are accepted: "#rgb"
as a shorthand for "#rrggbb"
, #rrggbb
by
itself, and either of those formats without #
: "rgb"
or "rrggbb"
are acceptable. Returns
a ColorParseError if the given string does not follow one of these formats.
Example
let fuchsia = RGBColor::from_hex_code("#ff00ff")?;
// if 3 digits, interprets as doubled
let fuchsia2 = RGBColor::from_hex_code("f0f")?;
assert_eq!(fuchsia.int_rgb_tup(), fuchsia2.int_rgb_tup());
assert_eq!(fuchsia.int_rgb_tup(), (255, 0, 255));
let err = RGBColor::from_hex_code("#afafa");
let err2 = RGBColor::from_hex_code("#gafd22");
assert_eq!(err, err2);
sourcepub fn from_color_name(name: &str) -> Result<RGBColor, RGBParseError>
pub fn from_color_name(name: &str) -> Result<RGBColor, RGBParseError>
Gets the RGB color corresponding to an X11 color name. Case is ignored.
Example
let fuchsia = RGBColor::from_color_name("fuchsia")?;
let fuchsia2 = RGBColor::from_color_name("FuCHSiA")?;
assert_eq!(fuchsia.int_rgb_tup(), fuchsia2.int_rgb_tup());
assert_eq!(fuchsia.int_rgb_tup(), (255, 0, 255));
let err = RGBColor::from_color_name("fuccshai");
let err2 = RGBColor::from_color_name("foobar");
assert_eq!(err, err2);
source§impl RGBColor
impl RGBColor
sourcepub fn from_material_palette(prim: MaterialPrimary) -> RGBColor
pub fn from_material_palette(prim: MaterialPrimary) -> RGBColor
Gets a Color from the Material palette, given a specification of such a color.
Example
let red_400 = RGBColor::from_material_palette(MaterialPrimary::Red(MaterialTone::Neutral(NeutralTone::W400)));
let amber_a100 = RGBColor::from_material_palette(MaterialPrimary::Amber(MaterialTone::Accent(AccentTone::A100)));
assert_eq!(red_400.to_string(), "#EF5350");
assert_eq!(amber_a100.to_string(), "#FFE57F");
Trait Implementations§
source§impl Bound for RGBColor
impl Bound for RGBColor
source§fn bounds() -> [(f64, f64); 3]
fn bounds() -> [(f64, f64); 3]
[(min1, max1), (min2, max2), (min3, max3)]
that represents the bounds on each
component of the color space, in the order that they appear in the Coord representation. If
some parts of the bounds don’t exist, using infinity or negative infinity works.source§fn clamp_coord(point: Coord) -> Coord
fn clamp_coord(point: Coord) -> Coord
source§fn clamp<T: ColorPoint>(color: T) -> T
fn clamp<T: ColorPoint>(color: T) -> T
source§impl Color for RGBColor
impl Color for RGBColor
source§fn from_xyz(xyz: XYZColor) -> RGBColor
fn from_xyz(xyz: XYZColor) -> RGBColor
source§fn to_xyz(&self, illuminant: Illuminant) -> XYZColor
fn to_xyz(&self, illuminant: Illuminant) -> XYZColor
source§fn convert<T: Color>(&self) -> T
fn convert<T: Color>(&self) -> T
collect()
and other methods in the standard library, the use of
type inference will usually allow for clean syntax, but occasionally the turbofish is
necessary. Read moresource§fn hue(&self) -> f64
fn hue(&self) -> f64
source§fn set_hue(&mut self, new_hue: f64)
fn set_hue(&mut self, new_hue: f64)
source§fn lightness(&self) -> f64
fn lightness(&self) -> f64
source§fn set_lightness(&mut self, new_lightness: f64)
fn set_lightness(&mut self, new_lightness: f64)
source§fn chroma(&self) -> f64
fn chroma(&self) -> f64
source§fn set_chroma(&mut self, new_chroma: f64)
fn set_chroma(&mut self, new_chroma: f64)
source§fn saturation(&self) -> f64
fn saturation(&self) -> f64
source§fn set_saturation(&mut self, new_sat: f64)
fn set_saturation(&mut self, new_sat: f64)
source§fn grayscale(&self) -> Selfwhere
Self: Sized,
fn grayscale(&self) -> Selfwhere Self: Sized,
Color
of the same type as before, but with chromaticity removed: effectively,
a color created solely using a mix of black and white that has the same lightness as
before. This uses the CIELAB luminance definition, which is considered a good standard and is
perceptually accurate for the most part. Read moresource§fn distance<T: Color>(&self, other: &T) -> f64
fn distance<T: Color>(&self, other: &T) -> f64
source§fn visually_indistinguishable<T: Color>(&self, other: &T) -> bool
fn visually_indistinguishable<T: Color>(&self, other: &T) -> bool
source§impl PartialEq<RGBColor> for RGBColor
impl PartialEq<RGBColor> for RGBColor
impl Copy for RGBColor
Auto Trait Implementations§
impl RefUnwindSafe for RGBColor
impl Send for RGBColor
impl Sync for RGBColor
impl Unpin for RGBColor
impl UnwindSafe for RGBColor
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> ColorPoint for Twhere
T: Color + Into<Coord> + From<Coord> + Copy + Clone,
impl<T> ColorPoint for Twhere T: Color + Into<Coord> + From<Coord> + Copy + Clone,
source§fn euclidean_distance(self, other: Self) -> f64
fn euclidean_distance(self, other: Self) -> f64
distance()
function for
that.source§fn weighted_midpoint(self, other: Self, weight: f64) -> Self
fn weighted_midpoint(self, other: Self, weight: f64) -> Self
Color
. This is defined as the color corresponding to the point
along the line segment connecting the two points such that the distance to the second point
is the weight, which for most applications needs to be between 0 and 1. For example, a
weight of 0.9 would make the midpoint one-tenth as much affected by the second points as the
first.source§fn midpoint(self, other: Self) -> Self
fn midpoint(self, other: Self) -> Self
weighted_midpoint
, but with weight = 0.5
: essentially, the
Color
representing the midpoint of the two inputs in 3D space.source§fn weighted_average(
self,
others: Vec<Self>,
weights: Vec<f64>
) -> Result<Self, ColorCalcError>
fn weighted_average( self, others: Vec<Self>, weights: Vec<f64> ) -> Result<Self, ColorCalcError>
source§fn average(self, others: Vec<Self>) -> Coord
fn average(self, others: Vec<Self>) -> Coord
weighted_average
in the
case where each weight is the same.source§fn is_imaginary(&self) -> bool
fn is_imaginary(&self) -> bool
true
if the color is outside the range of human vision. Uses the CIE 1931 standard
observer spectral data.source§fn closest_real_color(&self) -> Self
fn closest_real_color(&self) -> Self
source§fn gradient_scale(&self, other: &Self, n: usize) -> Vec<Self>
fn gradient_scale(&self, other: &Self, n: usize) -> Vec<Self>
n
is the number of additional colors to add.source§fn gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>
fn gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>
self
, 1 returns other
, and anything in between returns a mix (calculated
linearly). Although it is possible to extrapolate outside of the range [0, 1], this is not
a guarantee and may change without warning. For more fine-grained control of gradients, see
the GradientColorMap
struct. Read moresource§fn cbrt_gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>
fn cbrt_gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>
self
, 1 returns other
, and anything in between returns a mix (calculated
by the cube root of the given value). Although it is possible to extrapolate outside of the
range [0, 1], this is not a guarantee and may change without warning. For more fine-grained
control of gradients, see the GradientColorMap
struct. Read moresource§fn padded_gradient(
&self,
other: &Self,
lower_pad: f64,
upper_pad: f64
) -> Box<dyn Fn(f64) -> Self>
fn padded_gradient( &self, other: &Self, lower_pad: f64, upper_pad: f64 ) -> Box<dyn Fn(f64) -> Self>
lower_pad
and upper_pad
such that an input of 0 returns the gradient at
lower_pad
, an input of 1 returns the gradient at upper_pad
, and values in-between are
mapped linearly inside that range. For more fine-grained control over gradients, see the
GradientColorMap
struct. Read more§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§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).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.