palette/cam16/math/
luminance.rs
1use crate::{
2 bool_mask::LazySelect,
3 cam16::BakedParameters,
4 num::{Arithmetics, FromScalar, PartialCmp, Real, Sqrt, Zero},
5};
6#[derive(Clone, Copy, PartialEq, Eq, Debug)]
8#[non_exhaustive]
9pub(crate) enum LuminanceType<T> {
10 Lightness(T),
12
13 Brightness(T),
16}
17
18impl<T> LuminanceType<T> {
19 pub(crate) fn into_cam16<Wp>(self, parameters: BakedParameters<Wp, T::Scalar>) -> (T, T)
20 where
21 T: Real + FromScalar + Zero + Arithmetics + Sqrt + PartialCmp + Clone,
22 T::Mask: LazySelect<T> + Clone,
23 {
24 let parameters = parameters.inner;
25
26 match self {
27 LuminanceType::Lightness(lightness) => {
28 let is_black = lightness.eq(&T::zero());
29 let brightness = lazy_select! {
30 if is_black => T::zero(),
31 else => crate::cam16::math::lightness_to_brightness(
32 lightness.clone(),
33 T::from_scalar(parameters.c),
34 T::from_scalar(parameters.a_w),
35 T::from_scalar(parameters.f_l_4),
36 )
37 };
38
39 (lightness, brightness)
40 }
41 LuminanceType::Brightness(brightness) => {
42 let is_black = brightness.eq(&T::zero());
43 let lightness = lazy_select! {
44 if is_black => T::zero(),
45 else => crate::cam16::math::brightness_to_lightness(
46 brightness.clone(),
47 T::from_scalar(parameters.c),
48 T::from_scalar(parameters.a_w),
49 T::from_scalar(parameters.f_l_4),
50 )
51 };
52
53 (lightness, brightness)
54 }
55 }
56 }
57}