use super::convert::ConvertFrom;
use super::{Color, Zero};
#[derive(Copy, Clone, Debug)]
#[repr(C)]
pub struct RgbFloat {
pub r: f32,
pub g: f32,
pub b: f32,
}
impl Zero for RgbFloat {
const ZERO: Self = Self {
r: 0.0,
g: 0.0,
b: 0.0,
};
}
impl Color for RgbFloat {
fn as_rgba(&self) -> (u32, u32, u32, u32) {
let [r, g, b, _] =
fast_srgb8::f32x4_to_srgb8([self.r, self.g, self.b, 0f32]).map(|x| x as u32);
let r = r | (r << 8);
let g = g | (g << 8);
let b = b | (b << 8);
let a = 0xffff;
(r, g, b, a)
}
}
impl<C: Color> ConvertFrom<C> for RgbFloat {
fn convert_from(c: C) -> RgbFloat {
let (r, g, b, _) = c.as_rgba();
RgbFloat {
r: fast_srgb8::srgb8_to_f32(((r >> 8) & 0xff) as u8),
g: fast_srgb8::srgb8_to_f32(((g >> 8) & 0xff) as u8),
b: fast_srgb8::srgb8_to_f32(((b >> 8) & 0xff) as u8),
}
}
}