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