Changeset View
Changeset View
Standalone View
Standalone View
source/blender/python/mathutils/mathutils_Color.c
| Show First 20 Lines • Show All 400 Lines • ▼ Show 20 Lines | |||||
| }; | }; | ||||
| static PyMappingMethods Color_AsMapping = { | static PyMappingMethods Color_AsMapping = { | ||||
| (lenfunc)Color_len, | (lenfunc)Color_len, | ||||
| (binaryfunc)Color_subscript, | (binaryfunc)Color_subscript, | ||||
| (objobjargproc)Color_ass_subscript | (objobjargproc)Color_ass_subscript | ||||
| }; | }; | ||||
| /* numeric */ | /* Numeric Protocols */ | ||||
| /* element-wise addition: obj + obj */ | |||||
| /* addition: obj + obj */ | |||||
| static PyObject *Color_add(PyObject *v1, PyObject *v2) | static PyObject *Color_add(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color1 = NULL, *color2 = NULL; | return mathtutils_generic_elem_op(v1, v2, ADD); | ||||
| float col[COLOR_SIZE]; | |||||
| if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color addition: (%s + %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | } | ||||
| color1 = (ColorObject *)v1; | |||||
| color2 = (ColorObject *)v2; | |||||
| if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) | /* element-wise addition in-place: obj + obj */ | ||||
| return NULL; | |||||
| add_vn_vnvn(col, color1->col, color2->col, COLOR_SIZE); | |||||
| return Color_CreatePyObject(col, Py_TYPE(v1)); | |||||
| } | |||||
| /* addition in-place: obj += obj */ | |||||
| static PyObject *Color_iadd(PyObject *v1, PyObject *v2) | static PyObject *Color_iadd(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color1 = NULL, *color2 = NULL; | return mathtutils_generic_elem_op_inplace(v1, v2, ADD); | ||||
| if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color addition: (%s += %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | |||||
| color1 = (ColorObject *)v1; | |||||
| color2 = (ColorObject *)v2; | |||||
| if (BaseMath_ReadCallback_ForWrite(color1) == -1 || BaseMath_ReadCallback(color2) == -1) | |||||
| return NULL; | |||||
| add_vn_vn(color1->col, color2->col, COLOR_SIZE); | |||||
| (void)BaseMath_WriteCallback(color1); | |||||
| Py_INCREF(v1); | |||||
| return v1; | |||||
| } | } | ||||
| /* subtraction: obj - obj */ | /* element-wise subtraction: obj - obj */ | ||||
| static PyObject *Color_sub(PyObject *v1, PyObject *v2) | static PyObject *Color_sub(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color1 = NULL, *color2 = NULL; | return mathtutils_generic_elem_op(v1, v2, SUB); | ||||
| float col[COLOR_SIZE]; | |||||
| if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color subtraction: (%s - %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | } | ||||
| color1 = (ColorObject *)v1; | |||||
| color2 = (ColorObject *)v2; | |||||
| if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1) | |||||
| return NULL; | |||||
| sub_vn_vnvn(col, color1->col, color2->col, COLOR_SIZE); | /* element-wise subtraction in-place: obj -= obj */ | ||||
| return Color_CreatePyObject(col, Py_TYPE(v1)); | |||||
| } | |||||
| /* subtraction in-place: obj -= obj */ | |||||
| static PyObject *Color_isub(PyObject *v1, PyObject *v2) | static PyObject *Color_isub(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color1 = NULL, *color2 = NULL; | return mathtutils_generic_elem_op_inplace(v1, v2, SUB); | ||||
| if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color subtraction: (%s -= %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | |||||
| color1 = (ColorObject *)v1; | |||||
| color2 = (ColorObject *)v2; | |||||
| if (BaseMath_ReadCallback_ForWrite(color1) == -1 || BaseMath_ReadCallback(color2) == -1) | |||||
| return NULL; | |||||
| sub_vn_vn(color1->col, color2->col, COLOR_SIZE); | |||||
| (void)BaseMath_WriteCallback(color1); | |||||
| Py_INCREF(v1); | |||||
| return v1; | |||||
| } | |||||
| static PyObject *color_mul_float(ColorObject *color, const float scalar) | |||||
| { | |||||
| float tcol[COLOR_SIZE]; | |||||
| mul_vn_vn_fl(tcol, color->col, COLOR_SIZE, scalar); | |||||
| return Color_CreatePyObject(tcol, Py_TYPE(color)); | |||||
| } | } | ||||
| /* element-wise multiplication: obj * obj */ | |||||
| static PyObject *Color_mul(PyObject *v1, PyObject *v2) | static PyObject *Color_mul(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color1 = NULL, *color2 = NULL; | return mathtutils_generic_elem_op(v1, v2, MUL); | ||||
| float scalar; | |||||
| if (ColorObject_Check(v1)) { | |||||
| color1 = (ColorObject *)v1; | |||||
| if (BaseMath_ReadCallback(color1) == -1) | |||||
| return NULL; | |||||
| } | } | ||||
| if (ColorObject_Check(v2)) { | |||||
| color2 = (ColorObject *)v2; | |||||
| if (BaseMath_ReadCallback(color2) == -1) | |||||
| return NULL; | |||||
| } | |||||
| /* make sure v1 is always the vector */ | /* element-wise multiplication in-place: obj *= obj */ | ||||
| if (color1 && color2) { | |||||
| /* col * col, don't support yet! */ | |||||
| } | |||||
| else if (color1) { | |||||
| if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR * FLOAT */ | |||||
| return color_mul_float(color1, scalar); | |||||
| } | |||||
| } | |||||
| else if (color2) { | |||||
| if (((scalar = PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred()) == 0) { /* FLOAT * COLOR */ | |||||
| return color_mul_float(color2, scalar); | |||||
| } | |||||
| } | |||||
| else { | |||||
| BLI_assert(!"internal error"); | |||||
| } | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color multiplication: not supported between " | |||||
| "'%.200s' and '%.200s' types", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | |||||
| static PyObject *Color_div(PyObject *v1, PyObject *v2) | |||||
| { | |||||
| ColorObject *color1 = NULL; | |||||
| float scalar; | |||||
| if (ColorObject_Check(v1)) { | |||||
| color1 = (ColorObject *)v1; | |||||
| if (BaseMath_ReadCallback(color1) == -1) | |||||
| return NULL; | |||||
| } | |||||
| else { | |||||
| PyErr_SetString(PyExc_TypeError, | |||||
| "Color division not supported in this order"); | |||||
| return NULL; | |||||
| } | |||||
| /* make sure v1 is always the vector */ | |||||
| if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR * FLOAT */ | |||||
| if (scalar == 0.0f) { | |||||
| PyErr_SetString(PyExc_ZeroDivisionError, | |||||
| "Color division: divide by zero error"); | |||||
| return NULL; | |||||
| } | |||||
| return color_mul_float(color1, 1.0f / scalar); | |||||
| } | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color multiplication: not supported between " | |||||
| "'%.200s' and '%.200s' types", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | |||||
| /* multiplication in-place: obj *= obj */ | |||||
| static PyObject *Color_imul(PyObject *v1, PyObject *v2) | static PyObject *Color_imul(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color = (ColorObject *)v1; | return mathtutils_generic_elem_op_inplace(v1, v2, MUL); | ||||
| float scalar; | |||||
| if (BaseMath_ReadCallback_ForWrite(color) == -1) | |||||
| return NULL; | |||||
| /* only support color *= float */ | |||||
| if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR *= FLOAT */ | |||||
| mul_vn_fl(color->col, COLOR_SIZE, scalar); | |||||
| } | |||||
| else { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color multiplication: (%s *= %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | } | ||||
| (void)BaseMath_WriteCallback(color); | /* element-wise division: obj / obj */ | ||||
| Py_INCREF(v1); | static PyObject *Color_div(PyObject *v1, PyObject *v2) | ||||
| return v1; | { | ||||
| return mathtutils_generic_elem_op(v1, v2, DIV); | |||||
| } | } | ||||
| /* multiplication in-place: obj *= obj */ | /* element-wise division in-place: obj /= obj */ | ||||
| static PyObject *Color_idiv(PyObject *v1, PyObject *v2) | static PyObject *Color_idiv(PyObject *v1, PyObject *v2) | ||||
| { | { | ||||
| ColorObject *color = (ColorObject *)v1; | return mathtutils_generic_elem_op_inplace(v1, v2, DIV); | ||||
| float scalar; | |||||
| if (BaseMath_ReadCallback_ForWrite(color) == -1) | |||||
| return NULL; | |||||
| /* only support color /= float */ | |||||
| if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR /= FLOAT */ | |||||
| if (scalar == 0.0f) { | |||||
| PyErr_SetString(PyExc_ZeroDivisionError, | |||||
| "Color division: divide by zero error"); | |||||
| return NULL; | |||||
| } | |||||
| mul_vn_fl(color->col, COLOR_SIZE, 1.0f / scalar); | |||||
| } | |||||
| else { | |||||
| PyErr_Format(PyExc_TypeError, | |||||
| "Color division: (%s /= %s) " | |||||
| "invalid type for this operation", | |||||
| Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name); | |||||
| return NULL; | |||||
| } | |||||
| (void)BaseMath_WriteCallback(color); | |||||
| Py_INCREF(v1); | |||||
| return v1; | |||||
| } | } | ||||
| /* -obj | /* -obj | ||||
| * returns the negative of this object */ | * returns the negative of this object */ | ||||
| static PyObject *Color_neg(ColorObject *self) | static PyObject *Color_neg(ColorObject *self) | ||||
| { | { | ||||
| float tcol[COLOR_SIZE]; | float tcol[COLOR_SIZE]; | ||||
| ▲ Show 20 Lines • Show All 313 Lines • Show Last 20 Lines | |||||