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