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