94d1201d9e157d665e3e5e996bb67094b55f075a
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / create_sony_colorspaces.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Implements support for *Sony* 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_s_log',
22            'create_colorspaces']
23
24
25 def create_s_log(gamut,
26                  transfer_function,
27                  name,
28                  lut_directory,
29                  lut_resolution_1d,
30                  aliases):
31     """
32     Object description.
33
34     SLog 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 = 'Sony'
58     cs.is_data = False
59
60     def s_log1_to_linear(s_log):
61         b = 64.
62         ab = 90.
63         w = 940.
64
65         if s_log >= ab:
66             linear = ((pow(10.,
67                            (((s_log - b) /
68                              (w - b) - 0.616596 - 0.03) / 0.432699)) -
69                        0.037584) * 0.9)
70         else:
71             linear = (((s_log - b) / (
72                 w - b) - 0.030001222851889303) / 5.) * 0.9
73         return linear
74
75     def s_log2_to_linear(s_log):
76         b = 64.
77         ab = 90.
78         w = 940.
79
80         if s_log >= ab:
81             linear = ((219. * (pow(10.,
82                                    (((s_log - b) /
83                                      (w - b) - 0.616596 - 0.03) / 0.432699)) -
84                                0.037584) / 155.) * 0.9)
85         else:
86             linear = (((s_log - b) / (
87                 w - b) - 0.030001222851889303) / 3.53881278538813) * 0.9
88         return linear
89
90     def s_log3_to_linear(code_value):
91         if code_value >= 171.2102946929:
92             linear = (pow(10.0, ((code_value - 420.0) / 261.5)) *
93                       (0.18 + 0.01) - 0.01)
94         else:
95             linear = (code_value - 95.0) * 0.01125000 / (171.2102946929 - 95.0)
96
97         return linear
98
99     cs.to_reference_transforms = []
100
101     if transfer_function == 'S-Log1':
102         data = array.array('f', '\0' * lut_resolution_1d * 4)
103         for c in range(lut_resolution_1d):
104             data[c] = s_log1_to_linear(1023.0 * c / (lut_resolution_1d - 1))
105
106         lut = '%s_to_linear.spi1d' % transfer_function
107         genlut.write_SPI_1d(
108             os.path.join(lut_directory, lut),
109             0.0,
110             1.0,
111             data,
112             lut_resolution_1d,
113             1)
114
115         cs.to_reference_transforms.append({
116             'type': 'lutFile',
117             'path': lut,
118             'interpolation': 'linear',
119             'direction': 'forward'})
120     elif transfer_function == 'S-Log2':
121         data = array.array('f', '\0' * lut_resolution_1d * 4)
122         for c in range(lut_resolution_1d):
123             data[c] = s_log2_to_linear(1023.0 * c / (lut_resolution_1d - 1))
124
125         lut = '%s_to_linear.spi1d' % transfer_function
126         genlut.write_SPI_1d(
127             os.path.join(lut_directory, lut),
128             0.0,
129             1.0,
130             data,
131             lut_resolution_1d,
132             1)
133
134         cs.to_reference_transforms.append({
135             'type': 'lutFile',
136             'path': lut,
137             'interpolation': 'linear',
138             'direction': 'forward'})
139     elif transfer_function == 'S-Log3':
140         data = array.array('f', '\0' * lut_resolution_1d * 4)
141         for c in range(lut_resolution_1d):
142             data[c] = s_log3_to_linear(1023.0 * c / (lut_resolution_1d - 1))
143
144         lut = '%s_to_linear.spi1d' % transfer_function
145         genlut.write_SPI_1d(
146             os.path.join(lut_directory, lut),
147             0.0,
148             1.0,
149             data,
150             lut_resolution_1d,
151             1)
152
153         cs.to_reference_transforms.append({
154             'type': 'lutFile',
155             'path': lut,
156             'interpolation': 'linear',
157             'direction': 'forward'})
158
159     if gamut == 'S-Gamut':
160         cs.to_reference_transforms.append({
161             'type': 'matrix',
162             'matrix': mat44_from_mat33(
163                 [0.754338638, 0.133697046, 0.111968437,
164                  0.021198141, 1.005410934, -0.026610548,
165                  -0.009756991, 0.004508563, 1.005253201]),
166             'direction': 'forward'})
167     elif gamut == 'S-Gamut Daylight':
168         cs.to_reference_transforms.append({
169             'type': 'matrix',
170             'matrix': mat44_from_mat33(
171                 [0.8764457030, 0.0145411681, 0.1090131290,
172                  0.0774075345, 0.9529571767, -0.0303647111,
173                  0.0573564351, -0.1151066335, 1.0577501984]),
174             'direction': 'forward'})
175     elif gamut == 'S-Gamut Tungsten':
176         cs.to_reference_transforms.append({
177             'type': 'matrix',
178             'matrix': mat44_from_mat33(
179                 [1.0110238740, -0.1362526051, 0.1252287310,
180                  0.1011994504, 0.9562196265, -0.0574190769,
181                  0.0600766530, -0.1010185315, 1.0409418785]),
182             'direction': 'forward'})
183     elif gamut == 'S-Gamut3.Cine':
184         cs.to_reference_transforms.append({
185             'type': 'matrix',
186             'matrix': mat44_from_mat33(
187                 [0.6387886672, 0.2723514337, 0.0888598992,
188                  -0.0039159061, 1.0880732308, -0.0841573249,
189                  -0.0299072021, -0.0264325799, 1.0563397820]),
190             'direction': 'forward'})
191     elif gamut == 'S-Gamut3':
192         cs.to_reference_transforms.append({
193             'type': 'matrix',
194             'matrix': mat44_from_mat33(
195                 [0.7529825954, 0.1433702162, 0.1036471884,
196                  0.0217076974, 1.0153188355, -0.0370265329,
197                  -0.0094160528, 0.0033704179, 1.0060456349]),
198             'direction': 'forward'})
199
200     cs.from_reference_transforms = []
201     return cs
202
203
204 def create_colorspaces(lut_directory, lut_resolution_1d):
205     """
206     Generates the colorspace conversions.
207
208     Parameters
209     ----------
210     parameter : type
211         Parameter description.
212
213     Returns
214     -------
215     type
216          Return value description.
217     """
218
219     colorspaces = []
220
221     # *S-Log1*
222     s_log1_s_gamut = create_s_log(
223         'S-Gamut',
224         'S-Log1',
225         'S-Log',
226         lut_directory,
227         lut_resolution_1d,
228         ["slog1_sgamut"])
229     colorspaces.append(s_log1_s_gamut)
230
231     # *S-Log2*
232     s_log2_s_gamut = create_s_log(
233         'S-Gamut',
234         'S-Log2',
235         'S-Log2',
236         lut_directory,
237         lut_resolution_1d,
238         ["slog2_sgamut"])
239     colorspaces.append(s_log2_s_gamut)
240
241     s_log2_s_gamut_daylight = create_s_log(
242         'S-Gamut Daylight',
243         'S-Log2',
244         'S-Log2',
245         lut_directory,
246         lut_resolution_1d,
247         ["slog2_sgamutday"])
248     colorspaces.append(s_log2_s_gamut_daylight)
249
250     s_log2_s_gamut_tungsten = create_s_log(
251         'S-Gamut Tungsten',
252         'S-Log2',
253         'S-Log2',
254         lut_directory,
255         lut_resolution_1d,
256         ["slog2_sgamuttung"])
257     colorspaces.append(s_log2_s_gamut_tungsten)
258
259     # *S-Log3*
260     s_log3_s_gamut3Cine = create_s_log(
261         'S-Gamut3.Cine',
262         'S-Log3',
263         'S-Log3',
264         lut_directory,
265         lut_resolution_1d,
266         ["slog3_sgamutcine"])
267     colorspaces.append(s_log3_s_gamut3Cine)
268
269     s_log3_s_gamut3 = create_s_log(
270         'S-Gamut3',
271         'S-Log3',
272         'S-Log3',
273         lut_directory,
274         lut_resolution_1d,
275         ["slog3_sgamut3"])
276     colorspaces.append(s_log3_s_gamut3)
277
278     # Linearization Only
279     s_log1 = create_s_log(
280         '',
281         'S-Log1',
282         'S-Log',
283         lut_directory,
284         lut_resolution_1d,
285         ["crv_slog1"])
286     colorspaces.append(s_log1)
287
288     s_log2 = create_s_log(
289         '',
290         'S-Log2',
291         'S-Log2',
292         lut_directory,
293         lut_resolution_1d,
294         ["crv_slog2"])
295     colorspaces.append(s_log2)
296
297     s_log3 = create_s_log(
298         '',
299         'S-Log3',
300         'S-Log3',
301         lut_directory,
302         lut_resolution_1d,
303         ["crv_slog3"])
304     colorspaces.append(s_log3)
305
306     # Primaries Only
307     s_gamut = create_s_log(
308         'S-Gamut',
309         '',
310         'S-Log',
311         lut_directory,
312         lut_resolution_1d,
313         ["lin_sgamut"])
314     colorspaces.append(s_gamut)
315
316     s_gamut_daylight = create_s_log(
317         'S-Gamut Daylight',
318         '',
319         'S-Log2',
320         lut_directory,
321         lut_resolution_1d,
322         ["lin_sgamutday"])
323     colorspaces.append(s_gamut_daylight)
324
325     s_gamut_tungsten = create_s_log(
326         'S-Gamut Tungsten',
327         '',
328         'S-Log2',
329         lut_directory,
330         lut_resolution_1d,
331         ["lin_sgamuttung"])
332     colorspaces.append(s_gamut_tungsten)
333
334     s_gamut3Cine = create_s_log(
335         'S-Gamut3.Cine',
336         '',
337         'S-Log3',
338         lut_directory,
339         lut_resolution_1d,
340         ["lin_sgamut3cine"])
341     colorspaces.append(s_gamut3Cine)
342
343     s_gamut3 = create_s_log(
344         'S-Gamut3',
345         '',
346         'S-Log3',
347         lut_directory,
348         lut_resolution_1d,
349         ["lin_sgamut3"])
350     colorspaces.append(s_gamut3)
351
352     return colorspaces