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