diff options
| author | Dana Jansens <danakj@orodu.net> | 2002-12-21 13:49:57 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2002-12-21 13:49:57 +0000 |
| commit | 55b2aaf973063796a668bc758232141c3d6f5cc9 (patch) | |
| tree | 5d61fe0ac903b5130ec85997296befab7909bdf9 /otk_c/font.c | |
| parent | 16e1192e4d18cd0d32b1ab8bf38ac8d69347229d (diff) | |
add font
Diffstat (limited to 'otk_c/font.c')
| -rw-r--r-- | otk_c/font.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/otk_c/font.c b/otk_c/font.c new file mode 100644 index 00000000..7c9b4f5f --- /dev/null +++ b/otk_c/font.c @@ -0,0 +1,154 @@ +// -*- mode: C; indent-tabs-mode: nil; -*- + +#include "../config.h" +#include "font.h" +#include "display.h" +#include "color.h" + +#include "../src/gettext.h" + +static Bool xft_init = False; +static const char *fallback = "fixed"; + +void OtkFont_Initialize() +{ + if (!XftInit(0)) { + printf(_("Couldn't initialize Xft version %d.%d.%d.\n\n"), + XFT_MAJOR, XFT_MINOR, XFT_REVISION); + exit(3); + } + printf(_("Using Xft %d.%d.%d.\n"), XFT_MAJOR, XFT_MINOR, XFT_REVISION); + xft_init = True; +} + +PyObject *OtkFont_New(int screen, const char *fontstring, Bool shadow, + unsigned char offset, unsigned char tint) +{ + OtkFont *self = PyObject_New(OtkFont, &OtkFont_Type); + + assert(xft_init); + assert(screen >= 0); + assert(fontstring); + + self->screen = screen; + self->shadow = shadow; + self->offset = offset; + self->tint = tint; + + if (!(self->xftfont = XftFontOpenName(OBDisplay->display, screen, + fontstring))) { + printf(_("Unable to load font: %s"), fontstring); + printf(_("Trying fallback font: %s\n"), fallback); + if (!(self->xftfont = + XftFontOpenName(OBDisplay->display, screen, fallback))) { + printf(_("Unable to load font: %s"), fallback); + printf(_("Aborting!.\n")); + + exit(3); // can't continue without a font + } + } + + return (PyObject*)self; +} + +int OtkFont_MeasureString(OtkFont *self, const char *string)//, Bool utf8) +{ + XGlyphInfo info; + +/* if (utf8)*/ + XftTextExtentsUtf8(OBDisplay->display, self->xftfont, + (const FcChar8*)string, strlen(string), &info); +/* else + XftTextExtents8(OBDisplay->display, self->xftfont, + (const FcChar8*)string, strlen(string), &info);*/ + + return info.xOff + (self->shadow ? self->offset : 0); +} + +void OtkFont_DrawString(OtkFont *self, XftDraw *d, int x, int y, + OtkColor *color, const char *string)//, Bool utf8) +{ + assert(self); + assert(d); + + if (self->shadow) { + XftColor c; + c.color.red = 0; + c.color.green = 0; + c.color.blue = 0; + c.color.alpha = self->tint | self->tint << 8; // transparent shadow + c.pixel = BlackPixel(OBDisplay->display, self->screen); + +/* if (utf8)*/ + XftDrawStringUtf8(d, &c, self->xftfont, x + self->offset, + self->xftfont->ascent + y + self->offset, + (const FcChar8*)string, strlen(string)); +/* else + XftDrawString8(d, &c, self->xftfont, x + self->offset, + self->xftfont->ascent + y + self->offset, + (const FcChar8*)string, strlen(string));*/ + } + + XftColor c; + c.color.red = color->red | color->red << 8; + c.color.green = color->green | color->green << 8; + c.color.blue = color->blue | color->blue << 8; + c.pixel = color->pixel; + c.color.alpha = 0xff | 0xff << 8; // no transparency in BColor yet + +/* if (utf8)*/ + XftDrawStringUtf8(d, &c, self->xftfont, x, self->xftfont->ascent + y, + (const FcChar8*)string, strlen(string)); +/* else + XftDrawString8(d, &c, self->xftfont, x, self->xftfont->ascent + y, + (const FcChar8*)string, strlen(string));*/ +} + + + + +static PyObject *otkfont_measurestring(OtkFont* self, PyObject* args) +{ + char *s; + + if (!PyArg_ParseTuple(args, "s", &s)) + return NULL; + return PyInt_FromLong(OtkFont_MeasureString(self, s)); +} + +static PyMethodDef get_methods[] = { + {"measureString", (PyCFunction)otkfont_measurestring, METH_VARARGS, + "Measure the length of a string with a font."}, + {NULL, NULL, 0, NULL} +}; + + +static void otkfont_dealloc(OtkFont* self) +{ + // this is always set. cuz if it failed.. the app would exit! + XftFontClose(OBDisplay->display, self->xftfont); + PyObject_Del((PyObject*)self); +} + +static PyObject *otkfont_getattr(PyObject *obj, char *name) +{ + return Py_FindMethod(get_methods, obj, name); +} + +PyTypeObject Otkfont_Type = { + PyObject_HEAD_INIT(NULL) + 0, + "OtkFont", + sizeof(OtkFont), + 0, + (destructor)otkfont_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + otkfont_getattr, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ +}; |
