cc9df11f8fba7dd13faa79e7a660ca7347d95bab
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / colorspaces / red.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Implements support for *RED* colorspaces conversions and transfer functions.
6 """
7
8 from __future__ import division
9
10 import array
11 import os
12
13 import PyOpenColorIO as ocio
14
15 import aces_ocio.generate_lut as genlut
16 from aces_ocio.utilities import ColorSpace, mat44_from_mat33
17
18 __author__ = 'ACES Developers'
19 __copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers'
20 __license__ = ''
21 __maintainer__ = 'ACES Developers'
22 __email__ = 'aces@oscars.org'
23 __status__ = 'Production'
24
25 __all__ = ['create_RED_log_film',
26            'create_colorspaces']
27
28
29 def create_RED_log_film(gamut,
30                         transfer_function,
31                         name,
32                         lut_directory,
33                         lut_resolution_1d,
34                         aliases=None):
35     """
36     Object description.
37
38     RED colorspaces to ACES.
39
40     Parameters
41     ----------
42     parameter : type
43         Parameter description.
44
45     Returns
46     -------
47     type
48          Return value description.
49     """
50
51     if aliases is None:
52         aliases = []
53
54     name = '%s - %s' % (transfer_function, gamut)
55     if transfer_function == '':
56         name = 'Linear - %s' % gamut
57     if gamut == '':
58         name = 'Curve - %s' % transfer_function
59
60     cs = ColorSpace(name)
61     cs.description = name
62     cs.aliases = aliases
63     cs.equality_group = ''
64     cs.family = 'Input/RED'
65     cs.is_data = False
66
67     # A linear space needs allocation variables
68     if transfer_function == '':
69         cs.allocation_type = ocio.Constants.ALLOCATION_LG2
70         cs.allocation_vars = [-8, 5, 0.00390625]
71
72     def cineon_to_linear(code_value):
73         n_gamma = 0.6
74         black_point = 95
75         white_point = 685
76         code_value_to_density = 0.002
77
78         black_linear = pow(10, (black_point - white_point) * (
79             code_value_to_density / n_gamma))
80         code_linear = pow(10, (code_value - white_point) * (
81             code_value_to_density / n_gamma))
82
83         return (code_linear - black_linear) / (1 - black_linear)
84
85     cs.to_reference_transforms = []
86
87     if transfer_function == 'REDlogFilm':
88         data = array.array('f', '\0' * lut_resolution_1d * 4)
89         for c in range(lut_resolution_1d):
90             data[c] = cineon_to_linear(1023 * c / (lut_resolution_1d - 1))
91
92         lut = 'CineonLog_to_linear.spi1d'
93         genlut.write_SPI_1d(
94             os.path.join(lut_directory, lut),
95             0,
96             1,
97             data,
98             lut_resolution_1d,
99             1)
100
101         cs.to_reference_transforms.append({
102             'type': 'lutFile',
103             'path': lut,
104             'interpolation': 'linear',
105             'direction': 'forward'})
106
107     if gamut == 'DRAGONcolor':
108         cs.to_reference_transforms.append({
109             'type': 'matrix',
110             'matrix': mat44_from_mat33([0.532279, 0.376648, 0.091073,
111                                         0.046344, 0.974513, -0.020860,
112                                         -0.053976, -0.000320, 1.054267]),
113             'direction': 'forward'})
114     elif gamut == 'DRAGONcolor2':
115         cs.to_reference_transforms.append({
116             'type': 'matrix',
117             'matrix': mat44_from_mat33([0.468452, 0.331484, 0.200064,
118                                         0.040787, 0.857658, 0.101553,
119                                         -0.047504, -0.000282, 1.047756]),
120             'direction': 'forward'})
121     elif gamut == 'REDcolor':
122         cs.to_reference_transforms.append({
123             'type': 'matrix',
124             'matrix': mat44_from_mat33([0.451464, 0.388498, 0.160038,
125                                         0.062716, 0.866790, 0.070491,
126                                         -0.017541, 0.086921, 0.930590]),
127             'direction': 'forward'})
128     elif gamut == 'REDcolor2':
129         cs.to_reference_transforms.append({
130             'type': 'matrix',
131             'matrix': mat44_from_mat33([0.480997, 0.402289, 0.116714,
132                                         -0.004938, 1.000154, 0.004781,
133                                         -0.105257, 0.025320, 1.079907]),
134             'direction': 'forward'})
135     elif gamut == 'REDcolor3':
136         cs.to_reference_transforms.append({
137             'type': 'matrix',
138             'matrix': mat44_from_mat33([0.512136, 0.360370, 0.127494,
139                                         0.070377, 0.903884, 0.025737,
140                                         -0.020824, 0.017671, 1.003123]),
141             'direction': 'forward'})
142     elif gamut == 'REDcolor4':
143         cs.to_reference_transforms.append({
144             'type': 'matrix',
145             'matrix': mat44_from_mat33([0.474202, 0.333677, 0.192121,
146                                         0.065164, 0.836932, 0.097901,
147                                         -0.019281, 0.016362, 1.002889]),
148             'direction': 'forward'})
149
150     cs.from_reference_transforms = []
151     return cs
152
153
154 def create_colorspaces(lut_directory, lut_resolution_1d):
155     """
156     Generates the colorspace conversions.
157
158     Parameters
159     ----------
160     parameter : type
161         Parameter description.
162
163     Returns
164     -------
165     type
166          Return value description.
167     """
168
169     colorspaces = []
170
171     # Full conversion
172     RED_log_film_dragon = create_RED_log_film(
173         'DRAGONcolor',
174         'REDlogFilm',
175         'REDlogFilm',
176         lut_directory,
177         lut_resolution_1d,
178         ['rlf_dgn'])
179     colorspaces.append(RED_log_film_dragon)
180
181     RED_log_film_dragon2 = create_RED_log_film(
182         'DRAGONcolor2',
183         'REDlogFilm',
184         'REDlogFilm',
185         lut_directory,
186         lut_resolution_1d,
187         ['rlf_dgn2'])
188     colorspaces.append(RED_log_film_dragon2)
189
190     RED_log_film_color = create_RED_log_film(
191         'REDcolor',
192         'REDlogFilm',
193         'REDlogFilm',
194         lut_directory,
195         lut_resolution_1d,
196         ['rlf_rc'])
197     colorspaces.append(RED_log_film_color)
198
199     RED_log_film_color2 = create_RED_log_film(
200         'REDcolor2',
201         'REDlogFilm',
202         'REDlogFilm',
203         lut_directory,
204         lut_resolution_1d,
205         ['rlf_rc2'])
206     colorspaces.append(RED_log_film_color2)
207
208     RED_log_film_color3 = create_RED_log_film(
209         'REDcolor3',
210         'REDlogFilm',
211         'REDlogFilm',
212         lut_directory,
213         lut_resolution_1d,
214         ['rlf_rc3'])
215     colorspaces.append(RED_log_film_color3)
216
217     RED_log_film_color4 = create_RED_log_film(
218         'REDcolor4',
219         'REDlogFilm',
220         'REDlogFilm',
221         lut_directory,
222         lut_resolution_1d,
223         ['rlf_rc4'])
224     colorspaces.append(RED_log_film_color4)
225
226     # Linearization only
227     RED_log_film = create_RED_log_film(
228         '',
229         'REDlogFilm',
230         'REDlogFilm',
231         lut_directory,
232         lut_resolution_1d,
233         ['crv_rlf'])
234     colorspaces.append(RED_log_film)
235
236     # Primaries only
237     RED_dragon = create_RED_log_film(
238         'DRAGONcolor',
239         '',
240         'REDlogFilm',
241         lut_directory,
242         lut_resolution_1d,
243         ['lin_dgn'])
244     colorspaces.append(RED_dragon)
245
246     RED_dragon2 = create_RED_log_film(
247         'DRAGONcolor2',
248         '',
249         'REDlogFilm',
250         lut_directory,
251         lut_resolution_1d,
252         ['lin_dgn2'])
253     colorspaces.append(RED_dragon2)
254
255     RED_color = create_RED_log_film(
256         'REDcolor',
257         '',
258         'REDlogFilm',
259         lut_directory,
260         lut_resolution_1d,
261         ['lin_rc'])
262     colorspaces.append(RED_color)
263
264     RED_color2 = create_RED_log_film(
265         'REDcolor2',
266         '',
267         'REDlogFilm',
268         lut_directory,
269         lut_resolution_1d,
270         ['lin_rc2'])
271     colorspaces.append(RED_color2)
272
273     RED_color3 = create_RED_log_film(
274         'REDcolor3',
275         '',
276         'REDlogFilm',
277         lut_directory,
278         lut_resolution_1d,
279         ['lin_rc3'])
280     colorspaces.append(RED_color3)
281
282     RED_color4 = create_RED_log_film(
283         'REDcolor4',
284         '',
285         'REDlogFilm',
286         lut_directory,
287         lut_resolution_1d,
288         ['lin_rc4'])
289     colorspaces.append(RED_color4)
290
291     return colorspaces