1 //
2 // SPDX-License-Identifier: BSD-3-Clause
3 // Copyright Contributors to the OpenEXR Project.
4 //
5 
6 // clang-format off
7 
8 #ifndef _PyImathColor4Array2DImpl_h_
9 #define _PyImathColor4Array2DImpl_h_
10 
11 //
12 // This .C file was turned into a header file so that instantiations
13 // of the various V3* types can be spread across multiple files in
14 // order to work around MSVC limitations.
15 //
16 
17 #include <Python.h>
18 #include <boost/python.hpp>
19 #include <boost/python/make_constructor.hpp>
20 #include <boost/format.hpp>
21 #include "PyImath.h"
22 #include "PyImathMathExc.h"
23 #include "PyImathDecorators.h"
24 
25 namespace PyImath {
26 using namespace boost::python;
27 using namespace IMATH_NAMESPACE;
28 
29 template <class T> struct Color4Array2DName { static const char *value(); };
30 
31 
32 // XXX fixme - template this
33 // really this should get generated automatically...
34 
35 template <class T,int index>
36 static FixedArray2D<T>
Color4Array2D_get(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va)37 Color4Array2D_get(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
38 {
39     return FixedArray2D<T>(&va(0,0)[index], va.len().x,va.len().y, 4*va.stride().x, va.stride().y, va.handle());
40 }
41 
42 
43 // template <class T>
44 // static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
45 // Color4Array_cross0(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
46 // {
47 //     PY_IMATH_LEAVE_PYTHON;
48 //     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
49 //     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
50 //     for (size_t i = 0; i < len; ++i)
51 //         f(i,j) = va(i,j).cross(vb(i,j));
52 //     return f;
53 // }
54 //
55 // template <class T>
56 // static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
57 // Color4Array_cross1(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
58 // {
59 //     PY_IMATH_LEAVE_PYTHON;
60 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
61 //     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
62 //     for (size_t i = 0; i < len; ++i)
63 //         f(i,j) = va(i,j).cross(vb);
64 //     return f;
65 // }
66 //
67 // template <class T>
68 // static FixedArray2D<T>
69 // Color4Array_dot0(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
70 // {
71 //     PY_IMATH_LEAVE_PYTHON;
72 //     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
73 //     FixedArray2D<T> f(len);
74 //     for (size_t i = 0; i < len; ++i)
75 //         f(i,j) = va(i,j).dot(vb(i,j));
76 //     return f;
77 // }
78 //
79 // template <class T>
80 // static FixedArray2D<T>
81 // Color4Array_dot1(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
82 // {
83 //     PY_IMATH_LEAVE_PYTHON;
84 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
85 //     FixedArray2D<T> f(len);
86 //     for (size_t i = 0; i < len; ++i)
87 //         f(i,j) = va(i,j).dot(vb);
88 //     return f;
89 // }
90 
91 // template <class T>
92 // static FixedArray2D<T>
93 // Color4Array_length(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
94 // {
95 //     PY_IMATH_LEAVE_PYTHON;
96 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
97 //     FixedArray2D<T> f(len);
98 //     for (size_t i = 0; i < len; ++i)
99 //         f(i,j) = va(i,j).length();
100 //     return f;
101 // }
102 //
103 // template <class T>
104 // static FixedArray2D<T>
105 // Color4Array_length2(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
106 // {
107 //     PY_IMATH_LEAVE_PYTHON;
108 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
109 //     FixedArray2D<T> f(len);
110 //     for (size_t i = 0; i < len; ++i)
111 //         f(i,j) = va(i,j).length2();
112 //     return f;
113 // }
114 //
115 // template <class T>
116 // static FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
117 // Color4Array_normalize(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
118 // {
119 //     PY_IMATH_LEAVE_PYTHON;
120 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
121 //     for (size_t i = 0; i < len; ++i)
122 //         va(i,j).normalize();
123 //     return va;
124 // }
125 //
126 // template <class T> static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
127 // Color4Array_normalized(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
128 // {
129 //     PY_IMATH_LEAVE_PYTHON;
130 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
131 //     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
132 //     for (size_t i = 0; i < len; ++i)
133 //         f(i,j) = va(i,j).normalized();
134 //     return f;
135 // }
136 //
137 template <class T>
138 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_mulT(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,T t)139 Color4Array_mulT(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, T t)
140 {
141     PY_IMATH_LEAVE_PYTHON;
142     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
143     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
144     for (size_t j = 0; j < len.y; ++j)
145         for (size_t i = 0; i < len.x; ++i)
146             f(i,j) = va(i,j) * t;
147     return f;
148 }
149 //
150 // template <class T, class U>
151 // static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
152 // Color4Array_mulM44(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Matrix44<U> &m)
153 // {
154 //     PY_IMATH_LEAVE_PYTHON;
155 //     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
156 //     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
157 //     for (size_t i = 0; i < len; ++i)
158 //         f(i,j) = va(i,j) * m;
159 //     return f;
160 // }
161 //
162 template <class T>
163 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_mulArrayT(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<T> & vb)164 Color4Array_mulArrayT(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<T> &vb)
165 {
166     PY_IMATH_LEAVE_PYTHON;
167     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
168     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
169     for (size_t j = 0; j < len.y; ++j)
170         for (size_t i = 0; i < len.x; ++i)
171             f(i,j) = va(i,j) * vb(i,j);
172     return f;
173 }
174 
175 template <class T>
176 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_imulT(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,T t)177 Color4Array_imulT(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, T t)
178 {
179     PY_IMATH_LEAVE_PYTHON;
180     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
181     for (size_t j = 0; j < len.y; ++j)
182         for (size_t i = 0; i < len.x; ++i)
183             va(i,j) *= t;
184     return va;
185 }
186 
187 template <class T>
188 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_imulArrayT(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<T> & vb)189 Color4Array_imulArrayT(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<T> &vb)
190 {
191     PY_IMATH_LEAVE_PYTHON;
192     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
193     for (size_t j = 0; j < len.y; ++j)
194         for (size_t i = 0; i < len.x; ++i)
195             va(i,j) *= vb(i,j);
196     return va;
197 }
198 
199 template <class T>
200 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_divT(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,T t)201 Color4Array_divT(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, T t)
202 {
203     PY_IMATH_LEAVE_PYTHON;
204     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
205     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
206     for (size_t j = 0; j < len.y; ++j)
207         for (size_t i = 0; i < len.x; ++i)
208             f(i,j) = va(i,j) / t;
209     return f;
210 }
211 
212 template <class T>
213 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_divArrayT(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<T> & vb)214 Color4Array_divArrayT(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<T> &vb)
215 {
216     PY_IMATH_LEAVE_PYTHON;
217     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
218     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
219     for (size_t j = 0; j < len.y; ++j)
220         for (size_t i = 0; i < len.x; ++i)
221             f(i,j) = va(i,j) / vb(i,j);
222     return f;
223 }
224 
225 template <class T>
226 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_idivT(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,T t)227 Color4Array_idivT(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, T t)
228 {
229     PY_IMATH_LEAVE_PYTHON;
230     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
231     for (size_t j = 0; j < len.y; ++j)
232         for (size_t i = 0; i < len.x; ++i)
233             va(i,j) /= t;
234     return va;
235 }
236 
237 template <class T>
238 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_idivArrayT(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<T> & vb)239 Color4Array_idivArrayT(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<T> &vb)
240 {
241     PY_IMATH_LEAVE_PYTHON;
242     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
243     for (size_t j = 0; j < len.y; ++j)
244         for (size_t i = 0; i < len.x; ++i)
245             va(i,j) /= vb(i,j);
246     return va;
247 }
248 
249 template <class T>
250 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_add(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)251 Color4Array_add(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
252 {
253     PY_IMATH_LEAVE_PYTHON;
254     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
255     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
256     for (size_t j = 0; j < len.y; ++j)
257         for (size_t i = 0; i < len.x; ++i)
258             f(i,j) = va(i,j) + vb(i,j);
259     return f;
260 }
261 
262 template <class T>
263 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_addColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)264 Color4Array_addColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
265 {
266     PY_IMATH_LEAVE_PYTHON;
267     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
268     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
269     for (size_t j = 0; j < len.y; ++j)
270         for (size_t i = 0; i < len.x; ++i)
271             f(i,j) = va(i,j) + vb;
272     return f;
273 }
274 
275 template <class T>
276 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_sub(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)277 Color4Array_sub(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
278 {
279     PY_IMATH_LEAVE_PYTHON;
280     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
281     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
282     for (size_t j = 0; j < len.y; ++j)
283         for (size_t i = 0; i < len.x; ++i)
284             f(i,j) = va(i,j) - vb(i,j);
285     return f;
286 }
287 
288 template <class T>
289 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_subColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)290 Color4Array_subColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
291 {
292     PY_IMATH_LEAVE_PYTHON;
293     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
294     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
295     for (size_t j = 0; j < len.y; ++j)
296         for (size_t i = 0; i < len.x; ++i)
297             f(i,j) = va(i,j) - vb;
298     return f;
299 }
300 
301 template <class T>
302 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_rsubColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)303 Color4Array_rsubColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
304 {
305     PY_IMATH_LEAVE_PYTHON;
306     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
307     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
308     for (size_t j = 0; j < len.y; ++j)
309         for (size_t i = 0; i < len.x; ++i)
310             f(i,j) = vb - va(i,j);
311     return f;
312 }
313 
314 template <class T>
315 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_mul(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)316 Color4Array_mul(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
317 {
318     PY_IMATH_LEAVE_PYTHON;
319     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
320     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
321     for (size_t j = 0; j < len.y; ++j)
322         for (size_t i = 0; i < len.x; ++i)
323             f(i,j) = va(i,j) * vb(i,j);
324     return f;
325 }
326 
327 template <class T>
328 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_mulColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)329 Color4Array_mulColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
330 {
331     PY_IMATH_LEAVE_PYTHON;
332     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
333     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
334     for (size_t j = 0; j < len.y; ++j)
335         for (size_t i = 0; i < len.x; ++i)
336             f(i,j) = va(i,j) * vb;
337     return f;
338 }
339 
340 template <class T>
341 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_div(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)342 Color4Array_div(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
343 {
344     PY_IMATH_LEAVE_PYTHON;
345     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
346     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
347     for (size_t j = 0; j < len.y; ++j)
348         for (size_t i = 0; i < len.x; ++i)
349             f(i,j) = va(i,j) / vb(i,j);
350     return f;
351 }
352 
353 template <class T>
354 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_divColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)355 Color4Array_divColor(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
356 {
357     PY_IMATH_LEAVE_PYTHON;
358     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
359     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
360     for (size_t j = 0; j < len.y; ++j)
361         for (size_t i = 0; i < len.x; ++i)
362             f(i,j) = va(i,j) / vb;
363     return f;
364 }
365 
366 template <class T>
367 static FixedArray2D<IMATH_NAMESPACE::Color4<T> >
Color4Array_neg(const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va)368 Color4Array_neg(const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va)
369 {
370     PY_IMATH_LEAVE_PYTHON;
371     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
372     FixedArray2D<IMATH_NAMESPACE::Color4<T> > f(len);
373     for (size_t j = 0; j < len.y; ++j)
374         for (size_t i = 0; i < len.x; ++i)
375             f(i,j) = -va(i,j);
376     return f;
377 }
378 
379 template <class T>
380 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_iadd(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)381 Color4Array_iadd(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
382 {
383     PY_IMATH_LEAVE_PYTHON;
384     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
385     for (size_t j = 0; j < len.y; ++j)
386         for (size_t i = 0; i < len.x; ++i)
387             va(i,j) += vb(i,j);
388     return va;
389 }
390 
391 template <class T>
392 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_iaddColor(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)393 Color4Array_iaddColor(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
394 {
395     PY_IMATH_LEAVE_PYTHON;
396     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
397     for (size_t j = 0; j < len.y; ++j)
398         for (size_t i = 0; i < len.x; ++i)
399             va(i,j) += vb;
400     return va;
401 }
402 
403 template <class T>
404 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_isub(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)405 Color4Array_isub(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
406 {
407     PY_IMATH_LEAVE_PYTHON;
408     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
409     for (size_t j = 0; j < len.y; ++j)
410         for (size_t i = 0; i < len.x; ++i)
411             va(i,j) -= vb(i,j);
412     return va;
413 }
414 
415 template <class T>
416 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_isubColor(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)417 Color4Array_isubColor(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
418 {
419     PY_IMATH_LEAVE_PYTHON;
420     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
421     for (size_t j = 0; j < len.y; ++j)
422         for (size_t i = 0; i < len.x; ++i)
423             va(i,j) -= vb;
424     return va;
425 }
426 
427 template <class T>
428 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_imul(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)429 Color4Array_imul(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
430 {
431     PY_IMATH_LEAVE_PYTHON;
432     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
433     for (size_t j = 0; j < len.y; ++j)
434         for (size_t i = 0; i < len.x; ++i)
435             va(i,j) *= vb(i,j);
436     return va;
437 }
438 
439 template <class T>
440 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_imulColor(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)441 Color4Array_imulColor(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
442 {
443     PY_IMATH_LEAVE_PYTHON;
444     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
445     for (size_t j = 0; j < len.y; ++j)
446         for (size_t i = 0; i < len.x; ++i)
447             va(i,j) *= vb;
448     return va;
449 }
450 
451 template <class T>
452 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_idiv(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const FixedArray2D<IMATH_NAMESPACE::Color4<T>> & vb)453 Color4Array_idiv(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &vb)
454 {
455     PY_IMATH_LEAVE_PYTHON;
456     IMATH_NAMESPACE::Vec2<size_t> len = va.match_dimension(vb);
457     for (size_t j = 0; j < len.y; ++j)
458         for (size_t i = 0; i < len.x; ++i)
459             va(i,j) /= vb(i,j);
460     return va;
461 }
462 
463 template <class T>
464 static const FixedArray2D<IMATH_NAMESPACE::Color4<T> > &
Color4Array_idivColor(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const IMATH_NAMESPACE::Color4<T> & vb)465 Color4Array_idivColor(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const IMATH_NAMESPACE::Color4<T> &vb)
466 {
467     PY_IMATH_LEAVE_PYTHON;
468     IMATH_NAMESPACE::Vec2<size_t> len = va.len();
469     for (size_t j = 0; j < len.y; ++j)
470         for (size_t i = 0; i < len.x; ++i)
471             va(i,j) /= vb;
472     return va;
473 }
474 
475 template <class T>
476 static void
setItemTuple(FixedArray2D<IMATH_NAMESPACE::Color4<T>> & va,const tuple & index,const tuple & t)477 setItemTuple(FixedArray2D<IMATH_NAMESPACE::Color4<T> > &va, const tuple &index, const tuple &t)
478 {
479     if(t.attr("__len__")() == 4 && index.attr("__len__")() == 2)
480     {
481         Color4<T> v;
482         v.r = extract<T>(t[0]);
483         v.g = extract<T>(t[1]);
484         v.b = extract<T>(t[2]);
485         v.a = extract<T>(t[3]);
486         va(va.canonical_index(extract<Py_ssize_t>(index[0]),va.len()[0]),
487            va.canonical_index(extract<Py_ssize_t>(index[1]),va.len()[1])) = v;
488     }
489     else
490       throw std::invalid_argument ("tuple of length 4 expected");
491 }
492 
493 template <class T>
494 class_<FixedArray2D<IMATH_NAMESPACE::Color4<T> > >
register_Color4Array2D()495 register_Color4Array2D()
496 {
497     class_<FixedArray2D<IMATH_NAMESPACE::Color4<T> > > color4Array2D_class =
498         FixedArray2D<IMATH_NAMESPACE::Color4<T> >::register_(Color4Array2DName<T>::value(),"Fixed length 2d array of IMATH_NAMESPACE::Color4");
499     color4Array2D_class
500         .add_property("r",&Color4Array2D_get<T,0>)
501         .add_property("g",&Color4Array2D_get<T,1>)
502         .add_property("b",&Color4Array2D_get<T,2>)
503         .add_property("a",&Color4Array2D_get<T,3>)
504 //         .def("dot",&Color4Array_dot0<T>)
505 //         .def("dot",&Color4Array_dot1<T>)
506 //         .def("cross", &Color4Array_cross0<T>)
507 //         .def("cross", &Color4Array_cross1<T>)
508 //         .def("length", &Color4Array_length<T>)
509 //         .def("length2", &Color4Array_length2<T>)
510 //         .def("normalize", &Color4Array_normalize<T>,return_internal_reference<>())
511 //         .def("normalized", &Color4Array_normalized<T>)
512         .def("__setitem__", &setItemTuple<T>)
513         .def("__mul__", &Color4Array_mulT<T>)
514 //         .def("__mul__", &Color4Array_mulM44<T, float>)
515 //         .def("__mul__", &Color4Array_mulM44<T, double>)
516         .def("__rmul__", &Color4Array_mulT<T>)
517         .def("__mul__", &Color4Array_mulArrayT<T>)
518         .def("__rmul__", &Color4Array_mulArrayT<T>)
519         .def("__imul__", &Color4Array_imulT<T>,return_internal_reference<>())
520         .def("__imul__", &Color4Array_imulArrayT<T>,return_internal_reference<>())
521         .def("__div__", &Color4Array_divT<T>)
522         .def("__div__", &Color4Array_divArrayT<T>)
523         .def("__truediv__", &Color4Array_divT<T>)
524         .def("__truediv__", &Color4Array_divArrayT<T>)
525         .def("__idiv__", &Color4Array_idivT<T>,return_internal_reference<>())
526         .def("__idiv__", &Color4Array_idivArrayT<T>,return_internal_reference<>())
527         .def("__itruediv__", &Color4Array_idivT<T>,return_internal_reference<>())
528         .def("__itruediv__", &Color4Array_idivArrayT<T>,return_internal_reference<>())
529         .def("__add__",&Color4Array_add<T>)
530         .def("__add__",&Color4Array_addColor<T>)
531         .def("__radd__",&Color4Array_addColor<T>)
532         .def("__sub__",&Color4Array_sub<T>)
533         .def("__sub__",&Color4Array_subColor<T>)
534         .def("__rsub__",&Color4Array_rsubColor<T>)
535         .def("__mul__",&Color4Array_mul<T>)
536         .def("__mul__",&Color4Array_mulColor<T>)
537         .def("__rmul__",&Color4Array_mulColor<T>)
538         .def("__div__",&Color4Array_div<T>)
539         .def("__div__",&Color4Array_divColor<T>)
540         .def("__truediv__",&Color4Array_div<T>)
541         .def("__truediv__",&Color4Array_divColor<T>)
542         .def("__neg__",&Color4Array_neg<T>)
543         .def("__iadd__",&Color4Array_iadd<T>, return_internal_reference<>())
544         .def("__iadd__",&Color4Array_iaddColor<T>, return_internal_reference<>())
545         .def("__isub__",&Color4Array_isub<T>, return_internal_reference<>())
546         .def("__isub__",&Color4Array_isubColor<T>, return_internal_reference<>())
547         .def("__imul__",&Color4Array_imul<T>, return_internal_reference<>())
548         .def("__imul__",&Color4Array_imulColor<T>, return_internal_reference<>())
549         .def("__idiv__",&Color4Array_idiv<T>, return_internal_reference<>())
550         .def("__idiv__",&Color4Array_idivColor<T>, return_internal_reference<>())
551         .def("__itruediv__",&Color4Array_idiv<T>, return_internal_reference<>())
552         .def("__itruediv__",&Color4Array_idivColor<T>, return_internal_reference<>())
553         ;
554 
555     add_comparison_functions(color4Array2D_class);
556     decoratecopy(color4Array2D_class);
557 
558     return color4Array2D_class;
559 }
560 
561 
562 }  // namespace PyImath
563 
564 #endif   // _PyImathColor4ArrayImpl_h_
565