From 79090b553f08af7dd03892c2153073d8457a566d Mon Sep 17 00:00:00 2001 From: John McCardle Date: Sun, 24 Mar 2024 08:36:06 -0400 Subject: [PATCH] Unsaved changes from last night --- src/PyColor.cpp | 27 ++++++++++++++------------- src/PyColor.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/PyColor.cpp b/src/PyColor.cpp index 17b4a3f..1180c94 100644 --- a/src/PyColor.cpp +++ b/src/PyColor.cpp @@ -5,29 +5,30 @@ PyColor::PyColor() { } -PyObject* PyTexture::pyObject() +PyObject* PyColor::pyObject() { PyObject* obj = PyType_GenericAlloc(&mcrfpydef::PyColorType, 0); - try { - ((PyTextureObject*)obj)->data = shared_from_this(); - } - catch (std::bad_weak_ptr& e) - { - std::cout << "Bad weak ptr: shared_from_this() failed in PyTexture::pyObject(); did you create a PyTexture outside of std::make_shared? enjoy your segfault, soon!" << std::endl; - } - // TODO - shared_from_this will raise an exception if the object does not have a shared pointer. Constructor should be made private; write a factory function + ((PyColorObject*)obj.data = data; return obj; } -Py_hash_t PyTexture::hash(PyObject* obj) +Py_hash_t PyColor::hash(PyObject* obj) { auto self = (PyTextureObject*)obj; - return reinterpret_cast(self->data.get()); + Py_hash_t value = 0; + value += obj.data.r; + value << 8; value += obj.data.g; + value << 8; value += obj.data.b; + value << 8; value += obj.data.a; + value << (sizeof(*UIDrawable) * 8); + if (auto ptr = self.data.parent.lock()) + value += reinterpret_cast(ptr); + return value; } -int PyTexture::init(PyTextureObject* self, PyObject* args, PyObject* kwds) +int PyColor::init(PyColorObject* self, PyObject* args, PyObject* kwds) { - static const char* keywords[] = { "filename", "sprite_width", "sprite_height", nullptr }; + static const char* keywords[] = { "r", "g", "b", "a", nullptr }; char* filename; int sprite_width, sprite_height; if (!PyArg_ParseTupleAndKeywords(args, kwds, "sii", const_cast(keywords), &filename, &sprite_width, &sprite_height)) diff --git a/src/PyColor.h b/src/PyColor.h index 067c323..09e46d4 100644 --- a/src/PyColor.h +++ b/src/PyColor.h @@ -20,12 +20,54 @@ class PyColor private: _PyColorData data; public: + void set(sf::Color); + sf::Color get(); PyObject* pyObject(); static Py_hash_t hash(PyObject*); static int init(PyColorObject*, PyObject*, PyObject*); static PyObject* pynew(PyTypeObject* type, PyObject* args=NULL, PyObject* kwds=NULL); + + static PyGetSetDef getsetters[] = { + {"r", (getter)PyColor_get_member, (setter)PyColor_set_member, "Red component", (void*)0}, + {"g", (getter)PyColor_get_member, (setter)PyColor_set_member, "Green component", (void*)1}, + {"b", (getter)PyColor_get_member, (setter)PyColor_set_member, "Blue component", (void*)2}, + {"a", (getter)PyColor_get_member, (setter)PyColor_set_member, "Alpha component", (void*)3}, + {NULL} + }; }; + + +// static PyTypeObject PyColorType = { +// //PyVarObject_HEAD_INIT(NULL, 0) +// .tp_name = "mcrfpy.Color", +// .tp_basicsize = sizeof(PyColorObject), +// .tp_itemsize = 0, +// .tp_dealloc = (destructor)[](PyObject* self) +// { +// PyColorObject* obj = (PyColorObject*)self; +// obj->data.reset(); +// Py_TYPE(self)->tp_free(self); +// }, +// //.tp_repr = (reprfunc)PyUIFrame_repr, +// //.tp_hash = NULL, +// //.tp_iter +// //.tp_iternext +// .tp_flags = Py_TPFLAGS_DEFAULT, +// .tp_doc = PyDoc_STR("SFML Color object (RGBA)"), +// //.tp_methods = PyUIFrame_methods, +// //.tp_members = PyColor_members, +// .tp_getset = PyColor_getsetters, +// //.tp_base = NULL, +// //.tp_init = (initproc)PyUIFrame_init, +// .tp_new = [](PyTypeObject* type, PyObject* args, PyObject* kwds) -> PyObject* +// { +// PyColorObject* self = (PyColorObject*)type->tp_alloc(type, 0); +// if (self) self->data = std::make_shared(); +// return (PyObject*)self; +// } +// }; + namespace mcrfpydef { static PyTypeObject PyColorType = { .tp_name = "mcrfpy.Color", @@ -34,6 +76,7 @@ namespace mcrfpydef { .tp_hash = PyColor::hash, .tp_flags = Py_TPFLAGS_DEFAULT, .tp_doc = PyDoc_STR("SFML Color Object"), + .tp_getset = PyColor::getsetters, .tp_init = (initproc)PyColor::init, .tp_new = PyTColor::pynew, };