Fix "PEP8" naming convention violations.
[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.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                         lut_directory,
32                         lut_resolution_1d,
33                         aliases=None):
34     """
35     Object description.
36
37     RED colorspaces to ACES.
38
39     Parameters
40     ----------
41     parameter : type
42         Parameter description.
43
44     Returns
45     -------
46     type
47          Return value description.
48     """
49
50     if aliases is None:
51         aliases = []
52
53     name = '%s - %s' % (transfer_function, gamut)
54     if transfer_function == '':
55         name = 'Linear - %s' % gamut
56     if gamut == '':
57         name = 'Curve - %s' % transfer_function
58
59     cs = ColorSpace(name)
60     cs.description = name
61     cs.aliases = aliases
62     cs.equality_group = ''
63     cs.family = 'Input/RED'
64     cs.is_data = False
65
66     # A linear space needs allocation variables
67     if transfer_function == '':
68         cs.allocation_type = ocio.Constants.ALLOCATION_LG2
69         cs.allocation_vars = [-8, 5, 0.00390625]
70
71     def cineon_to_linear(code_value):
72         n_gamma = 0.6
73         black_point = 95
74         white_point = 685
75         code_value_to_density = 0.002
76
77         black_linear = pow(10, (black_point - white_point) * (
78             code_value_to_density / n_gamma))
79         code_linear = pow(10, (code_value - white_point) * (
80             code_value_to_density / n_gamma))
81
82         return (code_linear - black_linear) / (1 - black_linear)
83
84     cs.to_reference_transforms = []
85
86     if transfer_function == 'REDlogFilm':
87         data = array.array('f', '\0' * lut_resolution_1d * 4)
88         for c in range(lut_resolution_1d):
89             data[c] = cineon_to_linear(1023 * c / (lut_resolution_1d - 1))
90
91         lut = 'CineonLog_to_linear.spi1d'
92         genlut.write_SPI_1d(
93             os.path.join(lut_directory, lut),
94             0,
95             1,
96             data,
97             lut_resolution_1d,
98             1)
99
100         cs.to_reference_transforms.append({
101             'type': 'lutFile',
102             'path': lut,
103             'interpolation': 'linear',
104             'direction': 'forward'})
105
106     if gamut == 'DRAGONcolor':
107         cs.to_reference_transforms.append({
108             'type': 'matrix',
109             'matrix': mat44_from_mat33([0.532279, 0.376648, 0.091073,
110                                         0.046344, 0.974513, -0.020860,
111                                         -0.053976, -0.000320, 1.054267]),
112             'direction': 'forward'})
113     elif gamut == 'DRAGONcolor2':
114         cs.to_reference_transforms.append({
115             'type': 'matrix',
116             'matrix': mat44_from_mat33([0.468452, 0.331484, 0.200064,
117                                         0.040787, 0.857658, 0.101553,
118                                         -0.047504, -0.000282, 1.047756]),
119             'direction': 'forward'})
120     elif gamut == 'REDcolor':
121         cs.to_reference_transforms.append({
122             'type': 'matrix',
123             'matrix': mat44_from_mat33([0.451464, 0.388498, 0.160038,
124                                         0.062716, 0.866790, 0.070491,
125                                         -0.017541, 0.086921, 0.930590]),
126             'direction': 'forward'})
127     elif gamut == 'REDcolor2':
128         cs.to_reference_transforms.append({
129             'type': 'matrix',
130             'matrix': mat44_from_mat33([0.480997, 0.402289, 0.116714,
131                                         -0.004938, 1.000154, 0.004781,
132                                         -0.105257, 0.025320, 1.079907]),
133             'direction': 'forward'})
134     elif gamut == 'REDcolor3':
135         cs.to_reference_transforms.append({
136             'type': 'matrix',
137             'matrix': mat44_from_mat33([0.512136, 0.360370, 0.127494,
138                                         0.070377, 0.903884, 0.025737,
139                                         -0.020824, 0.017671, 1.003123]),
140             'direction': 'forward'})
141     elif gamut == 'REDcolor4':
142         cs.to_reference_transforms.append({
143             'type': 'matrix',
144             'matrix': mat44_from_mat33([0.474202, 0.333677, 0.192121,
145                                         0.065164, 0.836932, 0.097901,
146                                         -0.019281, 0.016362, 1.002889]),
147             'direction': 'forward'})
148
149     cs.from_reference_transforms = []
150     return cs
151
152
153 def create_colorspaces(lut_directory, lut_resolution_1d):
154     """
155     Generates the colorspace conversions.
156
157     Parameters
158     ----------
159     parameter : type
160         Parameter description.
161
162     Returns
163     -------
164     type
165          Return value description.
166     """
167
168     colorspaces = []
169
170     # Full conversion
171     red_log_film_dragon = create_red_log_film(
172         'DRAGONcolor',
173         'REDlogFilm',
174         lut_directory,
175         lut_resolution_1d,
176         ['rlf_dgn'])
177     colorspaces.append(red_log_film_dragon)
178
179     red_log_film_dragon2 = create_red_log_film(
180         'DRAGONcolor2',
181         'REDlogFilm',
182         lut_directory,
183         lut_resolution_1d,
184         ['rlf_dgn2'])
185     colorspaces.append(red_log_film_dragon2)
186
187     red_log_film_color = create_red_log_film(
188         'REDcolor',
189         'REDlogFilm',
190         lut_directory,
191         lut_resolution_1d,
192         ['rlf_rc'])
193     colorspaces.append(red_log_film_color)
194
195     red_log_film_color2 = create_red_log_film(
196         'REDcolor2',
197         'REDlogFilm',
198         lut_directory,
199         lut_resolution_1d,
200         ['rlf_rc2'])
201     colorspaces.append(red_log_film_color2)
202
203     red_log_film_color3 = create_red_log_film(
204         'REDcolor3',
205         'REDlogFilm',
206         lut_directory,
207         lut_resolution_1d,
208         ['rlf_rc3'])
209     colorspaces.append(red_log_film_color3)
210
211     red_log_film_color4 = create_red_log_film(
212         'REDcolor4',
213         'REDlogFilm',
214         lut_directory,
215         lut_resolution_1d,
216         ['rlf_rc4'])
217     colorspaces.append(red_log_film_color4)
218
219     # Linearization only
220     red_log_film = create_red_log_film(
221         '',
222         'REDlogFilm',
223         lut_directory,
224         lut_resolution_1d,
225         ['crv_rlf'])
226     colorspaces.append(red_log_film)
227
228     # Primaries only
229     red_dragon = create_red_log_film(
230         'DRAGONcolor',
231         '',
232         lut_directory,
233         lut_resolution_1d,
234         ['lin_dgn'])
235     colorspaces.append(red_dragon)
236
237     red_dragon2 = create_red_log_film(
238         'DRAGONcolor2',
239         '',
240         lut_directory,
241         lut_resolution_1d,
242         ['lin_dgn2'])
243     colorspaces.append(red_dragon2)
244
245     red_color = create_red_log_film(
246         'REDcolor',
247         '',
248         lut_directory,
249         lut_resolution_1d,
250         ['lin_rc'])
251     colorspaces.append(red_color)
252
253     red_color2 = create_red_log_film(
254         'REDcolor2',
255         '',
256         lut_directory,
257         lut_resolution_1d,
258         ['lin_rc2'])
259     colorspaces.append(red_color2)
260
261     red_color3 = create_red_log_film(
262         'REDcolor3',
263         '',
264         lut_directory,
265         lut_resolution_1d,
266         ['lin_rc3'])
267     colorspaces.append(red_color3)
268
269     red_color4 = create_red_log_film(
270         'REDcolor4',
271         '',
272         lut_directory,
273         lut_resolution_1d,
274         ['lin_rc4'])
275     colorspaces.append(red_color4)
276
277     return colorspaces