#[derive(Clone, Copy, Default, Debug)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl Rgb {
pub const fn new(r: u8, g: u8, b: u8) -> Self {
Self { r, g, b }
}
pub fn from_hsv(h: f32, s: f32, v: f32) -> Self {
let h = h.rem_euclid(360.0);
let s = s.clamp(0.0, 1.0);
let v = v.clamp(0.0, 1.0);
let c = v * s;
let h_prime = h / 60.0;
let x = c * (1.0 - (h_prime.rem_euclid(2.0) - 1.0).abs());
let m = v - c;
let (r1, g1, b1) = match h_prime {
h if h < 1.0 => (c, x, 0.0),
h if h < 2.0 => (x, c, 0.0),
h if h < 3.0 => (0.0, c, x),
h if h < 4.0 => (0.0, x, c),
h if h < 5.0 => (x, 0.0, c),
_ => (c, 0.0, x),
};
Self {
r: ((r1 + m) * 255.0).round() as u8,
g: ((g1 + m) * 255.0).round() as u8,
b: ((b1 + m) * 255.0).round() as u8,
}
}
}