#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ContentLightLevel {
pub max_content_light_level: u16,
pub max_frame_average_light_level: u16,
}
impl ContentLightLevel {
pub const fn new(max_content_light_level: u16, max_frame_average_light_level: u16) -> Self {
Self {
max_content_light_level,
max_frame_average_light_level,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MasteringDisplay {
pub primaries_xy: [[f32; 2]; 3],
pub white_point_xy: [f32; 2],
pub max_luminance: f32,
pub min_luminance: f32,
}
impl MasteringDisplay {
pub const fn new(
primaries_xy: [[f32; 2]; 3],
white_point_xy: [f32; 2],
max_luminance: f32,
min_luminance: f32,
) -> Self {
Self {
primaries_xy,
white_point_xy,
max_luminance,
min_luminance,
}
}
pub const HDR10_REFERENCE: Self = Self {
primaries_xy: [[0.708, 0.292], [0.170, 0.797], [0.131, 0.046]],
white_point_xy: [0.3127, 0.3290],
max_luminance: 10000.0,
min_luminance: 0.0001,
};
pub const DISPLAY_P3_1000: Self = Self {
primaries_xy: [[0.680, 0.320], [0.265, 0.690], [0.150, 0.060]],
white_point_xy: [0.3127, 0.3290],
max_luminance: 1000.0,
min_luminance: 0.0001,
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn content_light_level_new() {
let cll = ContentLightLevel::new(1000, 500);
assert_eq!(cll.max_content_light_level, 1000);
assert_eq!(cll.max_frame_average_light_level, 500);
}
#[test]
fn content_light_level_default() {
let cll = ContentLightLevel::default();
assert_eq!(cll.max_content_light_level, 0);
assert_eq!(cll.max_frame_average_light_level, 0);
}
#[test]
fn mastering_display_new() {
let md = MasteringDisplay::new(
[[0.68, 0.32], [0.265, 0.69], [0.15, 0.06]],
[0.3127, 0.329],
1000.0,
0.001,
);
assert_eq!(md.max_luminance, 1000.0);
assert_eq!(md.min_luminance, 0.001);
}
#[test]
fn mastering_display_constants() {
assert_eq!(MasteringDisplay::HDR10_REFERENCE.max_luminance, 10000.0);
assert_eq!(MasteringDisplay::DISPLAY_P3_1000.max_luminance, 1000.0);
}
#[test]
fn content_light_level_clone_eq() {
let a = ContentLightLevel::new(100, 50);
let b = a;
assert_eq!(a, b);
}
#[test]
#[cfg(feature = "std")]
fn content_light_level_hash() {
use core::hash::{Hash, Hasher};
let a = ContentLightLevel::new(100, 50);
let b = a;
let mut h1 = std::hash::DefaultHasher::new();
a.hash(&mut h1);
let mut h2 = std::hash::DefaultHasher::new();
b.hash(&mut h2);
assert_eq!(h1.finish(), h2.finish());
}
}