3619dc3b689f49cdff1473e9ee54b32df0de7fd7
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / createREDColorSpaces.py
1 import array
2
3 import aces_ocio.generateLUT as genlut
4 from aces_ocio.util import ColorSpace, mat44FromMat33
5
6 #
7 # RED color spaces to ACES
8 #
9 def createREDlogFilm(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 = 'RED'
20     cs.isData=False
21
22     def cineonToLinear(codeValue):
23         nGamma = 0.6
24         blackPoint = 95.0
25         whitePoint = 685.0
26         codeValueToDensity = 0.002
27
28         blackLinear = pow(10.0, (blackPoint - whitePoint) * (codeValueToDensity / nGamma))
29         codeLinear = pow(10.0, (codeValue - whitePoint) * (codeValueToDensity / nGamma))
30
31         return (codeLinear - blackLinear)/(1.0 - blackLinear)
32
33     cs.toReferenceTransforms = []
34
35     if transferFunction == 'REDlogFilm':
36         data = array.array('f', "\0" * lutResolution1d * 4)
37         for c in range(lutResolution1d):
38             data[c] = cineonToLinear(1023.0*c/(lutResolution1d-1))
39
40         lut = "CineonLog_to_linear.spi1d"
41         genlut.writeSPI1D(lutDir + "/" + lut, 0.0, 1.0, data, lutResolution1d, 1)
42
43         cs.toReferenceTransforms.append( {
44             'type':'lutFile', 
45             'path':lut, 
46             'interpolation':'linear', 
47             'direction':'forward'
48         } )
49
50     if gamut == 'DRAGONcolor':
51         cs.toReferenceTransforms.append( {
52             'type':'matrix',
53             'matrix':mat44FromMat33([0.532279,  0.376648,  0.091073, 
54                                      0.046344,  0.974513, -0.020860, 
55                                     -0.053976, -0.000320, 1.054267]),
56             'direction':'forward'
57         })
58     elif gamut == 'DRAGONcolor2':
59         cs.toReferenceTransforms.append( {
60             'type':'matrix',
61             'matrix':mat44FromMat33([0.468452,  0.331484,  0.200064, 
62                                      0.040787,  0.857658,  0.101553, 
63                                     -0.047504, -0.000282, 1.047756]),
64             'direction':'forward'
65         })
66     elif gamut == 'REDcolor2':
67         cs.toReferenceTransforms.append( {
68             'type':'matrix',
69             'matrix':mat44FromMat33([0.480997, 0.402289, 0.116714, 
70                                     -0.004938, 1.000154, 0.004781, 
71                                     -0.105257, 0.025320, 1.079907]),
72             'direction':'forward'
73         })
74     elif gamut == 'REDcolor3':
75         cs.toReferenceTransforms.append( {
76             'type':'matrix',
77             'matrix':mat44FromMat33([0.512136, 0.360370, 0.127494, 
78                                      0.070377, 0.903884, 0.025737, 
79                                     -0.020824, 0.017671, 1.003123]),
80             'direction':'forward'
81         })
82     elif gamut == 'REDcolor4':
83         cs.toReferenceTransforms.append( {
84             'type':'matrix',
85             'matrix':mat44FromMat33([0.474202, 0.333677, 0.192121, 
86                                      0.065164, 0.836932, 0.097901, 
87                                     -0.019281, 0.016362, 1.002889]),
88             'direction':'forward'
89         })
90
91     cs.fromReferenceTransforms = []
92     return cs
93
94 # Generate all color spaces conversion
95 def createColorSpaces(lutDir, lutResolution1d):
96     colorspaces = []
97
98     # Full conversion
99     REDlogFilmDRAGON = createREDlogFilm("DRAGONcolor", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
100     colorspaces.append(REDlogFilmDRAGON)
101
102     REDlogFilmDRAGON2 = createREDlogFilm("DRAGONcolor2", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
103     colorspaces.append(REDlogFilmDRAGON2)
104
105     REDlogFilmREDcolor2 = createREDlogFilm("REDcolor2", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
106     colorspaces.append(REDlogFilmREDcolor2)
107
108     REDlogFilmREDcolor3 = createREDlogFilm("REDcolor3", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
109     colorspaces.append(REDlogFilmREDcolor3)
110
111     REDlogFilmREDcolor4 = createREDlogFilm("REDcolor4", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
112     colorspaces.append(REDlogFilmREDcolor4)
113
114     # Linearization only
115     REDlogFilmDRAGON = createREDlogFilm("", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
116     colorspaces.append(REDlogFilmDRAGON)
117
118     # Primaries only
119     REDlogFilmDRAGON = createREDlogFilm("DRAGONcolor", "", "REDlogFilm", lutDir, lutResolution1d)
120     colorspaces.append(REDlogFilmDRAGON)
121
122     REDlogFilmDRAGON2 = createREDlogFilm("DRAGONcolor2", "", "REDlogFilm", lutDir, lutResolution1d)
123     colorspaces.append(REDlogFilmDRAGON2)
124
125     REDlogFilmREDcolor2 = createREDlogFilm("REDcolor2", "", "REDlogFilm", lutDir, lutResolution1d)
126     colorspaces.append(REDlogFilmREDcolor2)
127
128     REDlogFilmREDcolor3 = createREDlogFilm("REDcolor3", "", "REDlogFilm", lutDir, lutResolution1d)
129     colorspaces.append(REDlogFilmREDcolor3)
130
131     REDlogFilmREDcolor4 = createREDlogFilm("REDcolor4", "", "REDlogFilm", lutDir, lutResolution1d)
132     colorspaces.append(REDlogFilmREDcolor4)
133
134     return colorspaces