Squashed commit of the following: [standardize_color_handling]
closes #11 Check the abandoned feature branch for PyLinkedColor, a time-expensive but now abandoned feature to link a color value to a UIDrawable. There are some TODOs left in the PyColor class, but that can go under cleanup. I'm way over time on this, so I'm taking a small victory :) commit572aa52605Author: John McCardle <mccardle.john@gmail.com> Date: Sat Mar 30 21:18:26 2024 -0400 More color table updates commit01706bd59dAuthor: John McCardle <mccardle.john@gmail.com> Date: Sat Mar 30 21:13:31 2024 -0400 Color wrapup... Cutting PyLinkedColor to simplify my cursedly mortal, finite existence commit3991ac13d6Author: John McCardle <mccardle.john@gmail.com> Date: Thu Mar 28 23:50:50 2024 -0400 Still having segfaults with LinkedColor and captions (specifically outline color, but that might not be the actual cause). PyColor shaping back up in simplified form. commit06e24a1b27Author: John McCardle <mccardle.john@gmail.com> Date: Thu Mar 28 20:53:49 2024 -0400 LinkedColor now reflecting changes to the linked color value. Needs set method + RGBA / color properties commit41509dfe96Author: John McCardle <mccardle.john@gmail.com> Date: Wed Mar 27 21:10:03 2024 -0400 Addressing issues with PyColor by splitting behavior off into PyLinkedColor commit13a4ddf41bAuthor: John McCardle <mccardle.john@gmail.com> Date: Tue Mar 26 23:02:00 2024 -0400 Build runs again. PyColor objects are being instantiated, with bugs and no test of color changing commit1601fc7fabAuthor: John McCardle <mccardle.john@gmail.com> Date: Mon Mar 25 20:48:08 2024 -0400 Still doesn't compile, but now the issue is in UI.h overcoupling. Progress! commit13672c8fdbAuthor: John McCardle <mccardle.john@gmail.com> Date: Sun Mar 24 21:19:37 2024 -0400 Dabbling around this morning; still not building commit79090b553fAuthor: John McCardle <mccardle.john@gmail.com> Date: Sun Mar 24 08:36:06 2024 -0400 Unsaved changes from last night commit2cac6f03c6Author: John McCardle <mccardle.john@gmail.com> Date: Sat Mar 23 23:07:10 2024 -0400 untested PyColor base implementation commit3728e5fcc8Author: John McCardle <mccardle.john@gmail.com> Date: Sat Mar 23 23:06:36 2024 -0400 Color naming prototype
This commit is contained in:
parent
4ffe438d1b
commit
f82508b753
10 changed files with 1974 additions and 300 deletions
151
src/PyColor.cpp
Normal file
151
src/PyColor.cpp
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
#include "PyColor.h"
|
||||
|
||||
PyGetSetDef PyColor::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}
|
||||
};
|
||||
|
||||
PyColor::PyColor(sf::Color target)
|
||||
:data(target) {}
|
||||
|
||||
PyObject* PyColor::pyObject()
|
||||
{
|
||||
PyObject* obj = PyType_GenericAlloc(&mcrfpydef::PyColorType, 0);
|
||||
Py_INCREF(obj);
|
||||
PyColorObject* self = (PyColorObject*)obj;
|
||||
self->data = data;
|
||||
return obj;
|
||||
}
|
||||
|
||||
sf::Color PyColor::fromPy(PyObject* obj)
|
||||
{
|
||||
PyColorObject* self = (PyColorObject*)obj;
|
||||
return self->data;
|
||||
}
|
||||
|
||||
sf::Color PyColor::fromPy(PyColorObject* self)
|
||||
{
|
||||
return self->data;
|
||||
}
|
||||
|
||||
void PyColor::set(sf::Color color)
|
||||
{
|
||||
data = color;
|
||||
}
|
||||
|
||||
sf::Color PyColor::get()
|
||||
{
|
||||
return data;
|
||||
}
|
||||
|
||||
Py_hash_t PyColor::hash(PyObject* obj)
|
||||
{
|
||||
auto self = (PyColorObject*)obj;
|
||||
Py_hash_t value = 0;
|
||||
value += self->data.r;
|
||||
value << 8; value += self->data.g;
|
||||
value << 8; value += self->data.b;
|
||||
value << 8; value += self->data.a;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
PyObject* PyColor::repr(PyObject* obj)
|
||||
{
|
||||
PyColorObject* self = (PyColorObject*)obj;
|
||||
std::ostringstream ss;
|
||||
sf::Color c = self->data;
|
||||
ss << "<Color (" << int(c.r) << ", " << int(c.g) << ", " << int(c.b) << ", " << int(c.a) << ")>";
|
||||
|
||||
std::string repr_str = ss.str();
|
||||
return PyUnicode_DecodeUTF8(repr_str.c_str(), repr_str.size(), "replace");
|
||||
}
|
||||
|
||||
|
||||
int PyColor::init(PyColorObject* self, PyObject* args, PyObject* kwds)
|
||||
{
|
||||
using namespace mcrfpydef;
|
||||
static const char* keywords[] = { "r", "g", "b", "a", nullptr };
|
||||
PyObject* leader;
|
||||
int r = -1, g = -1, b = -1, a = 255;
|
||||
if (!PyArg_ParseTupleAndKeywords, args, kwds, "O|iii", leader, &g, &b, &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;
|
||||
}
|
||||
|
||||
// if the "r" arg is already a color, yoink that color value
|
||||
if (PyObject_IsInstance(leader, (PyObject*)&PyColorType))
|
||||
{
|
||||
self->data = ((PyColorObject*)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) < 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;
|
||||
}
|
||||
r = PyLong_AsLong(PyTuple_GetItem(leader, 0));
|
||||
g = PyLong_AsLong(PyTuple_GetItem(leader, 1));
|
||||
b = PyLong_AsLong(PyTuple_GetItem(leader, 2));
|
||||
//a = 255; //default value
|
||||
|
||||
if (PyTuple_Size(leader) == 4)
|
||||
{
|
||||
a = PyLong_AsLong(PyTuple_GetItem(leader, 3));
|
||||
}
|
||||
|
||||
// value validation
|
||||
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.");
|
||||
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;
|
||||
}
|
||||
self->data = sf::Color(r, g, b, a);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyObject* PyColor::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds)
|
||||
{
|
||||
return (PyObject*)type->tp_alloc(type, 0);
|
||||
}
|
||||
|
||||
PyObject* PyColor::get_member(PyObject* obj, void* closure)
|
||||
{
|
||||
// TODO
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
int PyColor::set_member(PyObject* obj, PyObject* value, void* closure)
|
||||
{
|
||||
// TODO
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue