blob: db3fd032e86af0e7c28de88cbb68c7c799b6f5b0 [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 *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000032newfhobject(fmfonthandle fh)
Guido van Rossuma0c191e1991-04-03 19:02:31 +000033{
34 fhobject *fhp;
35 if (fh == NULL) {
Roger E. Masseed648a21997-01-17 16:08:55 +000036 PyErr_SetString(PyExc_RuntimeError,
37 "error creating new font handle");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000038 return NULL;
39 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000040 fhp = PyObject_New(fhobject, &Fhtype);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000041 if (fhp == NULL)
42 return NULL;
43 fhp->fh_fh = fh;
Roger E. Masseed648a21997-01-17 16:08:55 +000044 return (PyObject *)fhp;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000045}
46
47/* Font Handle methods */
48
Roger E. Masseed648a21997-01-17 16:08:55 +000049static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000050fh_scalefont(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +000051{
52 double size;
Roger E. Masseed648a21997-01-17 16:08:55 +000053 if (!PyArg_Parse(args, "d", &size))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000054 return NULL;
55 return newfhobject(fmscalefont(self->fh_fh, size));
56}
57
58/* XXX fmmakefont */
59
Roger E. Masseed648a21997-01-17 16:08:55 +000060static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000061fh_setfont(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +000062{
Roger E. Masseed648a21997-01-17 16:08:55 +000063 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000064 return NULL;
65 fmsetfont(self->fh_fh);
Roger E. Masseed648a21997-01-17 16:08:55 +000066 Py_INCREF(Py_None);
67 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000068}
69
Roger E. Masseed648a21997-01-17 16:08:55 +000070static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000071fh_getfontname(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +000072{
73 char fontname[256];
74 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +000075 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000076 return NULL;
77 len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
78 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +000079 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000080 return NULL;
81 }
Roger E. Masseed648a21997-01-17 16:08:55 +000082 return PyString_FromStringAndSize(fontname, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000083}
84
Roger E. Masseed648a21997-01-17 16:08:55 +000085static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000086fh_getcomment(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +000087{
88 char comment[256];
89 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +000090 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000091 return NULL;
92 len = fmgetcomment(self->fh_fh, sizeof comment, comment);
93 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +000094 PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000095 return NULL;
96 }
Roger E. Masseed648a21997-01-17 16:08:55 +000097 return PyString_FromStringAndSize(comment, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000098}
99
Roger E. Masseed648a21997-01-17 16:08:55 +0000100static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000101fh_getfontinfo(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000102{
103 fmfontinfo info;
Roger E. Masseed648a21997-01-17 16:08:55 +0000104 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000105 return NULL;
106 if (fmgetfontinfo(self->fh_fh, &info) < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000107 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000108 return NULL;
109 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000110 return Py_BuildValue("(llllllll)",
111 info.printermatched,
112 info.fixed_width,
113 info.xorig,
114 info.yorig,
115 info.xsize,
116 info.ysize,
117 info.height,
118 info.nglyphs);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000119}
120
121#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000122static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000123fh_getwholemetrics(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000124{
125}
126#endif
127
Roger E. Masseed648a21997-01-17 16:08:55 +0000128static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000129fh_getstrwidth(fhobject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000130{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000131 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000132 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000133 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000134 return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000135}
136
Roger E. Masseed648a21997-01-17 16:08:55 +0000137static PyMethodDef fh_methods[] = {
138 {"scalefont", (PyCFunction)fh_scalefont},
139 {"setfont", (PyCFunction)fh_setfont},
140 {"getfontname", (PyCFunction)fh_getfontname},
141 {"getcomment", (PyCFunction)fh_getcomment},
142 {"getfontinfo", (PyCFunction)fh_getfontinfo},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000143#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000144 {"getwholemetrics", (PyCFunction)fh_getwholemetrics},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000145#endif
Roger E. Masseed648a21997-01-17 16:08:55 +0000146 {"getstrwidth", (PyCFunction)fh_getstrwidth},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000147 {NULL, NULL} /* sentinel */
148};
149
Roger E. Masseed648a21997-01-17 16:08:55 +0000150static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000151fh_getattr(fhobject *fhp, char *name)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000152{
Roger E. Masseed648a21997-01-17 16:08:55 +0000153 return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000154}
155
156static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000157fh_dealloc(fhobject *fhp)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000158{
159 fmfreefont(fhp->fh_fh);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000160 PyObject_Del(fhp);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000161}
162
Roger E. Masseed648a21997-01-17 16:08:55 +0000163static PyTypeObject Fhtype = {
164 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165 0, /*ob_size*/
166 "font handle", /*tp_name*/
167 sizeof(fhobject), /*tp_size*/
168 0, /*tp_itemsize*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000169 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170 (destructor)fh_dealloc, /*tp_dealloc*/
171 0, /*tp_print*/
172 (getattrfunc)fh_getattr, /*tp_getattr*/
173 0, /*tp_setattr*/
174 0, /*tp_compare*/
175 0, /*tp_repr*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000176};
177
178
179/* Font Manager functions */
180
Roger E. Masseed648a21997-01-17 16:08:55 +0000181static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000182fm_init(PyObject *self, *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000183{
Roger E. Masseed648a21997-01-17 16:08:55 +0000184 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000185 return NULL;
186 fminit();
Roger E. Masseed648a21997-01-17 16:08:55 +0000187 Py_INCREF(Py_None);
188 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000189}
190
Roger E. Masseed648a21997-01-17 16:08:55 +0000191static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000192fm_findfont(PyObject *self, *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000193{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000194 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000195 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000196 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000197 return newfhobject(fmfindfont(str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000198}
199
Roger E. Masseed648a21997-01-17 16:08:55 +0000200static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000201fm_prstr(PyObject *self, *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000202{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000203 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000204 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000205 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000206 fmprstr(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000207 Py_INCREF(Py_None);
208 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000209}
210
211/* XXX This uses a global variable as temporary! Not re-entrant! */
212
Roger E. Masseed648a21997-01-17 16:08:55 +0000213static PyObject *fontlist;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000214
215static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000216clientproc(char *fontname)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000217{
218 int err;
Roger E. Masseed648a21997-01-17 16:08:55 +0000219 PyObject *v;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000220 if (fontlist == NULL)
221 return;
Roger E. Masseed648a21997-01-17 16:08:55 +0000222 v = PyString_FromString(fontname);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000223 if (v == NULL)
224 err = -1;
225 else {
Roger E. Masseed648a21997-01-17 16:08:55 +0000226 err = PyList_Append(fontlist, v);
227 Py_DECREF(v);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000228 }
229 if (err != 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000230 Py_DECREF(fontlist);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000231 fontlist = NULL;
232 }
233}
234
Roger E. Masseed648a21997-01-17 16:08:55 +0000235static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000236fm_enumerate(PyObject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000237{
Roger E. Masseed648a21997-01-17 16:08:55 +0000238 PyObject *res;
239 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000240 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000241 fontlist = PyList_New(0);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000242 if (fontlist == NULL)
243 return NULL;
244 fmenumerate(clientproc);
245 res = fontlist;
246 fontlist = NULL;
247 return res;
248}
249
Roger E. Masseed648a21997-01-17 16:08:55 +0000250static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000251fm_setpath(PyObject *self, PyObject *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000252{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000253 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000254 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000255 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000256 fmsetpath(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000257 Py_INCREF(Py_None);
258 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000259}
260
Roger E. Masseed648a21997-01-17 16:08:55 +0000261static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000262fm_fontpath(PyObject *self, *args)
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000263{
Roger E. Masseed648a21997-01-17 16:08:55 +0000264 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000265 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000266 return PyString_FromString(fmfontpath());
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000267}
268
Roger E. Masseed648a21997-01-17 16:08:55 +0000269static PyMethodDef fm_methods[] = {
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000270 {"init", fm_init},
271 {"findfont", fm_findfont},
272 {"enumerate", fm_enumerate},
273 {"prstr", fm_prstr},
274 {"setpath", fm_setpath},
275 {"fontpath", fm_fontpath},
276 {NULL, NULL} /* sentinel */
277};
278
279
280void
281initfm()
282{
Roger E. Masseed648a21997-01-17 16:08:55 +0000283 Py_InitModule("fm", fm_methods);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000284 fminit();
285}