mod d_series;
mod ten_deg;
mod two_deg;
pub use d_series::CIE_ILLUMINANT_D50;
pub use d_series::CIE_ILLUMINANT_D65;
pub use ten_deg::CIE_OBSERVER_10DEG_1964;
pub use two_deg::CIE_OBSERVER_2DEG_1931;
#[cfg(test)]
mod test {
use super::{
CIE_ILLUMINANT_D50, CIE_ILLUMINANT_D65, CIE_OBSERVER_10DEG_1964, CIE_OBSERVER_2DEG_1931,
};
use crate::core::{Sum, ThreeSum};
use crate::spectrum::{IlluminatedObserver, SpectralDistribution, ONE_NANOMETER};
use crate::Float;
#[test]
fn test_checksum() {
for illuminant in [&CIE_ILLUMINANT_D50, &CIE_ILLUMINANT_D65] {
let mut sum = Sum::new();
for wavelength in illuminant.range() {
assert_eq!(*illuminant.at(wavelength), illuminant[wavelength]);
sum += illuminant[wavelength];
}
assert_eq!(sum.value(), illuminant.checksum());
}
for observer in [&CIE_OBSERVER_2DEG_1931, &CIE_OBSERVER_10DEG_1964] {
let mut sum = ThreeSum::new();
for wavelength in observer.range() {
assert_eq!(*observer.at(wavelength), observer[wavelength]);
sum += observer[wavelength];
}
assert_eq!(sum.value(), observer.checksum());
}
}
#[test]
fn test_tristimulus() {
fn round5(c: Float) -> Float {
(c * 100_000.0).round() / 100_000.0
}
for (illuminant, observer, tristimulus, chromaticity) in [
(
&CIE_ILLUMINANT_D65,
&CIE_OBSERVER_2DEG_1931,
[0.95047, 1.0, 1.08883],
(0.31273, 0.32902),
),
(
&CIE_ILLUMINANT_D65,
&CIE_OBSERVER_10DEG_1964,
[0.94811, 1.0, 1.07305],
(0.31382, 0.33100),
),
] {
let table = IlluminatedObserver::new(illuminant, observer);
assert_eq!(table.start(), 360);
assert_eq!(table.end(), 831);
assert_eq!(table.range(), table.start()..table.end());
let mut sum = ThreeSum::new();
for index in table.range() {
sum += table[index];
}
let [x, y, z] = sum.value();
let actual_tristimulus = [round5(x / y), 1.0, round5(z / y)];
assert_eq!(actual_tristimulus, tristimulus);
let color = table
.visual_gamut(ONE_NANOMETER)
.pulse_color(0, table.len());
let [x, y, z] = *color.as_ref();
let pulse_tristimulus = [round5(x), round5(y), round5(z)];
assert_eq!(pulse_tristimulus, tristimulus);
let (x, y) = color.xy_chromaticity();
let actual_chromaticity = (round5(x), round5(y));
assert_eq!(actual_chromaticity, chromaticity);
}
}
}