f63c1bb12b0aa4b25a5db3b298c6bcb102e1cafe
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / create_canon_colorspaces.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Implements support for *Canon* colorspaces conversions and transfer functions.
6 """
7
8 from __future__ import division
9
10 import array
11 import os
12
13 import aces_ocio.generate_lut as genlut
14 from aces_ocio.utilities import ColorSpace
15
16 __author__ = 'ACES Developers'
17 __copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers'
18 __license__ = ''
19 __maintainer__ = 'ACES Developers'
20 __email__ = 'aces@oscars.org'
21 __status__ = 'Production'
22
23 __all__ = ['create_c_log',
24            'create_colorspaces']
25
26
27 def create_c_log(gamut,
28                  transfer_function,
29                  name,
30                  lut_directory,
31                  lut_resolution_1d,
32                  aliases):
33     """
34     Object description.
35
36     Canon-Log to ACES.
37
38     Parameters
39     ----------
40     parameter : type
41         Parameter description.
42
43     Returns
44     -------
45     type
46          Return value description.
47     """
48
49     name = '%s - %s' % (transfer_function, gamut)
50     if transfer_function == '':
51         name = 'Linear - %s' % gamut
52     if gamut == '':
53         name = '%s' % transfer_function
54
55     cs = ColorSpace(name)
56     cs.description = name
57     cs.aliases = aliases
58     cs.equality_group = ''
59     cs.family = 'Canon'
60     cs.is_data = False
61
62     def legal_to_full(code_value):
63         return (code_value - 64) / (940 - 64)
64
65     def c_log_to_linear(code_value):
66         # log = fullToLegal(c1 * log10(c2*linear + 1) + c3)
67         # linear = (pow(10, (legalToFul(log) - c3)/c1) - 1)/c2
68         c1 = 0.529136
69         c2 = 10.1596
70         c3 = 0.0730597
71
72         linear = (pow(10, (legal_to_full(code_value) - c3) / c1) - 1) / c2
73         linear *= 0.9
74
75         return linear
76
77     cs.to_reference_transforms = []
78
79     if transfer_function == 'Canon-Log':
80         data = array.array('f', '\0' * lut_resolution_1d * 4)
81         for c in range(lut_resolution_1d):
82             data[c] = c_log_to_linear(1023 * c / (lut_resolution_1d - 1))
83
84         lut = '%s_to_linear.spi1d' % transfer_function
85         genlut.write_SPI_1d(
86             os.path.join(lut_directory, lut),
87             0,
88             1,
89             data,
90             lut_resolution_1d,
91             1)
92
93         cs.to_reference_transforms.append({
94             'type': 'lutFile',
95             'path': lut,
96             'interpolation': 'linear',
97             'direction': 'forward'})
98
99     if gamut == 'Rec. 709 Daylight':
100         cs.to_reference_transforms.append({
101             'type': 'matrix',
102             'matrix': [0.561538969, 0.402060105, 0.036400926, 0,
103                        0.092739623, 0.924121198, -0.016860821, 0,
104                        0.084812961, 0.006373835, 0.908813204, 0,
105                        0, 0, 0, 1],
106             'direction': 'forward'})
107     elif gamut == 'Rec. 709 Tungsten':
108         cs.to_reference_transforms.append({
109             'type': 'matrix',
110             'matrix': [0.566996399, 0.365079418, 0.067924183, 0,
111                        0.070901044, 0.880331008, 0.048767948, 0,
112                        0.073013542, -0.066540862, 0.99352732, 0,
113                        0, 0, 0, 1],
114             'direction': 'forward'})
115     elif gamut == 'DCI-P3 Daylight':
116         cs.to_reference_transforms.append({
117             'type': 'matrix',
118             'matrix': [0.607160575, 0.299507286, 0.093332140, 0,
119                        0.004968120, 1.050982224, -0.055950343, 0,
120                        -0.007839939, 0.000809127, 1.007030813, 0,
121                        0, 0, 0, 1],
122             'direction': 'forward'})
123     elif gamut == 'DCI-P3 Tungsten':
124         cs.to_reference_transforms.append({
125             'type': 'matrix',
126             'matrix': [0.650279125, 0.253880169, 0.095840706, 0,
127                        -0.026137986, 1.017900530, 0.008237456, 0,
128                        0.007757558, -0.063081669, 1.055324110, 0,
129                        0, 0, 0, 1],
130             'direction': 'forward'})
131     elif gamut == 'Cinema Gamut Daylight':
132         cs.to_reference_transforms.append({
133             'type': 'matrix',
134             'matrix': [0.763064455, 0.149021161, 0.087914384, 0,
135                        0.003657457, 1.10696038, -0.110617837, 0,
136                        -0.009407794, -0.218383305, 1.227791099, 0,
137                        0, 0, 0, 1],
138             'direction': 'forward'})
139     elif gamut == 'Cinema Gamut Tungsten':
140         cs.to_reference_transforms.append({
141             'type': 'matrix',
142             'matrix': [0.817416293, 0.090755698, 0.091828009, 0,
143                        -0.035361374, 1.065690585, -0.030329211, 0,
144                        0.010390366, -0.299271107, 1.288880741, 0,
145                        0, 0, 0, 1],
146             'direction': 'forward'})
147
148     cs.from_reference_transforms = []
149     return cs
150
151
152 def create_colorspaces(lut_directory, lut_resolution_1d):
153     """
154     Generates the colorspace conversions.
155
156     Parameters
157     ----------
158     parameter : type
159         Parameter description.
160
161     Returns
162     -------
163     type
164          Return value description.
165     """
166
167     colorspaces = []
168
169     # Full conversion
170     c_log_1 = create_c_log(
171         'Rec. 709 Daylight',
172         'Canon-Log',
173         'Canon-Log',
174         lut_directory,
175         lut_resolution_1d,
176         ["canonlog_rec709day"])
177     colorspaces.append(c_log_1)
178
179     c_log_2 = create_c_log(
180         'Rec. 709 Tungsten',
181         'Canon-Log',
182         'Canon-Log',
183         lut_directory,
184         lut_resolution_1d,
185         ["canonlog_rec709tung"])
186     colorspaces.append(c_log_2)
187
188     c_log_3 = create_c_log(
189         'DCI-P3 Daylight',
190         'Canon-Log',
191         'Canon-Log',
192         lut_directory,
193         lut_resolution_1d,
194         ["canonlog_dcip3day"])
195     colorspaces.append(c_log_3)
196
197     c_log_4 = create_c_log(
198         'DCI-P3 Tungsten',
199         'Canon-Log',
200         'Canon-Log',
201         lut_directory,
202         lut_resolution_1d,
203         ["canonlog_dcip3tung"])
204     colorspaces.append(c_log_4)
205
206     c_log_5 = create_c_log(
207         'Cinema Gamut Daylight',
208         'Canon-Log',
209         'Canon-Log',
210         lut_directory,
211         lut_resolution_1d,
212         ["canonlog_cgamutday"])
213     colorspaces.append(c_log_5)
214
215     c_log_6 = create_c_log(
216         'Cinema Gamut Tungsten',
217         'Canon-Log',
218         'Canon-Log',
219         lut_directory,
220         lut_resolution_1d,
221         ["canonlog_cgamuttung"])
222     colorspaces.append(c_log_6)
223
224     # Linearization Only
225     c_log_7 = create_c_log(
226         '',
227         'Canon-Log',
228         'Canon-Log',
229         lut_directory,
230         lut_resolution_1d,
231         ["crv_canonlog"])
232     colorspaces.append(c_log_7)
233
234     # Primaries Only
235     c_log_8 = create_c_log(
236         'Rec. 709 Daylight',
237         '',
238         'Canon-Log',
239         lut_directory,
240         lut_resolution_1d,
241         ["lin_rec709day"])
242     colorspaces.append(c_log_8)
243
244     c_log_9 = create_c_log(
245         'Rec. 709 Tungsten',
246         '',
247         'Canon-Log',
248         lut_directory,
249         lut_resolution_1d,
250         ["lin_rec709tung"])
251     colorspaces.append(c_log_9)
252
253     c_log_10 = create_c_log(
254         'DCI-P3 Daylight',
255         '',
256         'Canon-Log',
257         lut_directory,
258         lut_resolution_1d,
259         ["lin_dcip3day"])
260     colorspaces.append(c_log_10)
261
262     c_log_11 = create_c_log(
263         'DCI-P3 Tungsten',
264         '',
265         'Canon-Log',
266         lut_directory,
267         lut_resolution_1d,
268         ["lin_dcip3tung"])
269     colorspaces.append(c_log_11)
270
271     c_log_12 = create_c_log(
272         'Cinema Gamut Daylight',
273         '',
274         'Canon-Log',
275         lut_directory,
276         lut_resolution_1d,
277         ["lin_cgamutday"])
278     colorspaces.append(c_log_12)
279
280     c_log_13 = create_c_log(
281         'Cinema Gamut Tungsten',
282         '',
283         'Canon-Log',
284         lut_directory,
285         lut_resolution_1d,
286         ["lin_cgamuttung"])
287     colorspaces.append(c_log_13)
288
289     return colorspaces