fmmodule.c 4.92 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3

/* Font Manager module */

4
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
5 6 7 8 9 10 11 12 13

#include <gl.h>
#include <device.h>
#include <fmclient.h>


/* Font Handle object implementation */

typedef struct {
14
	PyObject_HEAD
Guido van Rossum's avatar
Guido van Rossum committed
15 16 17
	fmfonthandle fh_fh;
} fhobject;

18
staticforward PyTypeObject Fhtype;
Guido van Rossum's avatar
Guido van Rossum committed
19 20 21

#define is_fhobject(v)		((v)->ob_type == &Fhtype)

22
static PyObject *
23
newfhobject(fmfonthandle fh)
Guido van Rossum's avatar
Guido van Rossum committed
24 25 26
{
	fhobject *fhp;
	if (fh == NULL) {
27 28
		PyErr_SetString(PyExc_RuntimeError,
				"error creating new font handle");
Guido van Rossum's avatar
Guido van Rossum committed
29 30
		return NULL;
	}
31
	fhp = PyObject_New(fhobject, &Fhtype);
Guido van Rossum's avatar
Guido van Rossum committed
32 33 34
	if (fhp == NULL)
		return NULL;
	fhp->fh_fh = fh;
35
	return (PyObject *)fhp;
Guido van Rossum's avatar
Guido van Rossum committed
36 37 38 39
}

/* Font Handle methods */

