palette/
white_point.rs

1//! Defines the tristimulus values of the CIE Illuminants.
2//!
3//! White point is the reference white or target white as seen by a standard
4//! observer under a standard illuminant. For example, photographs taken indoors
5//! may be lit by incandescent lights, which are relatively orange compared to
6//! daylight. Defining "white" as daylight will give unacceptable results when
7//! attempting to color-correct a photograph taken with incandescent lighting.
8
9use crate::{num::Real, Xyz};
10
11/// Represents an unspecified reference white point.
12///
13/// Some color spaces (such as `Xyz` and `Yxy`) or operations don't necessarily
14/// need a known intended white point. `Any` may be used as a placeholder type
15/// in those situations.
16#[derive(Copy, Clone, Debug, PartialEq, Eq)]
17pub struct Any;
18
19/// WhitePoint defines the Xyz color co-ordinates for a given white point.
20///
21/// A white point (often referred to as reference white or target white in
22/// technical documents) is a set of tristimulus values or chromaticity
23/// coordinates that serve to define the color "white" in image capture,
24/// encoding, or reproduction.
25///
26/// Custom white points can be easily defined on an empty struct with the
27/// tristimulus values and can be used in place of the ones defined in this
28/// library.
29pub trait WhitePoint<T>: 'static {
30    /// Get the Xyz chromaticity co-ordinates for the white point.
31    fn get_xyz() -> Xyz<Any, T>;
32}
33
34/// CIE standard illuminant A
35///
36/// CIE standard illuminant A is intended to represent typical, domestic,
37/// tungsten-filament lighting. Its relative spectral power distribution is that
38/// of a Planckian radiator at a temperature of approximately 2856 K. Uses the
39/// CIE 1932 2° Standard Observer
40#[derive(Copy, Clone, Debug, PartialEq, Eq)]
41pub struct A;
42impl<T: Real> WhitePoint<T> for A {
43    #[inline]
44    fn get_xyz() -> Xyz<Any, T> {
45        Xyz::new(T::from_f64(1.09850), T::from_f64(1.0), T::from_f64(0.35585))
46    }
47}
48/// CIE standard illuminant B
49///
50/// CIE standard illuminant B represents noon sunlight, with a correlated color
51/// temperature (CCT) of 4874 K Uses the CIE 1932 2° Standard Observer
52#[derive(Copy, Clone, Debug, PartialEq, Eq)]
53pub struct B;
54impl<T: Real> WhitePoint<T> for B {
55    #[inline]
56    fn get_xyz() -> Xyz<Any, T> {
57        Xyz::new(T::from_f64(0.99072), T::from_f64(1.0), T::from_f64(0.85223))
58    }
59}
60/// CIE standard illuminant C
61///
62/// CIE standard illuminant C represents the average day light with a CCT of
63/// 6774 K Uses the CIE 1932 2° Standard Observer
64#[derive(Copy, Clone, Debug, PartialEq, Eq)]
65pub struct C;
66impl<T: Real> WhitePoint<T> for C {
67    #[inline]
68    fn get_xyz() -> Xyz<Any, T> {
69        Xyz::new(T::from_f64(0.98074), T::from_f64(1.0), T::from_f64(1.18232))
70    }
71}
72/// CIE D series standard illuminant - D50
73///
74/// D50 White Point is the natural daylight with a color temperature of around
75/// 5000K for 2° Standard Observer.
76#[derive(Copy, Clone, Debug, PartialEq, Eq)]
77pub struct D50;
78impl<T: Real> WhitePoint<T> for D50 {
79    #[inline]
80    fn get_xyz() -> Xyz<Any, T> {
81        Xyz::new(T::from_f64(0.96422), T::from_f64(1.0), T::from_f64(0.82521))
82    }
83}
84/// CIE D series standard illuminant - D55
85///
86/// D55 White Point is the natural daylight with a color temperature of around
87/// 5500K for 2° Standard Observer.
88#[derive(Copy, Clone, Debug, PartialEq, Eq)]
89pub struct D55;
90impl<T: Real> WhitePoint<T> for D55 {
91    #[inline]
92    fn get_xyz() -> Xyz<Any, T> {
93        Xyz::new(T::from_f64(0.95682), T::from_f64(1.0), T::from_f64(0.92149))
94    }
95}
96/// CIE D series standard illuminant - D65
97///
98/// D65 White Point is the natural daylight with a color temperature of 6500K
99/// for 2° Standard Observer.
100#[derive(Copy, Clone, Debug, PartialEq, Eq)]
101pub struct D65;
102impl<T: Real> WhitePoint<T> for D65 {
103    #[inline]
104    fn get_xyz() -> Xyz<Any, T> {
105        Xyz::new(T::from_f64(0.95047), T::from_f64(1.0), T::from_f64(1.08883))
106    }
107}
108/// CIE D series standard illuminant - D75
109///
110/// D75 White Point is the natural daylight with a color temperature of around
111/// 7500K for 2° Standard Observer.
112#[derive(Copy, Clone, Debug, PartialEq, Eq)]
113pub struct D75;
114impl<T: Real> WhitePoint<T> for D75 {
115    #[inline]
116    fn get_xyz() -> Xyz<Any, T> {
117        Xyz::new(T::from_f64(0.94972), T::from_f64(1.0), T::from_f64(1.22638))
118    }
119}
120/// CIE standard illuminant E
121///
122/// CIE standard illuminant E represents the equal energy radiator
123/// Uses the CIE 1932 2° Standard Observer
124#[derive(Copy, Clone, Debug, PartialEq, Eq)]
125pub struct E;
126impl<T: Real> WhitePoint<T> for E {
127    #[inline]
128    fn get_xyz() -> Xyz<Any, T> {
129        Xyz::new(T::from_f64(1.0), T::from_f64(1.0), T::from_f64(1.0))
130    }
131}
132/// CIE fluorescent illuminant series - F2
133///
134/// F2 represents a semi-broadband fluorescent lamp for 2° Standard Observer.
135#[derive(Copy, Clone, Debug, PartialEq, Eq)]
136pub struct F2;
137impl<T: Real> WhitePoint<T> for F2 {
138    #[inline]
139    fn get_xyz() -> Xyz<Any, T> {
140        Xyz::new(T::from_f64(0.99186), T::from_f64(1.0), T::from_f64(0.67393))
141    }
142}
143/// CIE fluorescent illuminant series - F7
144///
145/// F7 represents a broadband fluorescent lamp for 2° Standard Observer.
146#[derive(Copy, Clone, Debug, PartialEq, Eq)]
147pub struct F7;
148impl<T: Real> WhitePoint<T> for F7 {
149    #[inline]
150    fn get_xyz() -> Xyz<Any, T> {
151        Xyz::new(T::from_f64(0.95041), T::from_f64(1.0), T::from_f64(1.08747))
152    }
153}
154/// CIE fluorescent illuminant series - F11
155///
156/// F11 represents a narrowband fluorescent lamp for 2° Standard Observer.
157#[derive(Copy, Clone, Debug, PartialEq, Eq)]
158pub struct F11;
159impl<T: Real> WhitePoint<T> for F11 {
160    #[inline]
161    fn get_xyz() -> Xyz<Any, T> {
162        Xyz::new(T::from_f64(1.00962), T::from_f64(1.0), T::from_f64(0.64350))
163    }
164}
165/// CIE D series standard illuminant - D50
166///
167/// D50 White Point is the natural daylight with a color temperature of around
168/// 5000K for 10° Standard Observer.
169#[derive(Copy, Clone, Debug, PartialEq, Eq)]
170pub struct D50Degree10;
171impl<T: Real> WhitePoint<T> for D50Degree10 {
172    #[inline]
173    fn get_xyz() -> Xyz<Any, T> {
174        Xyz::new(T::from_f64(0.9672), T::from_f64(1.0), T::from_f64(0.8143))
175    }
176}
177/// CIE D series standard illuminant - D55
178///
179/// D55 White Point is the natural daylight with a color temperature of around
180/// 5500K for 10° Standard Observer.
181#[derive(Copy, Clone, Debug, PartialEq, Eq)]
182pub struct D55Degree10;
183impl<T: Real> WhitePoint<T> for D55Degree10 {
184    #[inline]
185    fn get_xyz() -> Xyz<Any, T> {
186        Xyz::new(T::from_f64(0.958), T::from_f64(1.0), T::from_f64(0.9093))
187    }
188}
189/// CIE D series standard illuminant - D65
190///
191/// D65 White Point is the natural daylight with a color temperature of 6500K
192/// for 10° Standard Observer.
193#[derive(Copy, Clone, Debug, PartialEq, Eq)]
194pub struct D65Degree10;
195impl<T: Real> WhitePoint<T> for D65Degree10 {
196    #[inline]
197    fn get_xyz() -> Xyz<Any, T> {
198        Xyz::new(T::from_f64(0.9481), T::from_f64(1.0), T::from_f64(1.073))
199    }
200}
201/// CIE D series standard illuminant - D75
202///
203/// D75 White Point is the natural daylight with a color temperature of around
204/// 7500K for 10° Standard Observer.
205#[derive(Copy, Clone, Debug, PartialEq, Eq)]
206pub struct D75Degree10;
207impl<T: Real> WhitePoint<T> for D75Degree10 {
208    #[inline]
209    fn get_xyz() -> Xyz<Any, T> {
210        Xyz::new(T::from_f64(0.94416), T::from_f64(1.0), T::from_f64(1.2064))
211    }
212}