use crate::rgb::RGB;
use crate::xyz::{Illumination, XYZ};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Lab {
pub l: f32,
pub a: f32,
pub b: f32,
}
impl Lab {
pub fn xyz(self, illumination: Illumination) -> XYZ {
let l = (self.l + 16.0) * 0.008620689655;
let a = self.a * 0.002;
let b = self.b * 0.005;
let x = reverse(l + a) / illumination.reference.x;
let y = (reverse(l)) / illumination.reference.y;
let z = reverse(l - b) / illumination.reference.z;
XYZ { x, y, z }
}
pub fn rgb(self, illumination: Illumination) -> RGB {
self.xyz(illumination).rgb(illumination)
}
}
fn reverse(v: f32) -> f32 {
let u = v.powf(3.0);
if u > 8.8565e-03 {
u
} else {
(v - 0.1379) * 0.1284
}
}