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