fmmodule.c 5.11 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, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
53
{
54
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
55 56
		return NULL;
	fmsetfont(self->fh_fh);
57 58
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
59 60
}

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

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

91
static PyObject *
92
fh_getfontinfo(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
93 94
{
	fmfontinfo info;
95
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
96 97
		return NULL;
	if (fmgetfontinfo(self->fh_fh, &info) < 0) {
98
		PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossum's avatar
Guido van Rossum committed
99 100
		return NULL;
	}
101 102 103 104 105 106 107 108 109
	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
110 111 112
}

#if 0
113
static PyObject *
114
fh_getwholemetrics(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
115 116 117 118
{
}
#endif

119
static PyObject *
120
fh_getstrwidth(fhobject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
121
{
122
	char *str;
123
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
124
		return NULL;
125
	return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossum's avatar
Guido van Rossum committed
126 127
}

128 129 130 131 132 133
static PyMethodDef fh_methods[] = {
	{"scalefont",	(PyCFunction)fh_scalefont},
	{"setfont",	(PyCFunction)fh_setfont},
	{"getfontname",	(PyCFunction)fh_getfontname},
	{"getcomment",	(PyCFunction)fh_getcomment},
	{"getfontinfo",	(PyCFunction)fh_getfontinfo},
Guido van Rossum's avatar
Guido van Rossum committed
134
#if 0
135
	{"getwholemetrics",	(PyCFunction)fh_getwholemetrics},
Guido van Rossum's avatar
Guido van Rossum committed
136
#endif
137
	{"getstrwidth",	(PyCFunction)fh_getstrwidth},
Guido van Rossum's avatar
Guido van Rossum committed
138 139 140
	{NULL,		NULL}		/* sentinel */
};

141
static PyObject *
142
fh_getattr(fhobject *fhp, char *name)
Guido van Rossum's avatar
Guido van Rossum committed
143
{
144
	return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossum's avatar
Guido van Rossum committed
145 146 147
}

static void
148
fh_dealloc(fhobject *fhp)
Guido van Rossum's avatar
Guido van Rossum committed
149 150
{
	fmfreefont(fhp->fh_fh);
151
	PyObject_Del(fhp);
Guido van Rossum's avatar
Guido van Rossum committed
152 153
}

154 155
static PyTypeObject Fhtype = {
	PyObject_HEAD_INIT(&PyType_Type)
156 157 158 159
	0,				/*ob_size*/
	"font handle",			/*tp_name*/
	sizeof(fhobject),		/*tp_size*/
	0,				/*tp_itemsize*/
Guido van Rossum's avatar
Guido van Rossum committed
160
	/* methods */
161 162 163 164 165 166
	(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
167 168 169 170 171
};


/* Font Manager functions */

172
static PyObject *
173
fm_init(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
174
{
175
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
176 177
		return NULL;
	fminit();
178 179
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
180 181
}

182
static PyObject *
183
fm_findfont(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
184
{
185
	char *str;
186
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
187
		return NULL;
188
	return newfhobject(fmfindfont(str));
Guido van Rossum's avatar
Guido van Rossum committed
189 190
}

191
static PyObject *
192
fm_prstr(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
193
{
194
	char *str;
195
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
196
		return NULL;
197
	fmprstr(str);
198 199
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
200 201 202 203
}

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

204
static PyObject *fontlist;
Guido van Rossum's avatar
Guido van Rossum committed
205 206

static void
207
clientproc(char *fontname)
Guido van Rossum's avatar
Guido van Rossum committed
208 209
{
	int err;
210
	PyObject *v;
Guido van Rossum's avatar
Guido van Rossum committed
211 212
	if (fontlist == NULL)
		return;
213
	v = PyString_FromString(fontname);
Guido van Rossum's avatar
Guido van Rossum committed
214 215 216
	if (v == NULL)
		err = -1;
	else {
217 218
		err = PyList_Append(fontlist, v);
		Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
219 220
	}
	if (err != 0) {
221
		Py_DECREF(fontlist);
Guido van Rossum's avatar
Guido van Rossum committed
222 223 224 225
		fontlist = NULL;
	}
}

226
static PyObject *
227
fm_enumerate(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
228
{
229 230
	PyObject *res;
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
231
		return NULL;
232
	fontlist = PyList_New(0);
Guido van Rossum's avatar
Guido van Rossum committed
233 234 235 236 237 238 239 240
	if (fontlist == NULL)
		return NULL;
	fmenumerate(clientproc);
	res = fontlist;
	fontlist = NULL;
	return res;
}

241
static PyObject *
242
fm_setpath(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
243
{
244
	char *str;
245
	if (!PyArg_Parse(args, "s", &str))
Guido van Rossum's avatar
Guido van Rossum committed
246
		return NULL;
247
	fmsetpath(str);
248 249
	Py_INCREF(Py_None);
	return Py_None;
Guido van Rossum's avatar
Guido van Rossum committed
250 251
}

252
static PyObject *
253
fm_fontpath(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
254
{
255
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
256
		return NULL;
257
	return PyString_FromString(fmfontpath());
Guido van Rossum's avatar
Guido van Rossum committed
258 259
}

260
static PyMethodDef fm_methods[] = {
Guido van Rossum's avatar
Guido van Rossum committed
261 262 263 264 265 266 267 268 269 270 271
	{"init",	fm_init},
	{"findfont",	fm_findfont},
	{"enumerate",	fm_enumerate},
	{"prstr",	fm_prstr},
	{"setpath",	fm_setpath},
	{"fontpath",	fm_fontpath},
	{NULL,		NULL}		/* sentinel */
};


void
272
initfm(void)
Guido van Rossum's avatar
Guido van Rossum committed
273
{
274
	Py_InitModule("fm", fm_methods);
Guido van Rossum's avatar
Guido van Rossum committed
275 276
	fminit();
}