blob: 65dffece3b9f851fadd87e8bb857b4c018b6dab0 [file] [log] [blame]
Guido van Rossuma0c191e1991-04-03 19:02:31 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossuma0c191e1991-04-03 19:02:31 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossuma0c191e1991-04-03 19:02:31 +00009******************************************************************/
10
11/* Font Manager module */
12
Roger E. Masseed648a21997-01-17 16:08:55 +000013#include "Python.h"
Guido van Rossuma0c191e1991-04-03 19:02:31 +000014
15#include <gl.h>
16#include <device.h>
17#include <fmclient.h>
18
19
20/* Font Handle object implementation */
21
22typedef struct {
Roger E. Masseed648a21997-01-17 16:08:55 +000023 PyObject_HEAD
Guido van Rossuma0c191e1991-04-03 19:02:31 +000024 fmfonthandle fh_fh;
25} fhobject;
26
Roger E. Masseed648a21997-01-17 16:08:55 +000027staticforward PyTypeObject Fhtype;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000028
29#define is_fhobject(v) ((v)->ob_type == &Fhtype)
30
Roger E. Masseed648a21997-01-17 16:08:55 +000031static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000032newfhobject(fh)
33 fmfonthandle fh;
34{
35 fhobject *fhp;
36 if (fh == NULL) {
Roger E. Masseed648a21997-01-17 16:08:55 +000037 PyErr_SetString(PyExc_RuntimeError,
38 "error creating new font handle");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000039 return NULL;
40 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000041 fhp = PyObject_New(fhobject, &Fhtype);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000042 if (fhp == NULL)
43 return NULL;
44 fhp->fh_fh = fh;
Roger E. Masseed648a21997-01-17 16:08:55 +000045 return (PyObject *)fhp;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000046}
47
48/* Font Handle methods */
49
Roger E. Masseed648a21997-01-17 16:08:55 +000050static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000051fh_scalefont(self, args)
52 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000053PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000054{
55 double size;
Roger E. Masseed648a21997-01-17 16:08:55 +000056 if (!PyArg_Parse(args, "d", &size))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000057 return NULL;
58 return newfhobject(fmscalefont(self->fh_fh, size));
59}
60
61/* XXX fmmakefont */
62
Roger E. Masseed648a21997-01-17 16:08:55 +000063static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000064fh_setfont(self, args)
65 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000066PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000067{
Roger E. Masseed648a21997-01-17 16:08:55 +000068 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000069 return NULL;
70 fmsetfont(self->fh_fh);
Roger E. Masseed648a21997-01-17 16:08:55 +000071 Py_INCREF(Py_None);
72 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000073}
74
Roger E. Masseed648a21997-01-17 16:08:55 +000075static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000076fh_getfontname(self, args)
77 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000078PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000079{
80 char fontname[256];
81 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +000082 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000083 return NULL;
84 len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
85 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +000086 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000087 return NULL;
88 }
Roger E. Masseed648a21997-01-17 16:08:55 +000089 return PyString_FromStringAndSize(fontname, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000090}
91
Roger E. Masseed648a21997-01-17 16:08:55 +000092static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000093fh_getcomment(self, args)
94 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000095PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000096{
97 char comment[256];
98 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +000099 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000100 return NULL;
101 len = fmgetcomment(self->fh_fh, sizeof comment, comment);
102 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000103 PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000104 return NULL;
105 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000106 return PyString_FromStringAndSize(comment, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000107}
108
Roger E. Masseed648a21997-01-17 16:08:55 +0000109static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000110fh_getfontinfo(self, args)
111 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000112PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000113{
114 fmfontinfo info;
Roger E. Masseed648a21997-01-17 16:08:55 +0000115 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000116 return NULL;
117 if (fmgetfontinfo(self->fh_fh, &info) < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000118 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000119 return NULL;
120 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000121 return Py_BuildValue("(llllllll)",
122 info.printermatched,
123 info.fixed_width,
124 info.xorig,
125 info.yorig,
126 info.xsize,
127 info.ysize,
128 info.height,
129 info.nglyphs);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000130}
131
132#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000133static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000134fh_getwholemetrics(self, args)
135 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000136PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000137{
138}
139#endif
140
Roger E. Masseed648a21997-01-17 16:08:55 +0000141static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000142fh_getstrwidth(self, args)
143 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000144PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000145{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000146 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000147 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000148 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000149 return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000150}
151
Roger E. Masseed648a21997-01-17 16:08:55 +0000152static PyMethodDef fh_methods[] = {
153 {"scalefont", (PyCFunction)fh_scalefont},
154 {"setfont", (PyCFunction)fh_setfont},
155 {"getfontname", (PyCFunction)fh_getfontname},
156 {"getcomment", (PyCFunction)fh_getcomment},
157 {"getfontinfo", (PyCFunction)fh_getfontinfo},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000158#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000159 {"getwholemetrics", (PyCFunction)fh_getwholemetrics},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000160#endif
Roger E. Masseed648a21997-01-17 16:08:55 +0000161 {"getstrwidth", (PyCFunction)fh_getstrwidth},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000162 {NULL, NULL} /* sentinel */
163};
164
Roger E. Masseed648a21997-01-17 16:08:55 +0000165static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000166fh_getattr(fhp, name)
167 fhobject *fhp;
Roger E. Masseed648a21997-01-17 16:08:55 +0000168char *name;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000169{
Roger E. Masseed648a21997-01-17 16:08:55 +0000170 return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000171}
172
173static void
174fh_dealloc(fhp)
175 fhobject *fhp;
176{
177 fmfreefont(fhp->fh_fh);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000178 PyObject_Del(fhp);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000179}
180
Roger E. Masseed648a21997-01-17 16:08:55 +0000181static PyTypeObject Fhtype = {
182 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000183 0, /*ob_size*/
184 "font handle", /*tp_name*/
185 sizeof(fhobject), /*tp_size*/
186 0, /*tp_itemsize*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000187 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188 (destructor)fh_dealloc, /*tp_dealloc*/
189 0, /*tp_print*/
190 (getattrfunc)fh_getattr, /*tp_getattr*/
191 0, /*tp_setattr*/
192 0, /*tp_compare*/
193 0, /*tp_repr*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000194};
195
196
197/* Font Manager functions */
198
Roger E. Masseed648a21997-01-17 16:08:55 +0000199static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000200fm_init(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000201 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000202{
Roger E. Masseed648a21997-01-17 16:08:55 +0000203 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000204 return NULL;
205 fminit();
Roger E. Masseed648a21997-01-17 16:08:55 +0000206 Py_INCREF(Py_None);
207 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000208}
209
Roger E. Masseed648a21997-01-17 16:08:55 +0000210static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000211fm_findfont(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000212 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000213{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000214 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000215 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000216 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000217 return newfhobject(fmfindfont(str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000218}
219
Roger E. Masseed648a21997-01-17 16:08:55 +0000220static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000221fm_prstr(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000222 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000223{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000224 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000225 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000226 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000227 fmprstr(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000228 Py_INCREF(Py_None);
229 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000230}
231
232/* XXX This uses a global variable as temporary! Not re-entrant! */
233
Roger E. Masseed648a21997-01-17 16:08:55 +0000234static PyObject *fontlist;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000235
236static void
237clientproc(fontname)
238 char *fontname;
239{
240 int err;
Roger E. Masseed648a21997-01-17 16:08:55 +0000241 PyObject *v;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000242 if (fontlist == NULL)
243 return;
Roger E. Masseed648a21997-01-17 16:08:55 +0000244 v = PyString_FromString(fontname);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000245 if (v == NULL)
246 err = -1;
247 else {
Roger E. Masseed648a21997-01-17 16:08:55 +0000248 err = PyList_Append(fontlist, v);
249 Py_DECREF(v);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000250 }
251 if (err != 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000252 Py_DECREF(fontlist);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000253 fontlist = NULL;
254 }
255}
256
Roger E. Masseed648a21997-01-17 16:08:55 +0000257static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000258fm_enumerate(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000259 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000260{
Roger E. Masseed648a21997-01-17 16:08:55 +0000261 PyObject *res;
262 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000263 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000264 fontlist = PyList_New(0);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000265 if (fontlist == NULL)
266 return NULL;
267 fmenumerate(clientproc);
268 res = fontlist;
269 fontlist = NULL;
270 return res;
271}
272
Roger E. Masseed648a21997-01-17 16:08:55 +0000273static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000274fm_setpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000275 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000276{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000277 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000278 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000279 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000280 fmsetpath(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000281 Py_INCREF(Py_None);
282 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000283}
284
Roger E. Masseed648a21997-01-17 16:08:55 +0000285static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000286fm_fontpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000287 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000288{
Roger E. Masseed648a21997-01-17 16:08:55 +0000289 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000290 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000291 return PyString_FromString(fmfontpath());
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000292}
293
Roger E. Masseed648a21997-01-17 16:08:55 +0000294static PyMethodDef fm_methods[] = {
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000295 {"init", fm_init},
296 {"findfont", fm_findfont},
297 {"enumerate", fm_enumerate},
298 {"prstr", fm_prstr},
299 {"setpath", fm_setpath},
300 {"fontpath", fm_fontpath},
301 {NULL, NULL} /* sentinel */
302};
303
304
305void
306initfm()
307{
Roger E. Masseed648a21997-01-17 16:08:55 +0000308 Py_InitModule("fm", fm_methods);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000309 fminit();
310}