pub(crate) const SRGB_V4_ICC: &[u8] = include_bytes!("profiles/srgb_v4.icc");
pub(crate) const DISPLAY_P3_V4_ICC: &[u8] = include_bytes!("profiles/display_p3_v4.icc");
pub(crate) const ADOBE_RGB_V4_ICC: &[u8] = include_bytes!("profiles/adobe_rgb_v4.icc");
pub(crate) fn icc_for(gamut: crate::encode::OutputGamut) -> &'static [u8] {
use crate::encode::OutputGamut;
match gamut {
OutputGamut::Srgb => SRGB_V4_ICC,
OutputGamut::DisplayP3 => DISPLAY_P3_V4_ICC,
OutputGamut::AdobeRgb => ADOBE_RGB_V4_ICC,
}
}
#[cfg(test)]
mod tests {
use super::SRGB_V4_ICC;
#[test]
fn srgb_v4_icc_blob_is_v4() {
assert!(SRGB_V4_ICC.len() >= 128, "ICC header is 128 bytes minimum");
assert_eq!(
SRGB_V4_ICC[8], 0x04,
"expected v4 profile, got major version {:#x}",
SRGB_V4_ICC[8]
);
}
#[test]
fn srgb_v4_icc_blob_is_display_class() {
assert_eq!(
&SRGB_V4_ICC[12..16],
b"mntr",
"expected display-class profile (mntr)"
);
}
#[test]
fn srgb_v4_icc_blob_is_rgb_color_space() {
assert_eq!(&SRGB_V4_ICC[16..20], b"RGB ", "expected RGB color space");
}
#[test]
fn srgb_v4_icc_blob_size_in_expected_range() {
let n = SRGB_V4_ICC.len();
assert!(
(500..=800).contains(&n),
"expected blob size in 500..=800, got {}",
n
);
}
#[test]
fn new_gamut_blobs_are_v4_rgb_display_profiles() {
use super::{ADOBE_RGB_V4_ICC, DISPLAY_P3_V4_ICC};
for (name, blob) in [
("display_p3", DISPLAY_P3_V4_ICC),
("adobe_rgb", ADOBE_RGB_V4_ICC),
] {
assert!(blob.len() >= 128, "{name}: ICC header is 128 bytes minimum");
assert_eq!(blob[8], 0x04, "{name}: expected v4 profile");
assert_eq!(&blob[12..16], b"mntr", "{name}: expected display class");
assert_eq!(&blob[16..20], b"RGB ", "{name}: expected RGB color space");
assert!(
(500..=800).contains(&blob.len()),
"{name}: expected blob size in 500..=800, got {}",
blob.len()
);
}
}
}