Compare commits
No commits in common. "5edebdd64316abec6e941d49b210f93d7e88a2d1" and "8871f6be6e699630cc1ffca131e812ed96917bbd" have entirely different histories.
5edebdd643
...
8871f6be6e
|
@ -65,62 +65,77 @@ PyObject* PyColor::repr(PyObject* obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int PyColor::init(PyColorObject* self, PyObject* args, PyObject* kwds) {
|
int PyColor::init(PyColorObject* self, PyObject* args, PyObject* kwds)
|
||||||
//using namespace mcrfpydef;
|
{
|
||||||
|
using namespace mcrfpydef;
|
||||||
static const char* keywords[] = { "r", "g", "b", "a", nullptr };
|
static const char* keywords[] = { "r", "g", "b", "a", nullptr };
|
||||||
PyObject* leader;
|
PyObject* leader;
|
||||||
int r = -1, g = -1, b = -1, a = 255;
|
int r = -1, g = -1, b = -1, a = 255;
|
||||||
|
if (!PyArg_ParseTupleAndKeywords, args, kwds, "O|iii", leader, &g, &b, &a)
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iii", const_cast<char**>(keywords), &leader, &g, &b, &a)) {
|
{
|
||||||
PyErr_SetString(PyExc_TypeError, "mcrfpy.Color requires a 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
PyErr_SetString(PyExc_TypeError, "mcrfpy.Color requires a color object, 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//std::cout << "Arg parsing succeeded. Values: " << r << " " << g << " " << b << " " << a <<std::endl;
|
// if the "r" arg is already a color, yoink that color value
|
||||||
//std::cout << PyUnicode_AsUTF8(PyObject_Repr(leader)) << std::endl;
|
if (PyObject_IsInstance(leader, (PyObject*)&PyColorType))
|
||||||
// Tuple cases
|
{
|
||||||
if (PyTuple_Check(leader)) {
|
self->data = ((PyColorObject*)leader)->data;
|
||||||
Py_ssize_t tupleSize = PyTuple_Size(leader);
|
return 0;
|
||||||
if (tupleSize < 3 || tupleSize > 4) {
|
}
|
||||||
PyErr_SetString(PyExc_TypeError, "Invalid tuple length: mcrfpy.Color requires a 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
// else if the "r" arg is a 3-tuple, initialize to (r, g, b, 255)
|
||||||
|
// (if the "r" arg is a 4-tuple, initialize to (r, g, b, a))
|
||||||
|
else if (PyTuple_Check(leader))
|
||||||
|
{
|
||||||
|
if (PyTuple_Size(leader) < 3 && PyTuple_Size(leader) > 4)
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_TypeError, "Invalid tuple length: mcrfpy.Color requires a color object, 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
r = PyLong_AsLong(PyTuple_GetItem(leader, 0));
|
r = PyLong_AsLong(PyTuple_GetItem(leader, 0));
|
||||||
g = PyLong_AsLong(PyTuple_GetItem(leader, 1));
|
g = PyLong_AsLong(PyTuple_GetItem(leader, 1));
|
||||||
b = PyLong_AsLong(PyTuple_GetItem(leader, 2));
|
b = PyLong_AsLong(PyTuple_GetItem(leader, 2));
|
||||||
if (tupleSize == 4) {
|
//a = 255; //default value
|
||||||
|
|
||||||
|
if (PyTuple_Size(leader) == 4)
|
||||||
|
{
|
||||||
a = PyLong_AsLong(PyTuple_GetItem(leader, 3));
|
a = PyLong_AsLong(PyTuple_GetItem(leader, 3));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Color name (not implemented yet)
|
|
||||||
else if (PyUnicode_Check(leader)) {
|
|
||||||
PyErr_SetString(PyExc_NotImplementedError, "Color names aren't ready yet");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// Check if the leader is actually an integer for the r value
|
|
||||||
else if (PyLong_Check(leader)) {
|
|
||||||
r = PyLong_AsLong(leader);
|
|
||||||
// Additional validation not shown; g, b are required to be parsed
|
|
||||||
} else {
|
|
||||||
PyErr_SetString(PyExc_TypeError, "mcrfpy.Color requires a 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate color values
|
// value validation
|
||||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || a < 0 || a > 255) {
|
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || a < 0 || a > 255)
|
||||||
PyErr_SetString(PyExc_ValueError, "Color values must be between 0 and 255.");
|
{
|
||||||
|
PyErr_SetString(PyExc_ValueError, "Color values must be between 0 and 255.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
self->data = sf::Color(r, g, b, a);
|
||||||
|
}
|
||||||
|
// else if the "r" arg is a string, initialize to {color lookup function value}
|
||||||
|
else if (PyUnicode_Check(leader))
|
||||||
|
{
|
||||||
|
PyErr_SetString(Py_NotImplemented, "Color names aren't ready yet");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// else -
|
||||||
|
else if (!PyLong_Check(leader))
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_TypeError, "mcrfpy.Color requires a color object, 3-tuple, 4-tuple, color name, or integer values within 0-255 (r, g, b, optionally a)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
r = PyLong_AsLong(leader);
|
||||||
|
// assert r, g, b are present and ints in range (0, 255) - if not enough ints were provided to the args/kwds parsed by init, g and/or b will still hold -1.
|
||||||
|
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255 || a < 0 || a > 255)
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_ValueError, "R, G, B values are required, A value is optional; Color values must be between 0 and 255.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->data = sf::Color(r, g, b, a);
|
self->data = sf::Color(r, g, b, a);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* PyColor::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds)
|
PyObject* PyColor::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds)
|
||||||
{
|
{
|
||||||
auto obj = (PyObject*)type->tp_alloc(type, 0);
|
return (PyObject*)type->tp_alloc(type, 0);
|
||||||
//Py_INCREF(obj);
|
|
||||||
return obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* PyColor::get_member(PyObject* obj, void* closure)
|
PyObject* PyColor::get_member(PyObject* obj, void* closure)
|
||||||
|
|
|
@ -56,19 +56,28 @@ int PyVector::init(PyVectorObject* self, PyObject* args, PyObject* kwds)
|
||||||
using namespace mcrfpydef;
|
using namespace mcrfpydef;
|
||||||
static const char* keywords[] = { "x", "y", nullptr };
|
static const char* keywords[] = { "x", "y", nullptr };
|
||||||
PyObject* leader = NULL;
|
PyObject* leader = NULL;
|
||||||
float x=0, y=0;
|
double x=0, y=0;
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Of", const_cast<char**>(keywords), &leader, &y))
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Of", const_cast<char**>(keywords), &leader, &y))
|
||||||
{
|
{
|
||||||
//PyErr_SetString(PyExc_TypeError, "mcrfpy.Vector requires a 2-tuple or two numeric values");
|
//PyErr_SetString(PyExc_TypeError, "mcrfpy.Vector requires a 2-tuple or two numeric values");
|
||||||
return -1;
|
self->data = sf::Vector2f();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if (leader == NULL || leader == Py_None)
|
else if (leader == NULL || leader == Py_None)
|
||||||
{
|
{
|
||||||
self->data = sf::Vector2f();
|
self->data = sf::Vector2f();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PyTuple_Check(leader))
|
// if the "r" arg is already a vector, yoink that color value
|
||||||
|
else if (PyObject_IsInstance(leader, (PyObject*)&PyVectorType))
|
||||||
|
{
|
||||||
|
self->data = ((PyVectorObject*)leader)->data;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// else if the "r" arg is a 3-tuple, initialize to (r, g, b, 255)
|
||||||
|
// (if the "r" arg is a 4-tuple, initialize to (r, g, b, a))
|
||||||
|
else if (PyTuple_Check(leader))
|
||||||
{
|
{
|
||||||
if (PyTuple_Size(leader) != 2)
|
if (PyTuple_Size(leader) != 2)
|
||||||
{
|
{
|
||||||
|
@ -79,7 +88,6 @@ int PyVector::init(PyVectorObject* self, PyObject* args, PyObject* kwds)
|
||||||
y = PyFloat_AsDouble(PyTuple_GetItem(leader, 1));
|
y = PyFloat_AsDouble(PyTuple_GetItem(leader, 1));
|
||||||
|
|
||||||
self->data = sf::Vector2f(x, y);
|
self->data = sf::Vector2f(x, y);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
// else -
|
// else -
|
||||||
else if (!PyFloat_Check(leader) && !(PyLong_Check(leader)))
|
else if (!PyFloat_Check(leader) && !(PyLong_Check(leader)))
|
||||||
|
|
Loading…
Reference in New Issue