blob: 407255e7f5cbe664bcdb758ea33c5b471620781e [file] [log] [blame]
Guido van Rossuma0c191e1991-04-03 19:02:31 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossuma0c191e1991-04-03 19:02:31 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossuma0c191e1991-04-03 19:02:31 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossuma0c191e1991-04-03 19:02:31 +000014
15******************************************************************/
16
17/* Font Manager module */
18
Roger E. Masseed648a21997-01-17 16:08:55 +000019#include "Python.h"
Guido van Rossuma0c191e1991-04-03 19:02:31 +000020
21#include <gl.h>
22#include <device.h>
23#include <fmclient.h>
24
25
26/* Font Handle object implementation */
27
28typedef struct {
Roger E. Masseed648a21997-01-17 16:08:55 +000029 PyObject_HEAD
Guido van Rossuma0c191e1991-04-03 19:02:31 +000030 fmfonthandle fh_fh;
31} fhobject;
32
Roger E. Masseed648a21997-01-17 16:08:55 +000033staticforward PyTypeObject Fhtype;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000034
35#define is_fhobject(v) ((v)->ob_type == &Fhtype)
36
Roger E. Masseed648a21997-01-17 16:08:55 +000037static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000038newfhobject(fh)
39 fmfonthandle fh;
40{
41 fhobject *fhp;
42 if (fh == NULL) {
Roger E. Masseed648a21997-01-17 16:08:55 +000043 PyErr_SetString(PyExc_RuntimeError,
44 "error creating new font handle");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000045 return NULL;
46 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000047 fhp = PyObject_New(fhobject, &Fhtype);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000048 if (fhp == NULL)
49 return NULL;
50 fhp->fh_fh = fh;
Roger E. Masseed648a21997-01-17 16:08:55 +000051 return (PyObject *)fhp;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000052}
53
54/* Font Handle methods */
55
Roger E. Masseed648a21997-01-17 16:08:55 +000056static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000057fh_scalefont(self, args)
58 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000059PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000060{
61 double size;
Roger E. Masseed648a21997-01-17 16:08:55 +000062 if (!PyArg_Parse(args, "d", &size))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000063 return NULL;
64 return newfhobject(fmscalefont(self->fh_fh, size));
65}
66
67/* XXX fmmakefont */
68
Roger E. Masseed648a21997-01-17 16:08:55 +000069static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000070fh_setfont(self, args)
71 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000072PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000073{
Roger E. Masseed648a21997-01-17 16:08:55 +000074 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000075 return NULL;
76 fmsetfont(self->fh_fh);
Roger E. Masseed648a21997-01-17 16:08:55 +000077 Py_INCREF(Py_None);
78 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000079}
80
Roger E. Masseed648a21997-01-17 16:08:55 +000081static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000082fh_getfontname(self, args)
83 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000084PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000085{
86 char fontname[256];
87 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +000088 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000089 return NULL;
90 len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
91 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +000092 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000093 return NULL;
94 }
Roger E. Masseed648a21997-01-17 16:08:55 +000095 return PyString_FromStringAndSize(fontname, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000096}
97
Roger E. Masseed648a21997-01-17 16:08:55 +000098static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000099fh_getcomment(self, args)
100 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000101PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000102{
103 char comment[256];
104 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +0000105 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000106 return NULL;
107 len = fmgetcomment(self->fh_fh, sizeof comment, comment);
108 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000109 PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000110 return NULL;
111 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000112 return PyString_FromStringAndSize(comment, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000113}
114
Roger E. Masseed648a21997-01-17 16:08:55 +0000115static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000116fh_getfontinfo(self, args)
117 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000118PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000119{
120 fmfontinfo info;
Roger E. Masseed648a21997-01-17 16:08:55 +0000121 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000122 return NULL;
123 if (fmgetfontinfo(self->fh_fh, &info) < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000124 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000125 return NULL;
126 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000127 return Py_BuildValue("(llllllll)",
128 info.printermatched,
129 info.fixed_width,
130 info.xorig,
131 info.yorig,
132 info.xsize,
133 info.ysize,
134 info.height,
135 info.nglyphs);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000136}
137
138#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000139static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000140fh_getwholemetrics(self, args)
141 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000142PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000143{
144}
145#endif
146
Roger E. Masseed648a21997-01-17 16:08:55 +0000147static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000148fh_getstrwidth(self, args)
149 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000150PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000151{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000152 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000153 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000154 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000155 return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000156}
157
Roger E. Masseed648a21997-01-17 16:08:55 +0000158static PyMethodDef fh_methods[] = {
159 {"scalefont", (PyCFunction)fh_scalefont},
160 {"setfont", (PyCFunction)fh_setfont},
161 {"getfontname", (PyCFunction)fh_getfontname},
162 {"getcomment", (PyCFunction)fh_getcomment},
163 {"getfontinfo", (PyCFunction)fh_getfontinfo},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000164#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000165 {"getwholemetrics", (PyCFunction)fh_getwholemetrics},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000166#endif
Roger E. Masseed648a21997-01-17 16:08:55 +0000167 {"getstrwidth", (PyCFunction)fh_getstrwidth},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000168 {NULL, NULL} /* sentinel */
169};
170
Roger E. Masseed648a21997-01-17 16:08:55 +0000171static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000172fh_getattr(fhp, name)
173 fhobject *fhp;
Roger E. Masseed648a21997-01-17 16:08:55 +0000174char *name;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000175{
Roger E. Masseed648a21997-01-17 16:08:55 +0000176 return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000177}
178
179static void
180fh_dealloc(fhp)
181 fhobject *fhp;
182{
183 fmfreefont(fhp->fh_fh);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000184 PyObject_Del(fhp);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000185}
186
Roger E. Masseed648a21997-01-17 16:08:55 +0000187static PyTypeObject Fhtype = {
188 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000189 0, /*ob_size*/
190 "font handle", /*tp_name*/
191 sizeof(fhobject), /*tp_size*/
192 0, /*tp_itemsize*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000193 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194 (destructor)fh_dealloc, /*tp_dealloc*/
195 0, /*tp_print*/
196 (getattrfunc)fh_getattr, /*tp_getattr*/
197 0, /*tp_setattr*/
198 0, /*tp_compare*/
199 0, /*tp_repr*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000200};
201
202
203/* Font Manager functions */
204
Roger E. Masseed648a21997-01-17 16:08:55 +0000205static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000206fm_init(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000207 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000208{
Roger E. Masseed648a21997-01-17 16:08:55 +0000209 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000210 return NULL;
211 fminit();
Roger E. Masseed648a21997-01-17 16:08:55 +0000212 Py_INCREF(Py_None);
213 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000214}
215
Roger E. Masseed648a21997-01-17 16:08:55 +0000216static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000217fm_findfont(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000218 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000219{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000220 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000221 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000222 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000223 return newfhobject(fmfindfont(str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000224}
225
Roger E. Masseed648a21997-01-17 16:08:55 +0000226static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000227fm_prstr(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000228 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000229{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000230 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000231 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000232 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000233 fmprstr(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000234 Py_INCREF(Py_None);
235 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000236}
237
238/* XXX This uses a global variable as temporary! Not re-entrant! */
239
Roger E. Masseed648a21997-01-17 16:08:55 +0000240static PyObject *fontlist;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000241
242static void
243clientproc(fontname)
244 char *fontname;
245{
246 int err;
Roger E. Masseed648a21997-01-17 16:08:55 +0000247 PyObject *v;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000248 if (fontlist == NULL)
249 return;
Roger E. Masseed648a21997-01-17 16:08:55 +0000250 v = PyString_FromString(fontname);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000251 if (v == NULL)
252 err = -1;
253 else {
Roger E. Masseed648a21997-01-17 16:08:55 +0000254 err = PyList_Append(fontlist, v);
255 Py_DECREF(v);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000256 }
257 if (err != 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000258 Py_DECREF(fontlist);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000259 fontlist = NULL;
260 }
261}
262
Roger E. Masseed648a21997-01-17 16:08:55 +0000263static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000264fm_enumerate(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000265 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000266{
Roger E. Masseed648a21997-01-17 16:08:55 +0000267 PyObject *res;
268 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000269 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000270 fontlist = PyList_New(0);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000271 if (fontlist == NULL)
272 return NULL;
273 fmenumerate(clientproc);
274 res = fontlist;
275 fontlist = NULL;
276 return res;
277}
278
Roger E. Masseed648a21997-01-17 16:08:55 +0000279static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000280fm_setpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000281 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000282{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000283 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000284 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000285 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000286 fmsetpath(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000287 Py_INCREF(Py_None);
288 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000289}
290
Roger E. Masseed648a21997-01-17 16:08:55 +0000291static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000292fm_fontpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000293 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000294{
Roger E. Masseed648a21997-01-17 16:08:55 +0000295 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000296 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000297 return PyString_FromString(fmfontpath());
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000298}
299
Roger E. Masseed648a21997-01-17 16:08:55 +0000300static PyMethodDef fm_methods[] = {
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000301 {"init", fm_init},
302 {"findfont", fm_findfont},
303 {"enumerate", fm_enumerate},
304 {"prstr", fm_prstr},
305 {"setpath", fm_setpath},
306 {"fontpath", fm_fontpath},
307 {NULL, NULL} /* sentinel */
308};
309
310
311void
312initfm()
313{
Roger E. Masseed648a21997-01-17 16:08:55 +0000314 Py_InitModule("fm", fm_methods);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000315 fminit();
316}