ptsd2 0.1.2

Crate built to bridge design systems to Prism
Documentation
use prism::canvas;

#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Color(canvas::Color);

impl Default for Color {
    fn default() -> Color {Color::from_hex("#fa00d5", 255)}
}

impl Color {
    pub const WHITE: Color = Color(canvas::Color(255, 255, 255, 255));
    pub const BLACK: Color = Color(canvas::Color(0, 0, 0, 255));
    pub const TRANSPARENT: Color = Color(canvas::Color(0, 0, 0, 0));

    pub fn from_hex(color: &str, alpha: u8) -> Self {
        let ce = "Color was not a Hex Value";
        let c = hex::decode(color.strip_prefix('#').unwrap_or(color)).expect(ce);
        Color(canvas::Color(c[0], c[1], c[2], alpha))
    }

    pub fn darken(&self, factor: f32) -> Color {
        let c: canvas::Color = (*self).into();
        Color(canvas::Color((c.0 as f32 * (factor * 1.3)) as u8, (c.1 as f32 * (factor * 1.1)) as u8, (c.2 as f32 * factor) as u8, c.3))
    }

    pub fn is_high_contrast(&self) -> bool {
        let c: canvas::Color = (*self).into();
        0.299*(c.0 as f32) + 0.587*(c.1 as f32) + 0.114*(c.2 as f32) > 128.0
    }

    pub fn contrasted(&self) -> Color {
        let canvas::Color(r, g, b, _) = self.0;
        let r = r as f64 / 255.0;
        let g = g as f64 / 255.0;
        let b = b as f64 / 255.0;

        let luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
        let saturation = r.max(g.max(b)) - r.min(g.min(b));

        match luminance < 0.6 || (luminance < 0.75 && saturation > 0.25) {
            true => Color::WHITE,
            false => Color::BLACK
        }
    }

    pub fn from_canvas(color: canvas::Color) -> Self {
        Color(color)
    }
}

impl From<Color> for canvas::Color {
    fn from(val: Color) -> Self {
        val.0
    }
}