// // SPDX-License-Identifier: BSD-3-Clause // Copyright Contributors to the OpenEXR Project. // // clang-format off #ifndef _PyImathColor4Array2DImpl_h_ #define _PyImathColor4Array2DImpl_h_ // // This .C file was turned into a header file so that instantiations // of the various V3* types can be spread across multiple files in // order to work around MSVC limitations. // #include #include #include #include #include "PyImath.h" #include "PyImathMathExc.h" #include "PyImathDecorators.h" namespace PyImath { using namespace boost::python; using namespace IMATH_NAMESPACE; template struct Color4Array2DName { static const char *value(); }; // XXX fixme - template this // really this should get generated automatically... template static FixedArray2D Color4Array2D_get(FixedArray2D > &va) { return FixedArray2D(&va(0,0)[index], va.len().x,va.len().y, 4*va.stride().x, va.stride().y, va.handle()); } // template // static FixedArray2D > // Color4Array_cross0(const FixedArray2D > &va, const FixedArray2D > &vb) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); // FixedArray2D > f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).cross(vb(i,j)); // return f; // } // // template // static FixedArray2D > // Color4Array_cross1(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D > f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).cross(vb); // return f; // } // // template // static FixedArray2D // Color4Array_dot0(const FixedArray2D > &va, const FixedArray2D > &vb) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); // FixedArray2D f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).dot(vb(i,j)); // return f; // } // // template // static FixedArray2D // Color4Array_dot1(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).dot(vb); // return f; // } // template // static FixedArray2D // Color4Array_length(const FixedArray2D > &va) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).length(); // return f; // } // // template // static FixedArray2D // Color4Array_length2(const FixedArray2D > &va) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).length2(); // return f; // } // // template // static FixedArray2D > & // Color4Array_normalize(FixedArray2D > &va) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // for (size_t i = 0; i < len; ++i) // va(i,j).normalize(); // return va; // } // // template static FixedArray2D > // Color4Array_normalized(const FixedArray2D > &va) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D > f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j).normalized(); // return f; // } // template static FixedArray2D > Color4Array_mulT(const FixedArray2D > &va, T t) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) * t; return f; } // // template // static FixedArray2D > // Color4Array_mulM44(const FixedArray2D > &va, const IMATH_NAMESPACE::Matrix44 &m) // { // PY_IMATH_LEAVE_PYTHON; // IMATH_NAMESPACE::Vec2 len = va.len(); // FixedArray2D > f(len); // for (size_t i = 0; i < len; ++i) // f(i,j) = va(i,j) * m; // return f; // } // template static FixedArray2D > Color4Array_mulArrayT(const FixedArray2D > &va, const FixedArray2D &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) * vb(i,j); return f; } template static const FixedArray2D > & Color4Array_imulT(FixedArray2D > &va, T t) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) *= t; return va; } template static const FixedArray2D > & Color4Array_imulArrayT(FixedArray2D > &va, const FixedArray2D &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) *= vb(i,j); return va; } template static FixedArray2D > Color4Array_divT(const FixedArray2D > &va, T t) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) / t; return f; } template static FixedArray2D > Color4Array_divArrayT(const FixedArray2D > &va, const FixedArray2D &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) / vb(i,j); return f; } template static const FixedArray2D > & Color4Array_idivT(FixedArray2D > &va, T t) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) /= t; return va; } template static const FixedArray2D > & Color4Array_idivArrayT(FixedArray2D > &va, const FixedArray2D &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) /= vb(i,j); return va; } template static FixedArray2D > Color4Array_add(const FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) + vb(i,j); return f; } template static FixedArray2D > Color4Array_addColor(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) + vb; return f; } template static FixedArray2D > Color4Array_sub(const FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) - vb(i,j); return f; } template static FixedArray2D > Color4Array_subColor(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) - vb; return f; } template static FixedArray2D > Color4Array_rsubColor(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = vb - va(i,j); return f; } template static FixedArray2D > Color4Array_mul(const FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) * vb(i,j); return f; } template static FixedArray2D > Color4Array_mulColor(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) * vb; return f; } template static FixedArray2D > Color4Array_div(const FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) / vb(i,j); return f; } template static FixedArray2D > Color4Array_divColor(const FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = va(i,j) / vb; return f; } template static FixedArray2D > Color4Array_neg(const FixedArray2D > &va) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); FixedArray2D > f(len); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) f(i,j) = -va(i,j); return f; } template static const FixedArray2D > & Color4Array_iadd(FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) += vb(i,j); return va; } template static const FixedArray2D > & Color4Array_iaddColor(FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) += vb; return va; } template static const FixedArray2D > & Color4Array_isub(FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) -= vb(i,j); return va; } template static const FixedArray2D > & Color4Array_isubColor(FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) -= vb; return va; } template static const FixedArray2D > & Color4Array_imul(FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) *= vb(i,j); return va; } template static const FixedArray2D > & Color4Array_imulColor(FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) *= vb; return va; } template static const FixedArray2D > & Color4Array_idiv(FixedArray2D > &va, const FixedArray2D > &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.match_dimension(vb); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) /= vb(i,j); return va; } template static const FixedArray2D > & Color4Array_idivColor(FixedArray2D > &va, const IMATH_NAMESPACE::Color4 &vb) { PY_IMATH_LEAVE_PYTHON; IMATH_NAMESPACE::Vec2 len = va.len(); for (size_t j = 0; j < len.y; ++j) for (size_t i = 0; i < len.x; ++i) va(i,j) /= vb; return va; } template static void setItemTuple(FixedArray2D > &va, const tuple &index, const tuple &t) { if(t.attr("__len__")() == 4 && index.attr("__len__")() == 2) { Color4 v; v.r = extract(t[0]); v.g = extract(t[1]); v.b = extract(t[2]); v.a = extract(t[3]); va(va.canonical_index(extract(index[0]),va.len()[0]), va.canonical_index(extract(index[1]),va.len()[1])) = v; } else throw std::invalid_argument ("tuple of length 4 expected"); } template class_ > > register_Color4Array2D() { class_ > > color4Array2D_class = FixedArray2D >::register_(Color4Array2DName::value(),"Fixed length 2d array of IMATH_NAMESPACE::Color4"); color4Array2D_class .add_property("r",&Color4Array2D_get) .add_property("g",&Color4Array2D_get) .add_property("b",&Color4Array2D_get) .add_property("a",&Color4Array2D_get) // .def("dot",&Color4Array_dot0) // .def("dot",&Color4Array_dot1) // .def("cross", &Color4Array_cross0) // .def("cross", &Color4Array_cross1) // .def("length", &Color4Array_length) // .def("length2", &Color4Array_length2) // .def("normalize", &Color4Array_normalize,return_internal_reference<>()) // .def("normalized", &Color4Array_normalized) .def("__setitem__", &setItemTuple) .def("__mul__", &Color4Array_mulT) // .def("__mul__", &Color4Array_mulM44) // .def("__mul__", &Color4Array_mulM44) .def("__rmul__", &Color4Array_mulT) .def("__mul__", &Color4Array_mulArrayT) .def("__rmul__", &Color4Array_mulArrayT) .def("__imul__", &Color4Array_imulT,return_internal_reference<>()) .def("__imul__", &Color4Array_imulArrayT,return_internal_reference<>()) .def("__div__", &Color4Array_divT) .def("__div__", &Color4Array_divArrayT) .def("__truediv__", &Color4Array_divT) .def("__truediv__", &Color4Array_divArrayT) .def("__idiv__", &Color4Array_idivT,return_internal_reference<>()) .def("__idiv__", &Color4Array_idivArrayT,return_internal_reference<>()) .def("__itruediv__", &Color4Array_idivT,return_internal_reference<>()) .def("__itruediv__", &Color4Array_idivArrayT,return_internal_reference<>()) .def("__add__",&Color4Array_add) .def("__add__",&Color4Array_addColor) .def("__radd__",&Color4Array_addColor) .def("__sub__",&Color4Array_sub) .def("__sub__",&Color4Array_subColor) .def("__rsub__",&Color4Array_rsubColor) .def("__mul__",&Color4Array_mul) .def("__mul__",&Color4Array_mulColor) .def("__rmul__",&Color4Array_mulColor) .def("__div__",&Color4Array_div) .def("__div__",&Color4Array_divColor) .def("__truediv__",&Color4Array_div) .def("__truediv__",&Color4Array_divColor) .def("__neg__",&Color4Array_neg) .def("__iadd__",&Color4Array_iadd, return_internal_reference<>()) .def("__iadd__",&Color4Array_iaddColor, return_internal_reference<>()) .def("__isub__",&Color4Array_isub, return_internal_reference<>()) .def("__isub__",&Color4Array_isubColor, return_internal_reference<>()) .def("__imul__",&Color4Array_imul, return_internal_reference<>()) .def("__imul__",&Color4Array_imulColor, return_internal_reference<>()) .def("__idiv__",&Color4Array_idiv, return_internal_reference<>()) .def("__idiv__",&Color4Array_idivColor, return_internal_reference<>()) .def("__itruediv__",&Color4Array_idiv, return_internal_reference<>()) .def("__itruediv__",&Color4Array_idivColor, return_internal_reference<>()) ; add_comparison_functions(color4Array2D_class); decoratecopy(color4Array2D_class); return color4Array2D_class; } } // namespace PyImath #endif // _PyImathColor4ArrayImpl_h_