20#ifndef MATH_STANDALONE
24#ifndef MATH_STANDALONE
51 PyTuple_SET_ITEM(
ret, i, PyFloat_FromDouble(
self->col[i]));
64static PyObject *
Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
66 float col[3] = {0.0f, 0.0f, 0.0f};
68 if (kwds && PyDict_Size(kwds)) {
69 PyErr_SetString(PyExc_TypeError,
71 "takes no keyword args");
75 switch (PyTuple_GET_SIZE(args)) {
86 PyErr_SetString(PyExc_TypeError,
88 "more than a single arg given");
100#ifndef MATH_STANDALONE
104 Color_from_scene_linear_to_srgb_doc,
105 ".. function:: from_scene_linear_to_srgb()\n"
107 " Convert from scene linear to sRGB color space.\n"
109 " :return: A color in sRGB color space.\n"
110 " :rtype: :class:`Color`\n");
120 Color_from_srgb_to_scene_linear_doc,
121 ".. function:: from_srgb_to_scene_linear()\n"
123 " Convert from sRGB to scene linear color space.\n"
125 " :return: A color in scene linear color space.\n"
126 " :rtype: :class:`Color`\n");
136 Color_from_scene_linear_to_xyz_d65_doc,
137 ".. function:: from_scene_linear_to_xyz_d65()\n"
139 " Convert from scene linear to CIE XYZ (Illuminant D65) color space.\n"
141 " :return: A color in XYZ color space.\n"
142 " :rtype: :class:`Color`\n");
152 Color_from_xyz_d65_to_scene_linear_doc,
153 ".. function:: from_xyz_d65_to_scene_linear()\n"
155 " Convert from CIE XYZ (Illuminant D65) to scene linear color space.\n"
157 " :return: A color in scene linear color space.\n"
158 " :rtype: :class:`Color`\n");
168 Color_from_scene_linear_to_aces_doc,
169 ".. function:: from_scene_linear_to_aces()\n"
171 " Convert from scene linear to ACES2065-1 linear color space.\n"
173 " :return: A color in ACES2065-1 linear color space.\n"
174 " :rtype: :class:`Color`\n");
184 Color_from_aces_to_scene_linear_doc,
185 ".. function:: from_aces_to_scene_linear()\n"
187 " Convert from ACES2065-1 linear to scene linear color space.\n"
189 " :return: A color in scene linear color space.\n"
190 " :rtype: :class:`Color`\n");
200 Color_from_scene_linear_to_rec709_linear_doc,
201 ".. function:: from_scene_linear_to_rec709_linear()\n"
203 " Convert from scene linear to Rec.709 linear color space.\n"
205 " :return: A color in Rec.709 linear color space.\n"
206 " :rtype: :class:`Color`\n");
216 Color_from_rec709_linear_to_scene_linear_doc,
217 ".. function:: from_rec709_linear_to_scene_linear()\n"
219 " Convert from Rec.709 linear color space to scene linear color space.\n"
221 " :return: A color in scene linear color space.\n"
222 " :rtype: :class:`Color`\n");
241 ".. function:: copy()\n"
243 " Returns a copy of this color.\n"
245 " :return: A copy of the color.\n"
246 " :rtype: :class:`Color`\n"
248 " .. note:: use this to get a copy of a wrapped color with\n"
249 " no reference to the original data.\n");
274 PyObject *
ret, *tuple;
282 ret = PyUnicode_FromFormat(
"Color(%R)", tuple);
288#ifndef MATH_STANDALONE
300 ds,
"<Color (r=%.4f, g=%.4f, b=%.4f)>",
self->col[0],
self->col[1],
self->col[2]);
333 res = ok ? Py_False : Py_True;
340 res = Py_NotImplemented;
347 return Py_NewRef(res);
389 PyErr_SetString(PyExc_IndexError,
391 "array index out of range");
399 return PyFloat_FromDouble(
self->col[i]);
411 f = PyFloat_AsDouble(value);
412 if (f == -1 && PyErr_Occurred()) {
413 PyErr_SetString(PyExc_TypeError,
415 "assigned value not a number");
424 PyErr_SetString(PyExc_IndexError,
426 "array assignment index out of range");
454 begin = std::min(begin, end);
456 tuple = PyTuple_New(end - begin);
458 PyTuple_SET_ITEM(tuple,
count - begin, PyFloat_FromDouble(
self->col[
count]));
479 begin = std::min(begin, end);
487 if (size != (end - begin)) {
488 PyErr_SetString(PyExc_ValueError,
489 "color[begin:end] = []: "
490 "size mismatch in slice assignment");
505 if (PyIndex_Check(item)) {
507 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
508 if (i == -1 && PyErr_Occurred()) {
516 if (PySlice_Check(item)) {
517 Py_ssize_t start, stop, step, slicelength;
519 if (PySlice_GetIndicesEx(item,
COLOR_SIZE, &start, &stop, &step, &slicelength) < 0) {
523 if (slicelength <= 0) {
524 return PyTuple_New(0);
530 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with color");
535 PyExc_TypeError,
"color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
542 if (PyIndex_Check(item)) {
543 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
544 if (i == -1 && PyErr_Occurred()) {
552 if (PySlice_Check(item)) {
553 Py_ssize_t start, stop, step, slicelength;
555 if (PySlice_GetIndicesEx(item,
COLOR_SIZE, &start, &stop, &step, &slicelength) < 0) {
563 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with color");
568 PyExc_TypeError,
"color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
585 PyErr_Format(PyExc_TypeError,
586 "Color addition: (%s + %s) "
587 "invalid type for this operation",
588 Py_TYPE(v1)->tp_name,
589 Py_TYPE(
v2)->tp_name);
610 PyErr_Format(PyExc_TypeError,
611 "Color addition: (%s += %s) "
612 "invalid type for this operation",
613 Py_TYPE(v1)->tp_name,
614 Py_TYPE(
v2)->tp_name);
638 PyErr_Format(PyExc_TypeError,
639 "Color subtraction: (%s - %s) "
640 "invalid type for this operation",
641 Py_TYPE(v1)->tp_name,
642 Py_TYPE(
v2)->tp_name);
663 PyErr_Format(PyExc_TypeError,
664 "Color subtraction: (%s -= %s) "
665 "invalid type for this operation",
666 Py_TYPE(v1)->tp_name,
667 Py_TYPE(
v2)->tp_name);
711 if (color1 && color2) {
715 if (((scalar = PyFloat_AsDouble(
v2)) == -1.0f && PyErr_Occurred()) == 0) {
720 if (((scalar = PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred()) == 0) {
728 PyErr_Format(PyExc_TypeError,
729 "Color multiplication: not supported between "
730 "'%.200s' and '%.200s' types",
731 Py_TYPE(v1)->tp_name,
732 Py_TYPE(
v2)->tp_name);
749 PyErr_SetString(PyExc_TypeError,
"Color division not supported in this order");
754 if (((scalar = PyFloat_AsDouble(
v2)) == -1.0f && PyErr_Occurred()) == 0) {
755 if (scalar == 0.0f) {
756 PyErr_SetString(PyExc_ZeroDivisionError,
"Color division: divide by zero error");
762 PyErr_Format(PyExc_TypeError,
763 "Color multiplication: not supported between "
764 "'%.200s' and '%.200s' types",
765 Py_TYPE(v1)->tp_name,
766 Py_TYPE(
v2)->tp_name);
781 if (((scalar = PyFloat_AsDouble(
v2)) == -1.0f && PyErr_Occurred()) == 0) {
785 PyErr_Format(PyExc_TypeError,
786 "Color multiplication: (%s *= %s) "
787 "invalid type for this operation",
788 Py_TYPE(v1)->tp_name,
789 Py_TYPE(
v2)->tp_name);
809 if (((scalar = PyFloat_AsDouble(
v2)) == -1.0f && PyErr_Occurred()) == 0) {
810 if (scalar == 0.0f) {
811 PyErr_SetString(PyExc_ZeroDivisionError,
"Color division: divide by zero error");
818 PyErr_Format(PyExc_TypeError,
819 "Color division: (%s /= %s) "
820 "invalid type for this operation",
821 Py_TYPE(v1)->tp_name,
822 Py_TYPE(
v2)->tp_name);
919 "Red color channel.\n"
925 "Green color channel.\n"
931 "Blue color channel.\n"
949 Color_channel_hsv_h_doc,
950 "HSV Hue component in [0, 1].\n"
955 Color_channel_hsv_s_doc,
956 "HSV Saturation component in [0, 1].\n"
961 Color_channel_hsv_v_doc,
962 "HSV Value component in [0, 1].\n"
977 return PyFloat_FromDouble(hsv[i]);
984 float f = PyFloat_AsDouble(value);
986 if (f == -1 && PyErr_Occurred()) {
987 PyErr_SetString(PyExc_TypeError,
988 "color.h/s/v = value: "
989 "assigned value not a number");
998 CLAMP(f, 0.0f, 1.0f);
1012 "HSV Values in [0, 1].\n"
1014 ":type: float triplet");
1027 ret = PyTuple_New(3);
1029 ret, PyFloat_FromDouble(hsv[0]), PyFloat_FromDouble(hsv[1]), PyFloat_FromDouble(hsv[2]));
1066 Color_channel_r_doc,
1071 Color_channel_g_doc,
1076 Color_channel_b_doc,
1082 Color_channel_hsv_h_doc,
1087 Color_channel_hsv_s_doc,
1092 Color_channel_hsv_v_doc,
1117 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr}
1126#if (defined(__GNUC__) && !defined(__clang__))
1127# pragma GCC diagnostic push
1128# pragma GCC diagnostic ignored "-Wcast-function-type"
1132 {
"copy", (PyCFunction)
Color_copy, METH_NOARGS, Color_copy_doc},
1133 {
"__copy__", (PyCFunction)
Color_copy, METH_NOARGS, Color_copy_doc},
1134 {
"__deepcopy__", (PyCFunction)
Color_deepcopy, METH_VARARGS, Color_copy_doc},
1140#ifndef MATH_STANDALONE
1141 {
"from_scene_linear_to_srgb",
1144 Color_from_scene_linear_to_srgb_doc},
1145 {
"from_srgb_to_scene_linear",
1148 Color_from_srgb_to_scene_linear_doc},
1149 {
"from_scene_linear_to_xyz_d65",
1152 Color_from_scene_linear_to_xyz_d65_doc},
1153 {
"from_xyz_d65_to_scene_linear",
1156 Color_from_xyz_d65_to_scene_linear_doc},
1157 {
"from_scene_linear_to_aces",
1160 Color_from_scene_linear_to_aces_doc},
1161 {
"from_aces_to_scene_linear",
1164 Color_from_aces_to_scene_linear_doc},
1165 {
"from_scene_linear_to_rec709_linear",
1168 Color_from_scene_linear_to_rec709_linear_doc},
1169 {
"from_rec709_linear_to_scene_linear",
1172 Color_from_rec709_linear_to_scene_linear_doc},
1175 {
nullptr,
nullptr, 0,
nullptr},
1178#if (defined(__GNUC__) && !defined(__clang__))
1179# pragma GCC diagnostic pop
1188#ifdef MATH_STANDALONE
1189# define Color_str nullptr
1195 ".. class:: Color(rgb)\n"
1197 " This object gives access to Colors in Blender.\n"
1199 " Most colors returned by Blender APIs are in scene linear color space, as defined by "
1200 " the OpenColorIO configuration. The notable exception is user interface theming colors, "
1201 " which are in sRGB color space.\n"
1203 " :arg rgb: (red, green, blue) color values where (0, 0, 0) is black & (1, 1, 1) is white.\n"
1204 " :type rgb: Sequence[float]\n");
1206 PyVarObject_HEAD_INIT(
nullptr, 0)
1225 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1257#ifdef MATH_STANDALONE
1272 col_alloc =
static_cast<float *
>(PyMem_Malloc(
COLOR_SIZE *
sizeof(
float)));
1273 if (
UNLIKELY(col_alloc ==
nullptr)) {
1274 PyErr_SetString(PyExc_MemoryError,
1276 "problem allocating data");
1282 self->col = col_alloc;
1285 self->cb_user =
nullptr;
1286 self->cb_type =
self->cb_subtype = 0;
1299 PyMem_Free(col_alloc);
1302 return (PyObject *)
self;
1312 self->cb_user =
nullptr;
1313 self->cb_type =
self->cb_subtype = 0;
1320 return (PyObject *)
self;
1328 self->cb_user = cb_user;
1329 self->cb_type = cb_type;
1330 self->cb_subtype = cb_subtype;
1332 PyObject_GC_Track(
self);
1335 return (PyObject *)
self;
#define BLI_assert_msg(a, msg)
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...) ATTR_PRINTF_FORMAT(2
double double_round(double x, int ndigits)
void hsv_to_rgb_v(const float hsv[3], float r_rgb[3])
void rgb_to_hsv_v(const float rgb[3], float r_hsv[3])
void rgb_to_hsv(float r, float g, float b, float *r_h, float *r_s, float *r_v)
void add_vn_vn(float *array_tar, const float *array_src, int size)
void mul_vn_fl(float *array_tar, int size, float f)
MINLINE void clamp_v3(float vec[3], float min, float max)
void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, int size)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, int size)
void negate_vn_vn(float *array_tar, const float *array_src, int size)
MINLINE void zero_v3(float r[3])
void mul_vn_vn_fl(float *array_tar, const float *array_src, int size, float f)
void sub_vn_vn(float *array_tar, const float *array_src, int size)
#define POINTER_FROM_INT(i)
#define POINTER_AS_INT(i)
BLI_INLINE void IMB_colormanagement_srgb_to_scene_linear_v3(float scene_linear[3], const float srgb[3])
BLI_INLINE void IMB_colormanagement_scene_linear_to_rec709(float rec709[3], const float scene_linear[3])
BLI_INLINE void IMB_colormanagement_aces_to_scene_linear(float scene_linear[3], const float aces[3])
BLI_INLINE void IMB_colormanagement_xyz_to_scene_linear(float scene_linear[3], const float xyz[3])
BLI_INLINE void IMB_colormanagement_rec709_to_scene_linear(float scene_linear[3], const float rec709[3])
BLI_INLINE void IMB_colormanagement_scene_linear_to_xyz(float xyz[3], const float scene_linear[3])
BLI_INLINE void IMB_colormanagement_scene_linear_to_aces(float aces[3], const float scene_linear[3])
BLI_INLINE void IMB_colormanagement_scene_linear_to_srgb_v3(float srgb[3], const float scene_linear[3])
ATTR_WARN_UNUSED_RESULT const BMVert * v2
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
local_group_size(16, 16) .push_constant(Type b
int BaseMathObject_is_gc(BaseMathObject *self)
Py_hash_t mathutils_array_hash(const float *array, size_t array_len)
void BaseMathObject_dealloc(BaseMathObject *self)
int EXPP_VectorsAreEqual(const float *vecA, const float *vecB, int size, int floatSteps)
int mathutils_array_parse(float *array, int array_num_min, int array_num_max, PyObject *value, const char *error_prefix)
char BaseMathObject_is_valid_doc[]
char BaseMathObject_is_wrapped_doc[]
PyObject * BaseMathObject_owner_get(BaseMathObject *self, void *)
char BaseMathObject_is_frozen_doc[]
PyObject * mathutils_dynstr_to_py(DynStr *ds)
PyObject * BaseMathObject_is_frozen_get(BaseMathObject *self, void *)
PyObject * BaseMathObject_freeze(BaseMathObject *self)
PyObject * BaseMathObject_is_wrapped_get(BaseMathObject *self, void *)
char BaseMathObject_owner_doc[]
char BaseMathObject_freeze_doc[]
PyObject * BaseMathObject_is_valid_get(BaseMathObject *self, void *)
int BaseMathObject_clear(BaseMathObject *self)
int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg)
#define BaseMath_ReadCallback_ForWrite(_self)
#define BaseMath_ReadIndexCallback(_self, _index)
#define BaseMath_WriteCallback(_self)
#define BASE_MATH_NEW(struct_name, root_type, base_type)
#define BaseMathObject_Prepare_ForHash(_self)
#define BASE_MATH_FLAG_DEFAULT
#define BaseMath_Prepare_ForWrite(_self)
#define BaseMath_ReadCallback(_self)
#define BaseMath_WriteIndexCallback(_self, _index)
static PyObject * Color_from_scene_linear_to_rec709_linear(ColorObject *self)
static PyObject * Color_str(ColorObject *self)
PyObject * Color_CreatePyObject(const float col[3], PyTypeObject *base_type)
static PyObject * Color_from_xyz_d65_to_scene_linear(ColorObject *self)
static Py_hash_t Color_hash(ColorObject *self)
static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *value)
static PyObject * color_mul_float(ColorObject *color, const float scalar)
static PyObject * Color_imul(PyObject *v1, PyObject *v2)
static PyObject * Color_richcmpr(PyObject *a, PyObject *b, int op)
static PyObject * Color_channel_get(ColorObject *self, void *type)
static int Color_ass_item(ColorObject *self, Py_ssize_t i, PyObject *value)
static PySequenceMethods Color_SeqMethods
static PyObject * Color_to_tuple_ex(ColorObject *self, int ndigits)
PyDoc_STRVAR(Color_from_scene_linear_to_srgb_doc, ".. function:: from_scene_linear_to_srgb()\n" "\n" " Convert from scene linear to sRGB color space.\n" "\n" " :return: A color in sRGB color space.\n" " :rtype: :class:`Color`\n")
static PyObject * Color_channel_hsv_get(ColorObject *self, void *type)
static PyGetSetDef Color_getseters[]
static int Color_hsv_set(ColorObject *self, PyObject *value, void *)
static PyObject * Color_from_scene_linear_to_xyz_d65(ColorObject *self)
static Py_ssize_t Color_len(ColorObject *)
static PyObject * Color_deepcopy(ColorObject *self, PyObject *args)
static PyObject * Color_iadd(PyObject *v1, PyObject *v2)
static PyObject * Color_copy(ColorObject *self)
static PyObject * Color_idiv(PyObject *v1, PyObject *v2)
static PyObject * Color_neg(ColorObject *self)
static PyObject * Color_div(PyObject *v1, PyObject *v2)
static PyNumberMethods Color_NumMethods
static PyObject * Color_subscript(ColorObject *self, PyObject *item)
static int Color_ass_slice(ColorObject *self, int begin, int end, PyObject *seq)
static PyObject * Color_add(PyObject *v1, PyObject *v2)
static PyObject * Color_from_srgb_to_scene_linear(ColorObject *self)
static PyObject * Color_sub(PyObject *v1, PyObject *v2)
PyObject * Color_CreatePyObject_cb(PyObject *cb_user, uchar cb_type, uchar cb_subtype)
static PyObject * Color_repr(ColorObject *self)
static PyObject * Color_hsv_get(ColorObject *self, void *)
static PyMappingMethods Color_AsMapping
static PyObject * Color_isub(PyObject *v1, PyObject *v2)
static PyObject * Color_mul(PyObject *v1, PyObject *v2)
static PyObject * Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyObject * Color_from_aces_to_scene_linear(ColorObject *self)
static PyMethodDef Color_methods[]
static int Color_channel_set(ColorObject *self, PyObject *value, void *type)
static int Color_channel_hsv_set(ColorObject *self, PyObject *value, void *type)
static PyObject * Color_from_scene_linear_to_aces(ColorObject *self)
static PyObject * Color_item(ColorObject *self, Py_ssize_t i)
PyObject * Color_CreatePyObject_wrap(float col[3], PyTypeObject *base_type)
static PyObject * Color_slice(ColorObject *self, int begin, int end)
static PyObject * Color_from_rec709_linear_to_scene_linear(ColorObject *self)
static PyObject * Color_from_scene_linear_to_srgb(ColorObject *self)
#define ColorObject_Check(v)
int PyC_CheckArgs_DeepCopy(PyObject *args)
#define PyTuple_SET_ITEMS(op_arg,...)