1
2import unittest, os, sys
3sys.path.append(os.path.join(sys.argv[1], "src", "pyglue"))
4import PyOpenColorIO as OCIO
5
6class TransformsTest(unittest.TestCase):
7
8    def test_interface(self):
9
10        ### AllocationTransform ###
11        at = OCIO.AllocationTransform()
12        self.assertEqual(OCIO.Constants.ALLOCATION_UNIFORM, at.getAllocation())
13        at.setAllocation(OCIO.Constants.ALLOCATION_LG2)
14        self.assertEqual(OCIO.Constants.ALLOCATION_LG2, at.getAllocation())
15        self.assertEqual(0, at.getNumVars())
16        at.setVars([0.1, 0.2, 0.3])
17        self.assertEqual(3, at.getNumVars())
18        newvars = at.getVars()
19        self.assertAlmostEqual(0.2, newvars[1], delta=1e-8)
20
21        at2 = OCIO.AllocationTransform(OCIO.Constants.ALLOCATION_LG2,
22                                       [0.1, 0.2, 0.3],
23                                       OCIO.Constants.TRANSFORM_DIR_INVERSE)
24        self.assertEqual(OCIO.Constants.ALLOCATION_LG2, at2.getAllocation())
25        self.assertEqual(3, at2.getNumVars())
26        newvars2 = at2.getVars()
27        for i in range(0, 3):
28            self.assertAlmostEqual(float(i+1)/10.0, newvars2[i], delta=1e-7)
29        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, at2.getDirection())
30
31        at3 = OCIO.AllocationTransform(allocation=OCIO.Constants.ALLOCATION_LG2,
32                                       vars=[0.1, 0.2, 0.3],
33                                       direction=OCIO.Constants.TRANSFORM_DIR_INVERSE)
34        self.assertEqual(OCIO.Constants.ALLOCATION_LG2, at3.getAllocation())
35        self.assertEqual(3, at3.getNumVars())
36        newvars3 = at3.getVars()
37        for i in range(0, 3):
38            self.assertAlmostEqual(float(i+1)/10.0, newvars3[i], delta=1e-7)
39        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, at3.getDirection())
40
41        ### Base Transform method tests ###
42        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_FORWARD, at.getDirection())
43        at.setDirection(OCIO.Constants.TRANSFORM_DIR_UNKNOWN)
44        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_UNKNOWN, at.getDirection())
45
46        ### CDLTransform ###
47        cdl = OCIO.CDLTransform()
48        CC = "<ColorCorrection id=\"foo\">"
49        CC += "<SOPNode>"
50        CC += "<Description>this is a descipt</Description>"
51        CC += "<Slope>1.1 1.2 1.3</Slope><Offset>2.1 2.2 2.3</Offset>"
52        CC += "<Power>3.1 3.2 3.3</Power>"
53        CC += "</SOPNode>"
54        CC += "<SatNode>"
55        CC += "<Saturation>0.7</Saturation>"
56        CC += "</SatNode>"
57        CC += "</ColorCorrection>"
58        # Don't want to deal with getting the correct path so this runs
59        #cdlfile = OCIO.CDLTransform().CreateFromFile("../OpenColorIO/src/jniglue/tests/org/OpenColorIO/test.cc", "foo")
60        #self.assertEqual(CC, cdlfile.getXML())
61        cdl.setXML(CC)
62        self.assertEqual(CC, cdl.getXML())
63        match = cdl.createEditableCopy()
64        match.setOffset([1.0, 1.0, 1.0])
65        self.assertEqual(False, cdl.equals(match))
66        cdl.setSlope([0.1, 0.2, 0.3])
67        cdl.setOffset([1.1, 1.2, 1.3])
68        cdl.setPower([2.1, 2.2, 2.3])
69        cdl.setSat(0.5)
70        CC2 = "<ColorCorrection id=\"foo\">"
71        CC2 += "<SOPNode>"
72        CC2 += "<Description>this is a descipt</Description>"
73        CC2 += "<Slope>0.1 0.2 0.3</Slope>"
74        CC2 += "<Offset>1.1 1.2 1.3</Offset>"
75        CC2 += "<Power>2.1 2.2 2.3</Power>"
76        CC2 += "</SOPNode>"
77        CC2 += "<SatNode>"
78        CC2 += "<Saturation>0.5</Saturation>"
79        CC2 += "</SatNode>""</ColorCorrection>"
80        self.assertEqual(CC2, cdl.getXML())
81        cdl.setSOP([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])
82        newsop = cdl.getSOP()
83        self.assertAlmostEqual(1.5, newsop[4], delta=1e-8)
84        slope = cdl.getSlope()
85        self.assertAlmostEqual(1.2, slope[1], delta=1e-7)
86        offset = cdl.getOffset()
87        self.assertAlmostEqual(1.6, offset[2], delta=1e-7)
88        power = cdl.getPower()
89        self.assertAlmostEqual(1.7, power[0], delta=1e-7)
90        self.assertAlmostEqual(0.5, cdl.getSat(), delta=1e-8)
91        luma = cdl.getSatLumaCoefs()
92        self.assertAlmostEqual(0.2126, luma[0], delta=1e-8)
93        self.assertAlmostEqual(0.7152, luma[1], delta=1e-8)
94        self.assertAlmostEqual(0.0722, luma[2], delta=1e-8)
95        cdl.setID("foobar123")
96        self.assertEqual("foobar123", cdl.getID())
97        cdl.setDescription("bar")
98        self.assertEqual("bar", cdl.getDescription())
99
100        cdl2 = OCIO.CDLTransform([0.1, 0.2, 0.3],
101                                 [1.1, 1.2, 1.3],
102                                 [2.1, 2.2, 2.3],
103                                 0.5,
104                                 OCIO.Constants.TRANSFORM_DIR_INVERSE,
105                                 'foobar123', 'bar')
106        slope2 = cdl2.getSlope()
107        offset2 = cdl2.getOffset()
108        power2 = cdl2.getPower()
109        luma2 = cdl2.getSatLumaCoefs()
110        for i in range(0, 3):
111            self.assertAlmostEqual(float(i+1)/10.0, slope2[i], delta=1e-7)
112            self.assertAlmostEqual(float(i+1)/10.0+1, offset2[i], delta=1e-7)
113            self.assertAlmostEqual(float(i+1)/10.0+2, power2[i], delta=1e-7)
114        self.assertAlmostEqual(0.5, cdl2.getSat(), delta=1e-8)
115        self.assertAlmostEqual(0.2126, luma2[0], delta=1e-8)
116        self.assertAlmostEqual(0.7152, luma2[1], delta=1e-8)
117        self.assertAlmostEqual(0.0722, luma2[2], delta=1e-8)
118        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, cdl2.getDirection())
119        self.assertEqual('foobar123', cdl2.getID())
120        self.assertEqual('bar', cdl2.getDescription())
121
122        cdl3 = OCIO.CDLTransform(slope=[0.1, 0.2, 0.3],
123                                 offset=[1.1, 1.2, 1.3],
124                                 power=[2.1, 2.2, 2.3],
125                                 sat=0.5,
126                                 direction=OCIO.Constants.TRANSFORM_DIR_INVERSE,
127                                 id='foobar123', description='bar')
128        slope3 = cdl2.getSlope()
129        offset3 = cdl2.getOffset()
130        power3 = cdl2.getPower()
131        luma3 = cdl2.getSatLumaCoefs()
132        for i in range(0, 3):
133            self.assertAlmostEqual(float(i+1)/10.0, slope3[i], delta=1e-7)
134            self.assertAlmostEqual(float(i+1)/10.0+1, offset3[i], delta=1e-7)
135            self.assertAlmostEqual(float(i+1)/10.0+2, power3[i], delta=1e-7)
136        self.assertAlmostEqual(0.5, cdl3.getSat(), delta=1e-8)
137        self.assertAlmostEqual(0.2126, luma3[0], delta=1e-8)
138        self.assertAlmostEqual(0.7152, luma3[1], delta=1e-8)
139        self.assertAlmostEqual(0.0722, luma3[2], delta=1e-8)
140        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, cdl3.getDirection())
141        self.assertEqual('foobar123', cdl3.getID())
142        self.assertEqual('bar', cdl3.getDescription())
143
144        ### ColorSpaceTransform ###
145        ct = OCIO.ColorSpaceTransform()
146        ct.setSrc("foo")
147        self.assertEqual("foo", ct.getSrc())
148        ct.setDst("bar")
149        self.assertEqual("bar", ct.getDst())
150
151        ### DisplayTransform ###
152        dt = OCIO.DisplayTransform()
153        dt.setInputColorSpaceName("lin18")
154        self.assertEqual("lin18", dt.getInputColorSpaceName())
155        dt.setLinearCC(ct)
156        foo = dt.getLinearCC()
157        dt.setColorTimingCC(cdl)
158        blah = dt.getColorTimingCC()
159        dt.setChannelView(at)
160        wee = dt.getChannelView()
161        dt.setDisplay("sRGB")
162        self.assertEqual("sRGB", dt.getDisplay())
163        dt.setView("foobar")
164        self.assertEqual("foobar", dt.getView())
165        cdl.setXML(CC)
166        dt.setDisplayCC(cdl)
167        cdldt = dt.getDisplayCC()
168        self.assertEqual(CC, cdldt.getXML())
169        dt.setLooksOverride("darkgrade")
170        self.assertEqual("darkgrade", dt.getLooksOverride())
171        dt.setLooksOverrideEnabled(True)
172        self.assertEqual(True, dt.getLooksOverrideEnabled())
173
174        dt2 = OCIO.DisplayTransform("lin18", "sRGB", "foobar",
175                                    OCIO.Constants.TRANSFORM_DIR_INVERSE)
176        self.assertEqual("lin18", dt2.getInputColorSpaceName())
177        self.assertEqual("sRGB", dt2.getDisplay())
178        self.assertEqual("foobar", dt2.getView())
179        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, dt2.getDirection())
180
181        dt3 = OCIO.DisplayTransform(inputColorSpaceName="lin18",
182                                    display="sRGB", view="foobar",
183                                    direction=OCIO.Constants.TRANSFORM_DIR_INVERSE)
184        self.assertEqual("lin18", dt3.getInputColorSpaceName())
185        self.assertEqual("sRGB", dt3.getDisplay())
186        self.assertEqual("foobar", dt3.getView())
187        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_INVERSE, dt3.getDirection())
188
189        ### ExponentTransform ###
190        et = OCIO.ExponentTransform()
191        et.setValue([0.1, 0.2, 0.3, 0.4])
192        evals = et.getValue()
193        self.assertAlmostEqual(0.3, evals[2], delta=1e-7)
194
195        ### FileTransform ###
196        ft = OCIO.FileTransform()
197        ft.setSrc("foo")
198        self.assertEqual("foo", ft.getSrc())
199        ft.setCCCId("foobar")
200        self.assertEqual("foobar", ft.getCCCId())
201        ft.setInterpolation(OCIO.Constants.INTERP_NEAREST)
202        self.assertEqual(OCIO.Constants.INTERP_NEAREST, ft.getInterpolation())
203        self.assertEqual(17, ft.getNumFormats())
204        self.assertEqual("flame", ft.getFormatNameByIndex(0))
205        self.assertEqual("3dl", ft.getFormatExtensionByIndex(0))
206
207        ### GroupTransform ###
208        gt = OCIO.GroupTransform()
209        gt.push_back(et)
210        gt.push_back(ft)
211        self.assertEqual(2, gt.size())
212        self.assertEqual(False, gt.empty())
213        foo = gt.getTransform(0)
214        self.assertEqual(OCIO.Constants.TRANSFORM_DIR_FORWARD, foo.getDirection())
215        gt.clear()
216        self.assertEqual(0, gt.size())
217
218        ### LogTransform ###
219        lt = OCIO.LogTransform()
220        lt.setBase(10.0)
221        self.assertEqual(10.0, lt.getBase())
222
223        ### LookTransform ###
224        lkt = OCIO.LookTransform()
225        lkt.setSrc("foo")
226        self.assertEqual("foo", lkt.getSrc())
227        lkt.setDst("bar")
228        self.assertEqual("bar", lkt.getDst())
229        lkt.setLooks("bar;foo")
230        self.assertEqual("bar;foo", lkt.getLooks())
231
232        ### MatrixTransform ###
233        mt = OCIO.MatrixTransform()
234        mmt = mt.createEditableCopy()
235        mt.setValue([0.1, 0.2, 0.3, 0.4,
236                     0.5, 0.6, 0.7, 0.8,
237                     0.9, 1.0, 1.1, 1.2,
238                     1.3, 1.4, 1.5, 1.6],
239                    [0.1, 0.2, 0.3, 0.4])
240        self.assertEqual(False, mt.equals(mmt))
241        m44_1, offset_1 = mt.getValue()
242        self.assertAlmostEqual(0.3, m44_1[2], delta=1e-7)
243        self.assertAlmostEqual(0.2, offset_1[1], delta=1e-7)
244        mt.setMatrix([1.1, 1.2, 1.3, 1.4,
245                      1.5, 1.6, 1.7, 1.8,
246                      1.9, 2.0, 2.1, 2.2,
247                      2.3, 2.4, 2.5, 2.6])
248        m44_2 = mt.getMatrix()
249        self.assertAlmostEqual(1.3, m44_2[2], delta=1e-7)
250        mt.setOffset([1.1, 1.2, 1.3, 1.4])
251        offset_2 = mt.getOffset()
252        self.assertAlmostEqual(1.4, offset_2[3])
253        mt.Fit([0.1, 0.1, 0.1, 0.1],
254               [0.9, 0.9, 0.9, 0.9],
255               [0.0, 0.0, 0.0, 0.0],
256               [1.1, 1.1, 1.1, 1.1])
257        m44_3 = mt.getMatrix()
258        self.assertAlmostEqual(1.3, m44_3[2], delta=1e-7)
259        m44_3, offset_2 = mt.Identity()
260        self.assertAlmostEqual(0.0, m44_3[1], delta=1e-7)
261        m44_2, offset_2 = mt.Sat(0.5, [0.2126, 0.7152, 0.0722])
262        self.assertAlmostEqual(0.3576, m44_2[1], delta=1e-7)
263        m44_2, offset_2 = mt.Scale([0.9, 0.8, 0.7, 1.])
264        self.assertAlmostEqual(0.9, m44_2[0], delta=1e-7)
265        m44_2, offset_2 = mt.View([1, 1, 1, 0], [0.2126, 0.7152, 0.0722])
266        self.assertAlmostEqual(0.0722, m44_2[2], delta=1e-7)
267
268        mt4 = OCIO.MatrixTransform([0.1, 0.2, 0.3, 0.4,
269                                    0.5, 0.6, 0.7, 0.8,
270                                    0.9, 1.0, 1.1, 1.2,
271                                    1.3, 1.4, 1.5, 1.6],
272                                   [0.1, 0.2, 0.3, 0.4],
273                                   OCIO.Constants.TRANSFORM_DIR_INVERSE)
274        m44_4, offset_4 = mt4.getValue()
275        for i in range(0, 16):
276            self.assertAlmostEqual(float(i+1)/10.0, m44_4[i], delta=1e-7)
277        for i in range(0, 4):
278            self.assertAlmostEqual(float(i+1)/10.0, offset_4[i], delta=1e-7)
279        self.assertEqual(mt4.getDirection(), OCIO.Constants.TRANSFORM_DIR_INVERSE)
280
281        mt5 = OCIO.MatrixTransform(matrix=[0.1, 0.2, 0.3, 0.4,
282                                           0.5, 0.6, 0.7, 0.8,
283                                           0.9, 1.0, 1.1, 1.2,
284                                           1.3, 1.4, 1.5, 1.6],
285                                   offset=[0.1, 0.2, 0.3, 0.4],
286                                   direction=OCIO.Constants.TRANSFORM_DIR_INVERSE)
287        m44_5, offset_5 = mt5.getValue()
288        for i in range(0, 16):
289            self.assertAlmostEqual(float(i+1)/10.0, m44_5[i], delta=1e-7)
290        for i in range(0, 4):
291            self.assertAlmostEqual(float(i+1)/10.0, offset_5[i], delta=1e-7)
292        self.assertEqual(mt5.getDirection(), OCIO.Constants.TRANSFORM_DIR_INVERSE)
293
294        ### TruelightTransform ###
295        """
296        tt = OCIO.TruelightTransform()
297        tt.setConfigRoot("/some/path")
298        self.assertEqual("/some/path", tt.getConfigRoot())
299        tt.setProfile("profileA")
300        self.assertEqual("profileA", tt.getProfile())
301        tt.setCamera("incam")
302        self.assertEqual("incam", tt.getCamera())
303        tt.setInputDisplay("dellmon")
304        self.assertEqual("dellmon", tt.getInputDisplay())
305        tt.setRecorder("blah")
306        self.assertEqual("blah", tt.getRecorder())
307        tt.setPrint("kodasomething")
308        self.assertEqual("kodasomething", tt.getPrint())
309        tt.setLamp("foobar")
310        self.assertEqual("foobar", tt.getLamp())
311        tt.setOutputCamera("somecam")
312        self.assertEqual("somecam", tt.getOutputCamera())
313        tt.setDisplay("sRGB")
314        self.assertEqual("sRGB", tt.getDisplay())
315        tt.setCubeInput("log")
316        self.assertEqual("log", tt.getCubeInput())
317        """
318