diff --git a/src/PyColor.cpp b/src/PyColor.cpp new file mode 100644 index 0000000..17b4a3f --- /dev/null +++ b/src/PyColor.cpp @@ -0,0 +1,42 @@ +#include "PyColor.h" + + +PyColor::PyColor() +{ +} + +PyObject* PyTexture::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 + return obj; +} + +Py_hash_t PyTexture::hash(PyObject* obj) +{ + auto self = (PyTextureObject*)obj; + return reinterpret_cast(self->data.get()); +} + +int PyTexture::init(PyTextureObject* self, PyObject* args, PyObject* kwds) +{ + static const char* keywords[] = { "filename", "sprite_width", "sprite_height", nullptr }; + char* filename; + int sprite_width, sprite_height; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "sii", const_cast(keywords), &filename, &sprite_width, &sprite_height)) + return -1; + self->data = std::make_shared(filename, sprite_width, sprite_height); + return 0; +} + +PyObject* PyTexture::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds) +{ + return (PyObject*)type->tp_alloc(type, 0); +} diff --git a/src/PyColor.h b/src/PyColor.h new file mode 100644 index 0000000..067c323 --- /dev/null +++ b/src/PyColor.h @@ -0,0 +1,40 @@ +#pragma once +#include "Common.h" +#include "Python.h" + +class PyColor; + +typedef struct { + sf::Color* target; // color target to set/get + std::weak_ptr parent; // lifetime management: parent must still exist + int index; // specific to the parent class, which color is it? +} _PyColorData; + +typedef struct { + PyObject_HEAD + _PyColorData data; +} PyTextureObject; + +class PyColor +{ +private: + _PyColorData data; +public: + 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); +}; + +namespace mcrfpydef { + static PyTypeObject PyColorType = { + .tp_name = "mcrfpy.Color", + .tp_basicsize = sizeof(PyColorObject), + .tp_itemsize = 0, + .tp_hash = PyColor::hash, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = PyDoc_STR("SFML Color Object"), + .tp_init = (initproc)PyColor::init, + .tp_new = PyTColor::pynew, + }; +}