40
static PyObject *
41
fh_scalefont(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
42 43
{
	double size;
44
	if (!PyArg_Parse(args, "d", &size))
Guido van Rossum's avatar
Guido van Rossum committed
45 46 47 48 49 50
		return NULL;
	return newfhobject(fmscalefont(self->fh_fh, size));
}

/* XXX fmmakefont */

51
static PyObject *
52
fh_setfont(fhobject *self)
Guido van Rossum's avatar
Guido van Rossum committed
53 54
{
	fmsetfont(self->fh_fh);
55 56
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
57 58
}

59
static PyObject *
60
fh_getfontname(fhobject *self)
Guido van Rossum's avatar
Guido van Rossum committed
61 62 63 64 65
{
	char fontname[256];
	int len;
	len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
	if (len < 0) {
66
		PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
Guido van Rossum's avatar
Guido van Rossum committed
67 68
		return NULL;
	}
69
	return PyString_FromStringAndSize(fontname, len);
Guido van Rossum's avatar
Guido van Rossum committed
70 71
}

72
static PyObject *
73
fh_getcomment(fhobject *self)
Guido van Rossum's avatar
Guido van Rossum committed
74 75 76 77 78
{
	char comment[256];
	int len;
	len = fmgetcomment(self->fh_fh, sizeof comment, comment);
	if (len < 0) {
79
		PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
Guido van Rossum's avatar
Guido van Rossum committed
80 81
		return NULL;
	}
82
	return PyString_FromStringAndSize(comment, len);
Guido van Rossum's avatar
Guido van Rossum committed
83 84
}

85
static PyObject *
86
fh_getfontinfo(fhobject *self)
Guido van Rossum's avatar
Guido van Rossum committed
87 88 89
{
	fmfontinfo info;
	if (fmgetfontinfo(self->fh_fh, &info) < 0) {
90
		PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossum's avatar
Guido van Rossum committed
91 92
		return NULL;
	}
93 94 95 96 97 98 99 100 101
	return Py_BuildValue("(llllllll)",
			     info.printermatched,
			     info.fixed_width,
			     info.xorig,
			     info.yorig,
			     info.xsize,
			     info.ysize,
			     info.height,
			     info.nglyphs);
Guido van Rossum's avatar
Guido van Rossum committed
102 103 104
}

#if 0
105
static PyObject *
106
fh_getwholemetrics(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
107 108 109 110
{
}
#endif

111
static PyObject *
112
fh_getstrwidth(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
113
{
114
	char *str;
115
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
116
		return NULL;
117
	return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossum's avatar
Guido van Rossum committed
118 119
}

120
static PyMethodDef fh_methods[] = {
121 122 123 124 125
	{"scalefont",	(PyCFunction)fh_scalefont,   METH_OLDARGS},
	{"setfont",	(PyCFunction)fh_setfont,     METH_NOARGS},
	{"getfontname",	(PyCFunction)fh_getfontname, METH_NOARGS},
	{"getcomment",	(PyCFunction)fh_getcomment,  METH_NOARGS},
	{"getfontinfo",	(PyCFunction)fh_getfontinfo, METH_NOARGS},
Guido van Rossum's avatar
Guido van Rossum committed
126
#if 0
127
	{"getwholemetrics",	(PyCFunction)fh_getwholemetrics, METH_OLDARGS},
Guido van Rossum's avatar
Guido van Rossum committed
128
#endif
129
	{"getstrwidth",	(PyCFunction)fh_getstrwidth, METH_OLDARGS},
Guido van Rossum's avatar
Guido van Rossum committed
130 131 132
	{NULL,		NULL}		/* sentinel */
};

133
static PyObject *
134
fh_getattr(fhobject *fhp, char *name)
Guido van Rossum's avatar
Guido van Rossum committed
135
{
136
	return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossum's avatar
Guido van Rossum committed
137 138 139
}

static void
140
fh_dealloc(fhobject *fhp)
Guido van Rossum's avatar
Guido van Rossum committed
141 142
{
	fmfreefont(fhp->fh_fh);
143
	PyObject_Del(fhp);
Guido van Rossum's avatar
Guido van Rossum committed
144 145
}

146 147
static PyTypeObject Fhtype = {
	PyObject_HEAD_INIT(&PyType_Type)
148
	0,				/*ob_size*/
149
	"fm.font handle",		/*tp_name*/
150 151
	sizeof(fhobject),		/*tp_size*/
	0,				/*tp_itemsize*/
Guido van Rossum's avatar
Guido van Rossum committed
152
	/* methods */
153 154 155 156 157 158
	(destructor)fh_dealloc,		/*tp_dealloc*/
	0,				/*tp_print*/
	(getattrfunc)fh_getattr,	/*tp_getattr*/
	0,				/*tp_setattr*/
	0,				/*tp_compare*/
	0,				/*tp_repr*/
Guido van Rossum's avatar
Guido van Rossum committed
159 160 161 162 163
};


/* Font Manager functions */

164
static PyObject *
165
fm_init(PyObject *self)
Guido van Rossum's avatar
Guido van Rossum committed
166 167
{
	fminit();
168 169
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
170 171
}

172
static PyObject *
173
fm_findfont(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
174
{
175
	char *str;
176
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
177
		return NULL;
178
	return newfhobject(fmfindfont(str));
Guido van Rossum's avatar
Guido van Rossum committed
179 180
}

181
static PyObject *
182
fm_prstr(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
183
{
184
	char *str;
185
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
186
		return NULL;
187
	fmprstr(str);
188 189
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
190 191 192 193
}

/* XXX This uses a global variable as temporary! Not re-entrant! */

194
static PyObject *fontlist;
Guido van Rossum's avatar
Guido van Rossum committed
195 196

static void
197
clientproc(char *fontname)
Guido van Rossum's avatar
Guido van Rossum committed
198 199
{
	int err;
200
	PyObject *v;
Guido van Rossum's avatar
Guido van Rossum committed
201 202
	if (fontlist == NULL)
		return;
203
	v = PyString_FromString(fontname);
Guido van Rossum's avatar
Guido van Rossum committed
204 205 206
	if (v == NULL)
		err = -1;
	else {
207 208
		err = PyList_Append(fontlist, v);
		Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
209 210
	}
	if (err != 0) {
211
		Py_DECREF(fontlist);
Guido van Rossum's avatar
Guido van Rossum committed
212 213 214 215
		fontlist = NULL;
	}
}

216
static PyObject *
217
fm_enumerate(PyObject *self)
Guido van Rossum's avatar
Guido van Rossum committed
218
{
219 220
	PyObject *res;
	fontlist = PyList_New(0);
Guido van Rossum's avatar
Guido van Rossum committed
221 222 223 224 225 226 227 228
	if (fontlist == NULL)
		return NULL;
	fmenumerate(clientproc);
	res = fontlist;
	fontlist = NULL;
	return res;
}

229
static PyObject *
230
fm_setpath(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
231
{
232
	char *str;
233
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
234
		return NULL;
235
	fmsetpath(str);
236 237
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
238 239
}

240
static PyObject *
241
fm_fontpath(PyObject *self)
Guido van Rossum's avatar
Guido van Rossum committed
242
{
243
	return PyString_FromString(fmfontpath());
Guido van Rossum's avatar
Guido van Rossum committed
244 245
}

246
static PyMethodDef fm_methods[] = {
247 248 249 250 251 252
	{"init",	fm_init,      METH_NOARGS},
	{"findfont",	fm_findfont,  METH_OLDARGS},
	{"enumerate",	fm_enumerate, METH_NOARGS},
	{"prstr",	fm_prstr,     METH_OLDARGS},
	{"setpath",	fm_setpath,   METH_OLDARGS},
	{"fontpath",	fm_fontpath,  METH_NOARGS},
Guido van Rossum's avatar
Guido van Rossum committed
253 254 255 256 257
	{NULL,		NULL}		/* sentinel */
};


void
258
initfm(void)
Guido van Rossum's avatar
Guido van Rossum committed
259
{
260
	Py_InitModule("fm", fm_methods);
Guido van Rossum's avatar
Guido van Rossum committed
261 262
	fminit();
}