Try to fix OS X build.
[libdcp.git] / src / colour_conversion.h
1 /*
2     Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34 /** @file  src/colour_conversion.h
35  *  @brief ColourConversion class.
36  */
37
38 #ifndef DCP_COLOUR_CONVERSION_H
39 #define DCP_COLOUR_CONVERSION_H
40
41 #include "chromaticity.h"
42 #include <boost/shared_ptr.hpp>
43 #include <boost/serialization/array_wrapper.hpp>
44 #include <boost/numeric/ublas/matrix.hpp>
45 #include <boost/optional.hpp>
46
47 namespace dcp {
48
49 class TransferFunction;
50
51 enum YUVToRGB {
52         YUV_TO_RGB_REC601,
53         YUV_TO_RGB_REC709,
54         YUV_TO_RGB_COUNT
55 };
56
57 /** @class ColourConversion
58  *  @brief A representation of all the parameters involved the colourspace conversion
59  *  of a YUV image to XYZ (via RGB).
60  */
61 class ColourConversion
62 {
63 public:
64         ColourConversion ()
65                 : _yuv_to_rgb (YUV_TO_RGB_REC601)
66         {}
67
68         ColourConversion (
69                 boost::shared_ptr<const TransferFunction> in,
70                 YUVToRGB yuv_to_rgb,
71                 Chromaticity red,
72                 Chromaticity green,
73                 Chromaticity blue,
74                 Chromaticity white,
75                 boost::optional<Chromaticity> adjusted_white,
76                 boost::shared_ptr<const TransferFunction> out
77                 );
78
79         boost::shared_ptr<const TransferFunction> in () const {
80                 return _in;
81         }
82
83         YUVToRGB yuv_to_rgb () const {
84                 return _yuv_to_rgb;
85         }
86
87         Chromaticity red () const {
88                 return _red;
89         }
90
91         Chromaticity green () const {
92                 return _green;
93         }
94
95         Chromaticity blue () const {
96                 return _blue;
97         }
98
99         Chromaticity white () const {
100                 return _white;
101         }
102
103         boost::optional<Chromaticity> adjusted_white () const {
104                 return _adjusted_white;
105         }
106
107         boost::shared_ptr<const TransferFunction> out () const {
108                 return _out;
109         }
110
111         void set_in (boost::shared_ptr<const TransferFunction> f) {
112                 _in = f;
113         }
114
115         void set_yuv_to_rgb (YUVToRGB y) {
116                 _yuv_to_rgb = y;
117         }
118
119         void set_red (Chromaticity red) {
120                 _red = red;
121         }
122
123         void set_green (Chromaticity green) {
124                 _green = green;
125         }
126
127         void set_blue (Chromaticity blue) {
128                 _blue = blue;
129         }
130
131         void set_white (Chromaticity white) {
132                 _white = white;
133         }
134
135         void set_adjusted_white (Chromaticity adjusted_white) {
136                 _adjusted_white = adjusted_white;
137         }
138
139         void unset_adjusted_white () {
140                 _adjusted_white = boost::optional<Chromaticity> ();
141         }
142
143         void set_out (boost::shared_ptr<const TransferFunction> f) {
144                 _out = f;
145         }
146
147         bool about_equal (ColourConversion const & other, float epsilon) const;
148
149         boost::numeric::ublas::matrix<double> rgb_to_xyz () const;
150         boost::numeric::ublas::matrix<double> xyz_to_rgb () const;
151         boost::numeric::ublas::matrix<double> bradford () const;
152
153         static ColourConversion const & srgb_to_xyz ();
154         static ColourConversion const & rec601_to_xyz ();
155         static ColourConversion const & rec709_to_xyz ();
156         static ColourConversion const & p3_to_xyz ();
157         static ColourConversion const & rec1886_to_xyz ();
158         static ColourConversion const & rec2020_to_xyz ();
159         static ColourConversion const & s_gamut3_to_xyz ();
160
161 protected:
162         /** Input transfer function (probably a gamma function, or something similar) */
163         boost::shared_ptr<const TransferFunction> _in;
164         /** Conversion to use from YUV to RGB */
165         YUVToRGB _yuv_to_rgb;
166         Chromaticity _red;
167         Chromaticity _green;
168         Chromaticity _blue;
169         Chromaticity _white;
170         /** White point that we are adjusting to using a Bradford matrix */
171         boost::optional<Chromaticity> _adjusted_white;
172         /** Output transfer function (probably an inverse gamma function, or something similar) */
173         boost::shared_ptr<const TransferFunction> _out;
174 };
175
176 }
177
178 #endif