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