use crate::color::{self, Component, IntoLinSrgba, LinSrgba};
use crate::math::num_traits::Float;
pub type DefaultSrgba = color::Srgba<color::DefaultScalar>;
pub type DefaultLinSrgba = color::LinSrgba<color::DefaultScalar>;
pub trait SetColor<S>: Sized
where
S: Component,
{
fn rgba_mut(&mut self) -> &mut Option<LinSrgba<S>>;
fn color<C>(mut self, color: C) -> Self
where
C: IntoLinSrgba<S>,
{
*self.rgba_mut() = Some(color.into_lin_srgba());
self
}
fn rgb<T>(self, r: T, g: T, b: T) -> Self
where
T: Component,
S: Float,
{
self.color(color::Srgb::new(r, g, b))
}
fn rgb8(self, r: u8, g: u8, b: u8) -> Self
where
S: Float,
{
self.color(color::Srgb::<u8>::new(r, g, b))
}
fn rgba<T>(self, r: T, g: T, b: T, a: T) -> Self
where
T: Component,
S: Float,
{
self.color(color::Srgba::new(r, g, b, a))
}
fn rgba8(self, r: u8, g: u8, b: u8, a: u8) -> Self
where
S: Float,
{
self.color(color::Srgba::<u8>::new(r, g, b, a))
}
fn hsl(self, h: S, s: S, l: S) -> Self
where
S: Float + Into<color::RgbHue<S>>,
{
let hue = color::RgbHue::from_degrees(h * S::from(360.0).unwrap());
self.color(color::Hsl::new(hue, s, l))
}
fn hsla(self, h: S, s: S, l: S, a: S) -> Self
where
S: Float + Into<color::RgbHue<S>>,
{
let hue = color::RgbHue::from_degrees(h * S::from(360.0).unwrap());
self.color(color::Hsla::new(hue, s, l, a))
}
fn hsv(self, h: S, s: S, v: S) -> Self
where
S: Float,
{
let hue = color::RgbHue::from_degrees(h * S::from(360.0).unwrap());
self.color(color::Hsv::new(hue, s, v))
}
fn hsva(self, h: S, s: S, v: S, a: S) -> Self
where
S: Float,
{
let hue = color::RgbHue::from_degrees(h * S::from(360.0).unwrap());
self.color(color::Hsva::new(hue, s, v, a))
}
fn gray<T>(self, g: T) -> Self
where
T: Component,
S: Float,
{
self.color(color::Srgb::new(g, g, g))
}
}
impl<S> SetColor<S> for Option<LinSrgba<S>>
where
S: Component,
{
fn rgba_mut(&mut self) -> &mut Option<LinSrgba<S>> {
self
}
}