2 # -*- coding: utf-8 -*-
5 Implements support for *Canon* colorspaces conversions and transfer functions.
8 from __future__ import division
13 import aces_ocio.generate_lut as genlut
14 from aces_ocio.utilities import ColorSpace
16 __author__ = 'ACES Developers'
17 __copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers'
19 __maintainer__ = 'ACES Developers'
20 __email__ = 'aces@oscars.org'
21 __status__ = 'Production'
23 __all__ = ['create_c_log',
27 def create_c_log(gamut,
41 Parameter description.
46 Return value description.
49 name = '%s - %s' % (transfer_function, gamut)
50 if transfer_function == '':
51 name = 'Linear - %s' % gamut
53 name = '%s' % transfer_function
58 cs.equality_group = ''
62 def legal_to_full(code_value):
63 return (code_value - 64) / (940 - 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
72 linear = (pow(10, (legal_to_full(code_value) - c3) / c1) - 1) / c2
77 cs.to_reference_transforms = []
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))
84 lut = '%s_to_linear.spi1d' % transfer_function
86 os.path.join(lut_directory, lut),
93 cs.to_reference_transforms.append({
96 'interpolation': 'linear',
97 'direction': 'forward'})
99 if gamut == 'Rec. 709 Daylight':
100 cs.to_reference_transforms.append({
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,
106 'direction': 'forward'})
107 elif gamut == 'Rec. 709 Tungsten':
108 cs.to_reference_transforms.append({
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,
114 'direction': 'forward'})
115 elif gamut == 'DCI-P3 Daylight':
116 cs.to_reference_transforms.append({
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,
122 'direction': 'forward'})
123 elif gamut == 'DCI-P3 Tungsten':
124 cs.to_reference_transforms.append({
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,
130 'direction': 'forward'})
131 elif gamut == 'Cinema Gamut Daylight':
132 cs.to_reference_transforms.append({
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,
138 'direction': 'forward'})
139 elif gamut == 'Cinema Gamut Tungsten':
140 cs.to_reference_transforms.append({
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,
146 'direction': 'forward'})
148 cs.from_reference_transforms = []
152 def create_colorspaces(lut_directory, lut_resolution_1d):
154 Generates the colorspace conversions.
159 Parameter description.
164 Return value description.
170 c_log_1 = create_c_log(
176 ["canonlog_rec709day"])
177 colorspaces.append(c_log_1)
179 c_log_2 = create_c_log(
185 ["canonlog_rec709tung"])
186 colorspaces.append(c_log_2)
188 c_log_3 = create_c_log(
194 ["canonlog_dcip3day"])
195 colorspaces.append(c_log_3)
197 c_log_4 = create_c_log(
203 ["canonlog_dcip3tung"])
204 colorspaces.append(c_log_4)
206 c_log_5 = create_c_log(
207 'Cinema Gamut Daylight',
212 ["canonlog_cgamutday"])
213 colorspaces.append(c_log_5)
215 c_log_6 = create_c_log(
216 'Cinema Gamut Tungsten',
221 ["canonlog_cgamuttung"])
222 colorspaces.append(c_log_6)
225 c_log_7 = create_c_log(
232 colorspaces.append(c_log_7)
235 c_log_8 = create_c_log(
242 colorspaces.append(c_log_8)
244 c_log_9 = create_c_log(
251 colorspaces.append(c_log_9)
253 c_log_10 = create_c_log(
260 colorspaces.append(c_log_10)
262 c_log_11 = create_c_log(
269 colorspaces.append(c_log_11)
271 c_log_12 = create_c_log(
272 'Cinema Gamut Daylight',
278 colorspaces.append(c_log_12)
280 c_log_13 = create_c_log(
281 'Cinema Gamut Tungsten',
287 colorspaces.append(c_log_13)