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])
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
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,...)