d782295fb87b8c2b11ed085b1854a03c8ff25263
[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, mat44FromMat33
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, 0.0, 1.0, data, lutResolution1d, 1)
49
50         cs.toReferenceTransforms.append( {
51             'type':'lutFile', 
52             'path':lut, 
53             'interpolation':'linear', 
54             'direction':'forward'
55         } )
56
57     if gamut == 'Rec. 709 Daylight':
58         cs.toReferenceTransforms.append( {
59             'type':'matrix',
60             'matrix':[0.561538969, 0.402060105, 0.036400926, 0.0, 
61                         0.092739623, 0.924121198, -0.016860821, 0.0, 
62                         0.084812961, 0.006373835, 0.908813204, 0.0, 
63                         0,0,0,1.0],
64             'direction':'forward'
65         })
66     elif gamut == 'Rec. 709 Tungsten':
67         cs.toReferenceTransforms.append( {
68             'type':'matrix',
69             'matrix':[0.566996399, 0.365079418, 0.067924183, 0.0, 
70                         0.070901044, 0.880331008, 0.048767948, 0.0, 
71                         0.073013542, -0.066540862, 0.99352732, 0.0, 
72                         0,0,0,1.0],
73             'direction':'forward'
74         })
75     elif gamut == 'DCI-P3 Daylight':
76         cs.toReferenceTransforms.append( {
77             'type':'matrix',
78             'matrix':[0.607160575, 0.299507286, 0.093332140, 0.0, 
79                         0.004968120, 1.050982224, -0.055950343, 0.0, 
80                         -0.007839939, 0.000809127, 1.007030813, 0.0, 
81                         0,0,0,1.0],
82             'direction':'forward'
83         })
84     elif gamut == 'DCI-P3 Tungsten':
85         cs.toReferenceTransforms.append( {
86             'type':'matrix',
87             'matrix':[0.650279125, 0.253880169, 0.095840706, 0.0, 
88                         -0.026137986, 1.017900530, 0.008237456, 0.0, 
89                         0.007757558, -0.063081669, 1.055324110, 0.0, 
90                         0,0,0,1.0],
91             'direction':'forward'
92         })
93     elif gamut == 'Cinema Gamut Daylight':
94         cs.toReferenceTransforms.append( {
95             'type':'matrix',
96             'matrix':[0.763064455, 0.149021161, 0.087914384, 0.0, 
97                         0.003657457, 1.10696038, -0.110617837, 0.0, 
98                         -0.009407794,-0.218383305, 1.227791099, 0.0, 
99                         0,0,0,1.0],
100             'direction':'forward'
101         })
102     elif gamut == 'Cinema Gamut Tungsten':
103         cs.toReferenceTransforms.append( {
104             'type':'matrix',
105             'matrix':[0.817416293, 0.090755698, 0.091828009, 0.0, 
106                         -0.035361374, 1.065690585, -0.030329211, 0.0, 
107                         0.010390366, -0.299271107, 1.288880741, 0.0, 
108                         0,0,0,1.0],
109             'direction':'forward'
110         })
111
112     cs.fromReferenceTransforms = []
113     return cs
114
115 # Generate all color spaces conversion
116 def createColorSpaces(lutDir, lutResolution1d):
117     colorspaces = []
118
119     # Full conversion
120     CanonLog1 = createCanonLog("Rec. 709 Daylight", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
121     colorspaces.append(CanonLog1)
122
123     CanonLog2 = createCanonLog("Rec. 709 Tungsten", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
124     colorspaces.append(CanonLog2)
125
126     CanonLog3 = createCanonLog("DCI-P3 Daylight", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
127     colorspaces.append(CanonLog3)
128
129     CanonLog4 = createCanonLog("DCI-P3 Tungsten", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
130     colorspaces.append(CanonLog4)
131
132     CanonLog5 = createCanonLog("Cinema Gamut Daylight", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
133     colorspaces.append(CanonLog5)
134
135     CanonLog6 = createCanonLog("Cinema Gamut Tungsten", "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
136     colorspaces.append(CanonLog6)
137
138     # Linearization only
139     CanonLog7 = createCanonLog('', "Canon-Log", "Canon-Log", lutDir, lutResolution1d)
140     colorspaces.append(CanonLog7)
141
142     # Primaries only
143     CanonLog8 = createCanonLog("Rec. 709 Daylight", "", "Canon-Log", lutDir, lutResolution1d)
144     colorspaces.append(CanonLog8)
145
146     CanonLog9 = createCanonLog("Rec. 709 Tungsten", "", "Canon-Log", lutDir, lutResolution1d)
147     colorspaces.append(CanonLog9)
148
149     CanonLog10 = createCanonLog("DCI-P3 Daylight", "", "Canon-Log", lutDir, lutResolution1d)
150     colorspaces.append(CanonLog10)
151
152     CanonLog11 = createCanonLog("DCI-P3 Tungsten", "", "Canon-Log", lutDir, lutResolution1d)
153     colorspaces.append(CanonLog11)
154
155     CanonLog12 = createCanonLog("Cinema Gamut Daylight", "", "Canon-Log", lutDir, lutResolution1d)
156     colorspaces.append(CanonLog12)
157
158     CanonLog13 = createCanonLog("Cinema Gamut Tungsten", "", "Canon-Log", lutDir, lutResolution1d)
159     colorspaces.append(CanonLog13)
160
161     return colorspaces