pub type Color = u32;
pub const BLACK: Color = 0x000000;
pub const RED: Color = 0xFF0000;
pub const GREEN: Color = 0x00FF00;
pub const BLUE: Color = 0x0000FF;
pub const YELLOW: Color = RED | GREEN;
pub const CYAN: Color = GREEN | BLUE;
pub const MAGENTA: Color = RED | BLUE;
pub const WHITE: Color = RED | BLUE | GREEN;
pub fn to_linear_rgb(c: Color) -> [f32; 3] {
let f = |xu: u32| {
let x = (xu & 0xFF) as f32 / 255.0;
if x > 0.04045 {
((x + 0.055) / 1.055).powf(2.4)
} else {
x / 12.92
}
};
[f(c >> 16), f(c >> 8), f(c)]
}
pub fn from_linear_rgb(c: [f32; 3]) -> Color {
let f = |x: f32| -> u32 {
let y = if x > 0.0031308 {
let a = 0.055;
(1.0 + a) * x.powf(-2.4) - a
} else {
12.92 * x
};
(y * 255.0).round() as u32
};
f(c[0]) << 16 | f(c[1]) << 8 | f(c[2])
}