Add module headers doctoring skeletons.
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / createREDColorSpaces.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Implements support for *RED* colorspaces conversions and transfer functions.
6 """
7
8 import array
9
10 import aces_ocio.generateLUT as genlut
11 from aces_ocio.util import ColorSpace, mat44FromMat33
12
13 __author__ = 'ACES Developers'
14 __copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers'
15 __license__ = ''
16 __maintainer__ = 'ACES Developers'
17 __email__ = 'aces@oscars.org'
18 __status__ = 'Production'
19
20 __all__ = ['createREDlogFilm',
21            'createColorSpaces']
22
23
24 def createREDlogFilm(gamut, transferFunction, name, lutDir, lutResolution1d):
25     """
26     Object description.
27
28     RED colorspaces to ACES.
29
30     Parameters
31     ----------
32     parameter : type
33         Parameter description.
34
35     Returns
36     -------
37     type
38          Return value description.
39     """
40
41     name = "%s - %s" % (transferFunction, gamut)
42     if transferFunction == "":
43         name = "Linear - %s" % gamut
44     if gamut == "":
45         name = "%s" % transferFunction
46
47     cs = ColorSpace(name)
48     cs.description = name
49     cs.equalityGroup = ''
50     cs.family = 'RED'
51     cs.isData = False
52
53     def cineonToLinear(codeValue):
54         nGamma = 0.6
55         blackPoint = 95.0
56         whitePoint = 685.0
57         codeValueToDensity = 0.002
58
59         blackLinear = pow(10.0, (blackPoint - whitePoint) * (
60             codeValueToDensity / nGamma))
61         codeLinear = pow(10.0, (codeValue - whitePoint) * (
62             codeValueToDensity / nGamma))
63
64         return (codeLinear - blackLinear) / (1.0 - blackLinear)
65
66     cs.toReferenceTransforms = []
67
68     if transferFunction == 'REDlogFilm':
69         data = array.array('f', "\0" * lutResolution1d * 4)
70         for c in range(lutResolution1d):
71             data[c] = cineonToLinear(1023.0 * c / (lutResolution1d - 1))
72
73         lut = "CineonLog_to_linear.spi1d"
74         genlut.writeSPI1D(lutDir + "/" + lut,
75                           0.0,
76                           1.0,
77                           data,
78                           lutResolution1d,
79                           1)
80
81         cs.toReferenceTransforms.append({
82             'type': 'lutFile',
83             'path': lut,
84             'interpolation': 'linear',
85             'direction': 'forward'
86         })
87
88     if gamut == 'DRAGONcolor':
89         cs.toReferenceTransforms.append({
90             'type': 'matrix',
91             'matrix': mat44FromMat33([0.532279, 0.376648, 0.091073,
92                                       0.046344, 0.974513, -0.020860,
93                                       -0.053976, -0.000320, 1.054267]),
94             'direction': 'forward'
95         })
96     elif gamut == 'DRAGONcolor2':
97         cs.toReferenceTransforms.append({
98             'type': 'matrix',
99             'matrix': mat44FromMat33([0.468452, 0.331484, 0.200064,
100                                       0.040787, 0.857658, 0.101553,
101                                       -0.047504, -0.000282, 1.047756]),
102             'direction': 'forward'
103         })
104     elif gamut == 'REDcolor2':
105         cs.toReferenceTransforms.append({
106             'type': 'matrix',
107             'matrix': mat44FromMat33([0.480997, 0.402289, 0.116714,
108                                       -0.004938, 1.000154, 0.004781,
109                                       -0.105257, 0.025320, 1.079907]),
110             'direction': 'forward'
111         })
112     elif gamut == 'REDcolor3':
113         cs.toReferenceTransforms.append({
114             'type': 'matrix',
115             'matrix': mat44FromMat33([0.512136, 0.360370, 0.127494,
116                                       0.070377, 0.903884, 0.025737,
117                                       -0.020824, 0.017671, 1.003123]),
118             'direction': 'forward'
119         })
120     elif gamut == 'REDcolor4':
121         cs.toReferenceTransforms.append({
122             'type': 'matrix',
123             'matrix': mat44FromMat33([0.474202, 0.333677, 0.192121,
124                                       0.065164, 0.836932, 0.097901,
125                                       -0.019281, 0.016362, 1.002889]),
126             'direction': 'forward'
127         })
128
129     cs.fromReferenceTransforms = []
130     return cs
131
132
133 def createColorSpaces(lutDir, lutResolution1d):
134     """
135     Generates the colorspace conversions.
136
137     Parameters
138     ----------
139     parameter : type
140         Parameter description.
141
142     Returns
143     -------
144     type
145          Return value description.
146     """
147
148     colorspaces = []
149
150     # Full conversion
151     REDlogFilmDRAGON = createREDlogFilm(
152         "DRAGONcolor", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
153     colorspaces.append(REDlogFilmDRAGON)
154
155     REDlogFilmDRAGON2 = createREDlogFilm(
156         "DRAGONcolor2", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
157     colorspaces.append(REDlogFilmDRAGON2)
158
159     REDlogFilmREDcolor2 = createREDlogFilm(
160         "REDcolor2", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
161     colorspaces.append(REDlogFilmREDcolor2)
162
163     REDlogFilmREDcolor3 = createREDlogFilm(
164         "REDcolor3", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
165     colorspaces.append(REDlogFilmREDcolor3)
166
167     REDlogFilmREDcolor4 = createREDlogFilm(
168         "REDcolor4", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
169     colorspaces.append(REDlogFilmREDcolor4)
170
171     # Linearization only
172     REDlogFilmDRAGON = createREDlogFilm(
173         "", "REDlogFilm", "REDlogFilm", lutDir, lutResolution1d)
174     colorspaces.append(REDlogFilmDRAGON)
175
176     # Primaries only
177     REDlogFilmDRAGON = createREDlogFilm(
178         "DRAGONcolor", "", "REDlogFilm", lutDir, lutResolution1d)
179     colorspaces.append(REDlogFilmDRAGON)
180
181     REDlogFilmDRAGON2 = createREDlogFilm(
182         "DRAGONcolor2", "", "REDlogFilm", lutDir, lutResolution1d)
183     colorspaces.append(REDlogFilmDRAGON2)
184
185     REDlogFilmREDcolor2 = createREDlogFilm(
186         "REDcolor2", "", "REDlogFilm", lutDir, lutResolution1d)
187     colorspaces.append(REDlogFilmREDcolor2)
188
189     REDlogFilmREDcolor3 = createREDlogFilm(
190         "REDcolor3", "", "REDlogFilm", lutDir, lutResolution1d)
191     colorspaces.append(REDlogFilmREDcolor3)
192
193     REDlogFilmREDcolor4 = createREDlogFilm(
194         "REDcolor4", "", "REDlogFilm", lutDir, lutResolution1d)
195     colorspaces.append(REDlogFilmREDcolor4)
196
197     return colorspaces