diff -r ffa851df0825 -r 2fb8b9db1c86 symbian-qemu-0.9.1-12/python-2.6.1/Modules/fmmodule.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symbian-qemu-0.9.1-12/python-2.6.1/Modules/fmmodule.c Fri Jul 31 15:01:17 2009 +0100 @@ -0,0 +1,269 @@ + +/* Font Manager module */ + +#include "Python.h" + +#include +#include +#include + + +/* Font Handle object implementation */ + +typedef struct { + PyObject_HEAD + fmfonthandle fh_fh; +} fhobject; + +static PyTypeObject Fhtype; + +#define is_fhobject(v) ((v)->ob_type == &Fhtype) + +static PyObject * +newfhobject(fmfonthandle fh) +{ + fhobject *fhp; + if (fh == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "error creating new font handle"); + return NULL; + } + fhp = PyObject_New(fhobject, &Fhtype); + if (fhp == NULL) + return NULL; + fhp->fh_fh = fh; + return (PyObject *)fhp; +} + +/* Font Handle methods */ + +static PyObject * +fh_scalefont(fhobject *self, PyObject *args) +{ + double size; + if (!PyArg_ParseTuple(args, "d", &size)) + return NULL; + return newfhobject(fmscalefont(self->fh_fh, size)); +} + +/* XXX fmmakefont */ + +static PyObject * +fh_setfont(fhobject *self) +{ + fmsetfont(self->fh_fh); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +fh_getfontname(fhobject *self) +{ + char fontname[256]; + int len; + len = fmgetfontname(self->fh_fh, sizeof fontname, fontname); + if (len < 0) { + PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname"); + return NULL; + } + return PyString_FromStringAndSize(fontname, len); +} + +static PyObject * +fh_getcomment(fhobject *self) +{ + char comment[256]; + int len; + len = fmgetcomment(self->fh_fh, sizeof comment, comment); + if (len < 0) { + PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment"); + return NULL; + } + return PyString_FromStringAndSize(comment, len); +} + +static PyObject * +fh_getfontinfo(fhobject *self) +{ + fmfontinfo info; + if (fmgetfontinfo(self->fh_fh, &info) < 0) { + PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo"); + return NULL; + } + return Py_BuildValue("(llllllll)", + info.printermatched, + info.fixed_width, + info.xorig, + info.yorig, + info.xsize, + info.ysize, + info.height, + info.nglyphs); +} + +#if 0 +static PyObject * +fh_getwholemetrics(fhobject *self, PyObject *args) +{ +} +#endif + +static PyObject * +fh_getstrwidth(fhobject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "s", &str)) + return NULL; + return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str)); +} + +static PyMethodDef fh_methods[] = { + {"scalefont", (PyCFunction)fh_scalefont, METH_VARARGS}, + {"setfont", (PyCFunction)fh_setfont, METH_NOARGS}, + {"getfontname", (PyCFunction)fh_getfontname, METH_NOARGS}, + {"getcomment", (PyCFunction)fh_getcomment, METH_NOARGS}, + {"getfontinfo", (PyCFunction)fh_getfontinfo, METH_NOARGS}, +#if 0 + {"getwholemetrics", (PyCFunction)fh_getwholemetrics, METH_VARARGS}, +#endif + {"getstrwidth", (PyCFunction)fh_getstrwidth, METH_VARARGS}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject * +fh_getattr(fhobject *fhp, char *name) +{ + return Py_FindMethod(fh_methods, (PyObject *)fhp, name); +} + +static void +fh_dealloc(fhobject *fhp) +{ + fmfreefont(fhp->fh_fh); + PyObject_Del(fhp); +} + +static PyTypeObject Fhtype = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "fm.font handle", /*tp_name*/ + sizeof(fhobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)fh_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)fh_getattr, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ +}; + + +/* Font Manager functions */ + +static PyObject * +fm_init(PyObject *self) +{ + fminit(); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +fm_findfont(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "s", &str)) + return NULL; + return newfhobject(fmfindfont(str)); +} + +static PyObject * +fm_prstr(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "s", &str)) + return NULL; + fmprstr(str); + Py_INCREF(Py_None); + return Py_None; +} + +/* XXX This uses a global variable as temporary! Not re-entrant! */ + +static PyObject *fontlist; + +static void +clientproc(char *fontname) +{ + int err; + PyObject *v; + if (fontlist == NULL) + return; + v = PyString_FromString(fontname); + if (v == NULL) + err = -1; + else { + err = PyList_Append(fontlist, v); + Py_DECREF(v); + } + if (err != 0) { + Py_DECREF(fontlist); + fontlist = NULL; + } +} + +static PyObject * +fm_enumerate(PyObject *self) +{ + PyObject *res; + fontlist = PyList_New(0); + if (fontlist == NULL) + return NULL; + fmenumerate(clientproc); + res = fontlist; + fontlist = NULL; + return res; +} + +static PyObject * +fm_setpath(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "s", &str)) + return NULL; + fmsetpath(str); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +fm_fontpath(PyObject *self) +{ + return PyString_FromString(fmfontpath()); +} + +static PyMethodDef fm_methods[] = { + {"init", fm_init, METH_NOARGS}, + {"findfont", fm_findfont, METH_VARARGS}, + {"enumerate", fm_enumerate, METH_NOARGS}, + {"prstr", fm_prstr, METH_VARARGS}, + {"setpath", fm_setpath, METH_VARARGS}, + {"fontpath", fm_fontpath, METH_NOARGS}, + {NULL, NULL} /* sentinel */ +}; + + +void +initfm(void) +{ + + if (PyErr_WarnPy3k("the fm module has been removed in " + "Python 3.0", 2) < 0) + return; + + Py_InitModule("fm", fm_methods); + if (m == NULL) + return; + fminit(); +}