6a1bf3a56c91a0289fa42935c3633b77c1345664
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / createCanonColorSpaces.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import array
5
6 import aces_ocio.generateLUT as genlut
7 from aces_ocio.util import ColorSpace
8
9 #
10 # Canon-Log to ACES
11 #
12 def createCanonLog(gamut, transferFunction, name, lutDir, lutResolution1d):
13     name = "%s - %s" % (transferFunction, gamut)
14     if transferFunction == "":
15         name = "Linear - %s" % gamut
16     if gamut == "":
17         name = "%s" % transferFunction
18
19     cs = ColorSpace(name)
20     cs.description = name
21     cs.equalityGroup = ''
22     cs.family = 'Canon'
23     cs.isData = False
24
25     def legalToFull(codeValue):
26         return (codeValue - 64.0) / (940.0 - 64.0)
27
28     def canonLogToLinear(codeValue):
29         # log = fullToLegal(c1 * log10(c2*linear + 1) + c3)
30         # linear = (pow(10, (legalToFul(log) - c3)/c1) - 1)/c2
31         c1 = 0.529136
32         c2 = 10.1596
33         c3 = 0.0730597
34
35         linear = (pow(10.0, (legalToFull(codeValue) - c3) / c1) - 1.0) / c2
36         linear = 0.9 * linear
37         # print(codeValue, linear)
38         return linear
39
40     cs.toReferenceTransforms = []
41
42     if transferFunction == "Canon-Log":
43         data = array.array('f', "\0" * lutResolution1d * 4)
44         for c in range(lutResolution1d):
45             data[c] = canonLogToLinear(1023.0 * c / (lutResolution1d - 1))
46
47         lut = "%s_to_linear.spi1d" % transferFunction
48         genlut.writeSPI1D(lutDir + "/" + lut,
49                           0.0,
50                           1.0,
51                           data,
52                           lutResolution1d,
53                           1)
54
55         cs.toReferenceTransforms.append({
56             'type': 'lutFile',
57             'path': lut,
58             'interpolation': 'linear',
59             'direction': 'forward'
60         })
61
62     if gamut == 'Rec. 709 Daylight':
63         cs.toReferenceTransforms.append({
64             'type': 'matrix',
65             'matrix': [0.561538969, 0.402060105, 0.036400926, 0.0,
66                        0.092739623, 0.924121198, -0.016860821, 0.0,
67                        0.084812961, 0.006373835, 0.908813204, 0.0,
68                        0, 0, 0, 1.0],
69             'direction': 'forward'
70         })
71     elif gamut == 'Rec. 709 Tungsten':
72         cs.toReferenceTransforms.append({
73             'type': 'matrix',
74             'matrix': [0.566996399, 0.365079418, 0.067924183, 0.0,
75                        0.070901044, 0.880331008, 0.048767948, 0.0,
76                        0.073013542, -0.066540862, 0.99352732, 0.0,
77                        0, 0, 0, 1.0],
78             'direction': 'forward'
79         })
80     elif gamut == 'DCI-P3 Daylight':
81         cs.toReferenceTransforms.append({
82             'type': 'matrix',
83             'matrix': [0.607160575, 0.299507286, 0.093332140, 0.0,
84                        0.004968120, 1.050982224, -0.055950343, 0.0,
85                        -0.007839939, 0.000809127, 1.007030813, 0.0,
86                        0, 0, 0, 1.0],
87             'direction': 'forward'
88         })
89     elif gamut == 'DCI-P3 Tungsten':
90         cs.toReferenceTransforms.append({
91             'type': 'matrix',
92             'matrix': [0.650279125, 0.253880169, 0.095840706, 0.0,
93                        -0.026137986, 1.017900530, 0.008237456, 0.0,
94                        0.007757558, -0.063081669, 1.055324110, 0.0,
95                        0, 0, 0, 1.0],
96             'direction': 'forward'
97         })
98     elif gamut == 'Cinema Gamut Daylight':
99         cs.toReferenceTransforms.append({
100             'type': 'matrix',
101             'matrix': [0.763064455, 0.149021161, 0.087914384, 0.0,
102                        0.003657457, 1.10696038, -0.110617837, 0.0,
103                        -0.009407794, -0.218383305, 1.227791099, 0.0,
104                        0, 0, 0, 1.0],
105             'direction': 'forward'
106         })
107     elif gamut == 'Cinema Gamut Tungsten':
108         cs.toReferenceTransforms.append({
109             'type': 'matrix',
110             'matrix': [0.817416293, 0.090755698, 0.091828009, 0.0,
111                        -0.035361374, 1.065690585, -0.030329211, 0.0,
112                        0.010390366, -0.299271107, 1.288880741, 0.0,
113                        0, 0, 0, 1.0],
114             'direction': 'forward'
115         })
116
117     cs.fromReferenceTransforms = []
118     return cs
119
120
121 # Generate all color spaces conversion
122 def createColorSpaces(lutDir, lutResolution1d):
123     colorspaces = []
124
125     # Full conversion
126     CanonLog1 = createCanonLog(
127         "Rec. 709 Daylight", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
128     colorspaces.append(CanonLog1)
129
130     CanonLog2 = createCanonLog(
131         "Rec. 709 Tungsten", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
132     colorspaces.append(CanonLog2)
133
134     CanonLog3 = createCanonLog(
135         "DCI-P3 Daylight", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
136     colorspaces.append(CanonLog3)
137
138     CanonLog4 = createCanonLog(
139         "DCI-P3 Tungsten", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
140     colorspaces.append(CanonLog4)
141
142     CanonLog5 = createCanonLog(
143         "Cinema Gamut Daylight", "Canon-Log", "Canon-Log",
144         lutDir, lutResolution1d)
145     colorspaces.append(CanonLog5)
146
147     CanonLog6 = createCanonLog(
148         "Cinema Gamut Tungsten", "Canon-Log", "Canon-Log",
149         lutDir, lutResolution1d)
150     colorspaces.append(CanonLog6)
151
152     # Linearization only
153     CanonLog7 = createCanonLog(
154         '', "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
155     colorspaces.append(CanonLog7)
156
157     # Primaries only
158     CanonLog8 = createCanonLog(
159         "Rec. 709 Daylight", "", "Canon-Log", lutDir, lutResolution1d)
160     colorspaces.append(CanonLog8)
161
162     CanonLog9 = createCanonLog(
163         "Rec. 709 Tungsten", "", "Canon-Log", lutDir, lutResolution1d)
164     colorspaces.append(CanonLog9)
165
166     CanonLog10 = createCanonLog(
167         "DCI-P3 Daylight", "", "Canon-Log", lutDir, lutResolution1d)
168     colorspaces.append(CanonLog10)
169
170     CanonLog11 = createCanonLog("DCI-P3 Tungsten", "", "Canon-Log", lutDir,
171                                 lutResolution1d)
172     colorspaces.append(CanonLog11)
173
174     CanonLog12 = createCanonLog(
175         "Cinema Gamut Daylight", "", "Canon-Log", lutDir, lutResolution1d)
176     colorspaces.append(CanonLog12)
177
178     CanonLog13 = createCanonLog(
179         "Cinema Gamut Tungsten", "", "Canon-Log", lutDir, lutResolution1d)
180     colorspaces.append(CanonLog13)
181
182     return colorspaces