pub use oklab::Oklab;
use super::convert::ConvertFrom;
#[cfg(feature = "col-nrgba64")]
use super::Endianness;
#[cfg(feature = "col-nrgba")]
use super::Nrgba;
#[cfg(feature = "col-rgb")]
use super::Rgb;
use super::{Color, Zero};
#[cfg(feature = "col-nrgba64")]
use super::{Nrgba64, Nrgba64Channels};
#[allow(unused_imports)]
use crate::specialized;
impl Zero for Oklab {
const ZERO: Self = Oklab {
l: 0.0,
a: 0.0,
b: 0.0,
};
}
impl Color for Oklab {
fn as_rgba(&self) -> (u32, u32, u32, u32) {
let oklab::Rgb { r, g, b } = oklab::oklab_to_srgb(*self);
let r = r as u32;
let g = g as u32;
let b = b 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 Oklab {
fn convert_from(c: C) -> Oklab {
let (r, g, b, _) = c.as_rgba();
oklab::srgb_to_oklab(oklab::Rgb {
r: ((r >> 8) & 0xff) as u8,
g: ((g >> 8) & 0xff) as u8,
b: ((b >> 8) & 0xff) as u8,
})
}
}
#[cfg(feature = "col-rgb")]
impl ConvertFrom<Rgb, specialized::For<Oklab>> for Oklab {
#[inline]
fn convert_from(Rgb { r, g, b }: Rgb) -> Oklab {
oklab::srgb_to_oklab(oklab::Rgb { r, g, b })
}
}
#[cfg(feature = "col-nrgba")]
impl ConvertFrom<Nrgba, specialized::For<Oklab>> for Oklab {
#[inline]
fn convert_from(Nrgba { r, g, b, .. }: Nrgba) -> Oklab {
oklab::srgb_to_oklab(oklab::Rgb { r, g, b })
}
}
#[cfg(feature = "col-nrgba64")]
impl<E> ConvertFrom<Nrgba64<E>, specialized::For<Oklab>> for Oklab
where
Nrgba64<E>: Copy + Color + Nrgba64Channels,
E: Endianness,
{
#[inline]
fn convert_from(c: Nrgba64<E>) -> Oklab {
oklab::linear_srgb_to_oklab(oklab::Rgb {
r: c.r() as f32 / 65535.0,
g: c.g() as f32 / 65535.0,
b: c.b() as f32 / 65535.0,
})
}
}
#[cfg(feature = "col-nrgba64")]
impl<E> ConvertFrom<Oklab, specialized::For<Nrgba64<E>>> for Nrgba64<E>
where
Nrgba64<E>: Copy + Color + Zero + Nrgba64Channels,
{
#[inline]
fn convert_from(c: Oklab) -> Nrgba64<E> {
let oklab::Rgb { r, g, b } = oklab::oklab_to_linear_srgb(c);
let mut result = Nrgba64::ZERO;
result = result.set_r((r * 65535.0).round() as u16);
result = result.set_g((g * 65535.0).round() as u16);
result = result.set_b((b * 65535.0).round() as u16);
result = result.set_a(0xffff);
result
}
}