#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Hash)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl Rgb {
pub fn new(r: u8, g: u8, b: u8) -> Self {
Self { r, g, b }
}
pub fn to_packed(self) -> f32 {
rgb_to_float(self.r, self.g, self.b)
}
pub fn from_packed(f: f32) -> Self {
let (r, g, b) = float_to_rgb(f);
Self { r, g, b }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Hash)]
pub struct Rgba {
pub r: u8,
pub g: u8,
pub b: u8,
pub a: u8,
}
impl Rgba {
pub fn new(r: u8, g: u8, b: u8, a: u8) -> Self {
Self { r, g, b, a }
}
pub fn to_packed(self) -> f32 {
rgba_to_float(self.r, self.g, self.b, self.a)
}
pub fn from_packed(f: f32) -> Self {
let (r, g, b, a) = float_to_rgba(f);
Self { r, g, b, a }
}
}
pub fn rgb_to_float(r: u8, g: u8, b: u8) -> f32 {
let packed: u32 = (r as u32) << 16 | (g as u32) << 8 | (b as u32);
f32::from_bits(packed)
}
pub fn float_to_rgb(f: f32) -> (u8, u8, u8) {
let packed = f.to_bits();
let r = ((packed >> 16) & 0xFF) as u8;
let g = ((packed >> 8) & 0xFF) as u8;
let b = (packed & 0xFF) as u8;
(r, g, b)
}
pub fn rgba_to_float(r: u8, g: u8, b: u8, a: u8) -> f32 {
let packed: u32 = (a as u32) << 24 | (r as u32) << 16 | (g as u32) << 8 | (b as u32);
f32::from_bits(packed)
}
pub fn float_to_rgba(f: f32) -> (u8, u8, u8, u8) {
let packed = f.to_bits();
let a = ((packed >> 24) & 0xFF) as u8;
let r = ((packed >> 16) & 0xFF) as u8;
let g = ((packed >> 8) & 0xFF) as u8;
let b = (packed & 0xFF) as u8;
(r, g, b, a)
}