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