summaryrefslogtreecommitdiff
path: root/otk_c/color.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-17 06:40:00 +0000
committerDana Jansens <danakj@orodu.net>2003-01-17 06:40:00 +0000
commit6188650ce975e287c7c8644927cd5d01e7cc7baa (patch)
tree6396de81dbb9ef56f39c24a062b93e4c896a5773 /otk_c/color.c
parent58ff3f35c2b712ec92b093ffd8b96331615f546a (diff)
rm my lucid experiment
Diffstat (limited to 'otk_c/color.c')
-rw-r--r--otk_c/color.c212
1 files changed, 0 insertions, 212 deletions
diff --git a/otk_c/color.c b/otk_c/color.c
deleted file mode 100644
index 81f5b76a..00000000
--- a/otk_c/color.c
+++ /dev/null
@@ -1,212 +0,0 @@
-// -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-
-#include "../config.h"
-#include "color.h"
-#include "display.h"
-#include "screeninfo.h"
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-static Bool cleancache = False;
-static PyObject *colorcache = NULL;
-
-static void parseColorName(OtkColor *self, const char *name) {
- XColor xcol;
-
- // get rgb values from colorname
- xcol.red = 0;
- xcol.green = 0;
- xcol.blue = 0;
- xcol.pixel = 0;
-
- if (!XParseColor(OBDisplay->display,
- OtkDisplay_ScreenInfo(OBDisplay, self->screen)->colormap,
- name, &xcol)) {
- fprintf(stderr, "OtkColor: color parse error: \"%s\"\n", name);
- self->red = self->green = self->blue = 0;
- } else {
- self->red = xcol.red >> 8;
- self->green = xcol.green >> 8;
- self->blue = xcol.blue >> 8;
- }
-}
-
-static void doCacheCleanup() {
- unsigned long *pixels;
- int i, ppos;
- unsigned int count;
- PyObject *key; // this is a color too, but i dont need to use it as such
- OtkColor *color;
-
- // ### TODO - support multiple displays!
- if (!PyDict_Size(colorcache)) return; // nothing to do
-
- pixels = malloc(sizeof(unsigned long) * PyDict_Size(colorcache));
-
- for (i = 0; i < ScreenCount(OBDisplay->display); i++) {
- count = 0;
- ppos = 0;
-
- while (PyDict_Next(colorcache, &ppos, &key, (PyObject**)&color)) {
- // get the screen from the hash
- if (color->screen != i) continue; // wrong screen
-
- // does someone other than the cache have a reference? (the cache gets 2)
- if (color->ob_refcnt > 2)
- continue;
-
- pixels[count++] = color->pixel;
- PyDict_DelItem(colorcache, key);
- --ppos; // back up one in the iteration
- }
-
- if (count > 0)
- XFreeColors(OBDisplay->display,
- OtkDisplay_ScreenInfo(OBDisplay, i)->colormap,
- pixels, count, 0);
- }
-
- free(pixels);
- cleancache = False;
-}
-
-static void allocate(OtkColor *self) {
- XColor xcol;
-
- // allocate color from rgb values
- xcol.red = self->red | self->red << 8;
- xcol.green = self->green | self->green << 8;
- xcol.blue = self->blue | self->blue << 8;
- xcol.pixel = 0;
-
- if (!XAllocColor(OBDisplay->display,
- OtkDisplay_ScreenInfo(OBDisplay, self->screen)->colormap,
- &xcol)) {
- fprintf(stderr, "OtkColor: color alloc error: rgb:%x/%x/%x\n",
- self->red, self->green, self->blue);
- xcol.pixel = 0;
- }
-
- self->pixel = xcol.pixel;
-
- if (cleancache)
- doCacheCleanup();
-}
-
-PyObject *OtkColor_FromRGB(int r, int g, int b, int screen)
-{
- OtkColor *self = PyObject_New(OtkColor, &OtkColor_Type);
- PyObject *cached;
-
- assert(screen >= 0); assert(r >= 0); assert(g >= 0); assert(b >= 0);
- assert(r <= 0xff); assert(g <= 0xff); assert(b <= 0xff);
-
- if (!colorcache) colorcache = PyDict_New();
-
- self->red = r;
- self->green = g;
- self->blue = b;
- self->screen = screen;
-
- // does this color already exist in the cache?
- cached = PyDict_GetItem(colorcache, (PyObject*)self);
- if (cached) {
- Py_INCREF(cached);
- return cached;
- }
-
- // add it to the cache
- PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self);
- allocate(self);
- return (PyObject*)self;
-}
-
-PyObject *OtkColor_FromName(const char *name, int screen)
-{
- OtkColor *self = PyObject_New(OtkColor, &OtkColor_Type);
- PyObject *cached;
-
- assert(screen >= 0); assert(name);
-
- if (!colorcache) colorcache = PyDict_New();
-
- self->red = -1;
- self->green = -1;
- self->blue = -1;
- self->screen = screen;
-
- parseColorName(self, name);
-
- // does this color already exist in the cache?
- cached = PyDict_GetItem(colorcache, (PyObject*)self);
- if (cached) {
- Py_INCREF(cached);
- return cached;
- }
-
- // add it to the cache
- PyDict_SetItem(colorcache, (PyObject*)self, (PyObject*)self);
- allocate(self);
- return (PyObject*)self;
-}
-
-void OtkColor_CleanupColorCache()
-{
- cleancache = True;
-}
-
-
-
-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;
-}
-
-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 */
-};