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