X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk_c%2Fcolor.c;h=732f7b7d8d5baf5ef7915649b3e62f28d2f1822c;hb=55b2aaf973063796a668bc758232141c3d6f5cc9;hp=d4dad53df5d9ecb071f767ab0f3cc16a286ea062;hpb=2efea6f21cf1bdd69e339f2285b45a31dd68304a;p=chaz%2Fopenbox diff --git a/otk_c/color.c b/otk_c/color.c index d4dad53d..732f7b7d 100644 --- a/otk_c/color.c +++ b/otk_c/color.c @@ -12,59 +12,6 @@ static Bool cleancache = False; static PyObject *colorcache = NULL; -static void otkcolor_dealloc(OtkColor* self) -{ - // when this is called, the color has already been cleaned out of the cache - PyObject_Del((PyObject*)self); -} - -static int otkcolor_compare(OtkColor *c1, OtkColor *c2) -{ - long result; - unsigned long p1, p2; - - p1 = c1->red << 16 | c1->green << 8 | c1->blue; - p2 = c2->red << 16 | c2->green << 8 | c2->blue; - - if (p1 < p2) - result = -1; - else if (p1 > p2) - result = 1; - else - result = 0; - return result; -} - -static PyObject *otkcolor_repr(OtkColor *self) -{ - return PyString_FromFormat("rgb:%x/%x/%x", self->red, self->green, - self->blue); -} - -static long otkcolor_hash(OtkColor *self) -{ - return self->screen << 24 | self->red << 16 | self->green << 8 | self->blue; -} - -static PyTypeObject OtkColor_Type = { - PyObject_HEAD_INIT(NULL) - 0, - "Color", - sizeof(OtkColor), - 0, - (destructor)otkcolor_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - (cmpfunc)otkcolor_compare, /*tp_compare*/ - (reprfunc)otkcolor_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)otkcolor_hash, /*tp_hash */ -}; - - static void parseColorName(OtkColor *self, const char *name) { XColor xcol; @@ -128,8 +75,6 @@ static void doCacheCleanup() { static void allocate(OtkColor *self) { XColor xcol; - assert(!self->allocated); - // allocate color from rgb values xcol.red = self->red | self->red << 8; xcol.green = self->green | self->green << 8; @@ -145,7 +90,6 @@ static void allocate(OtkColor *self) { } self->pixel = xcol.pixel; - self->allocated = True; if (cleancache) doCacheCleanup(); @@ -161,11 +105,9 @@ PyObject *OtkColor_FromRGB(int r, int g, int b, int screen) if (!colorcache) colorcache = PyDict_New(); - self->allocated = False; self->red = r; self->green = g; self->blue = b; - self->pixel = 0; self->screen = screen; // does this color already exist in the cache? @@ -177,6 +119,7 @@ PyObject *OtkColor_FromRGB(int r, int g, int b, int screen) // add it to the cache PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self); + allocate(self); return (PyObject*)self; } @@ -189,11 +132,9 @@ PyObject *OtkColor_FromName(const char *name, int screen) if (!colorcache) colorcache = PyDict_New(); - self->allocated = False; self->red = -1; self->green = -1; self->blue = -1; - self->pixel = 0; self->screen = screen; parseColorName(self, name); @@ -207,17 +148,65 @@ PyObject *OtkColor_FromName(const char *name, int screen) // add it to the cache PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self); + allocate(self); return (PyObject*)self; } -unsigned long OtkColor_Pixel(OtkColor *self) +void OtkColor_CleanupColorCache() { - if (!self->allocated) - allocate(self); - return self->pixel; + cleancache = True; } -void OtkColor_CleanupColorCache() + + +static void otkcolor_dealloc(OtkColor* self) { - cleancache = True; + // when this is called, the color has already been cleaned out of the cache + PyObject_Del((PyObject*)self); +} + +static int otkcolor_compare(OtkColor *c1, OtkColor *c2) +{ + long result; + unsigned long p1, p2; + + p1 = c1->red << 16 | c1->green << 8 | c1->blue; + p2 = c2->red << 16 | c2->green << 8 | c2->blue; + + if (p1 < p2) + result = -1; + else if (p1 > p2) + result = 1; + else + result = 0; + return result; +} + +static PyObject *otkcolor_repr(OtkColor *self) +{ + return PyString_FromFormat("rgb:%x/%x/%x", self->red, self->green, + self->blue); } + +static long otkcolor_hash(OtkColor *self) +{ + return self->screen << 24 | self->red << 16 | self->green << 8 | self->blue; +} + +PyTypeObject OtkColor_Type = { + PyObject_HEAD_INIT(NULL) + 0, + "OtkColor", + sizeof(OtkColor), + 0, + (destructor)otkcolor_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + (cmpfunc)otkcolor_compare, /*tp_compare*/ + (reprfunc)otkcolor_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc)otkcolor_hash, /*tp_hash */ +};