pub use prakash::spectral::{
CIE_1931_2DEG, Spd, VISIBLE_MAX_NM, VISIBLE_MIN_NM, cct_from_xy, cie_cmf_at,
color_rendering_index, color_temperature_to_rgb, illuminant_a, illuminant_d50, illuminant_d65,
illuminant_f2, illuminant_f11, linear_to_srgb_gamma, planck_radiance, srgb_gamma_to_linear,
wavelength_to_rgb, wien_peak,
};
pub use prakash::spectral::Rgb as PrakashRgb;
pub use prakash::spectral::Xyz as PrakashXyz;
use crate::color::CieXyz;
impl From<prakash::spectral::Xyz> for CieXyz {
#[inline]
fn from(xyz: prakash::spectral::Xyz) -> Self {
CieXyz {
x: xyz.x,
y: xyz.y,
z: xyz.z,
}
}
}
impl From<CieXyz> for prakash::spectral::Xyz {
#[inline]
fn from(xyz: CieXyz) -> Self {
prakash::spectral::Xyz::new(xyz.x, xyz.y, xyz.z)
}
}
#[must_use]
#[inline]
pub fn spd_to_xyz(spd: &Spd) -> CieXyz {
spd.to_xyz().into()
}
#[must_use]
#[inline]
pub fn xyz_to_cct(xyz: &CieXyz) -> f64 {
let pk_xyz = prakash::spectral::Xyz::new(xyz.x, xyz.y, xyz.z);
let (cx, cy, _) = pk_xyz.to_xyy();
cct_from_xy(cx, cy)
}
#[must_use]
#[inline]
pub fn wavelength_to_xyz(wavelength_nm: f64) -> CieXyz {
let (x, y, z) = cie_cmf_at(wavelength_nm);
CieXyz { x, y, z }
}
#[must_use]
#[inline]
pub fn d65_white() -> CieXyz {
prakash::spectral::Xyz::D65_WHITE.into()
}
#[must_use]
#[inline]
pub fn d50_white() -> CieXyz {
prakash::spectral::Xyz::D50_WHITE.into()
}
#[must_use]
#[inline]
pub fn blackbody_spd(temperature_k: f64) -> Spd {
Spd::blackbody(temperature_k)
}