blob: dd5b39787827cb7e7693ce89c5a30e1d72053ce0 [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 Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossuma0c191e1991-04-03 19:02:31 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossuma0c191e1991-04-03 19:02:31 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossuma0c191e1991-04-03 19:02:31 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossuma0c191e1991-04-03 19:02:31 +000029
30******************************************************************/
31
32/* Font Manager module */
33
Roger E. Masseed648a21997-01-17 16:08:55 +000034#include "Python.h"
Guido van Rossuma0c191e1991-04-03 19:02:31 +000035
36#include <gl.h>
37#include <device.h>
38#include <fmclient.h>
39
40
41/* Font Handle object implementation */
42
43typedef struct {
Roger E. Masseed648a21997-01-17 16:08:55 +000044 PyObject_HEAD
Guido van Rossuma0c191e1991-04-03 19:02:31 +000045 fmfonthandle fh_fh;
46} fhobject;
47
Roger E. Masseed648a21997-01-17 16:08:55 +000048staticforward PyTypeObject Fhtype;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000049
50#define is_fhobject(v) ((v)->ob_type == &Fhtype)
51
Roger E. Masseed648a21997-01-17 16:08:55 +000052static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000053newfhobject(fh)
54 fmfonthandle fh;
55{
56 fhobject *fhp;
57 if (fh == NULL) {
Roger E. Masseed648a21997-01-17 16:08:55 +000058 PyErr_SetString(PyExc_RuntimeError,
59 "error creating new font handle");
Guido van Rossuma0c191e1991-04-03 19:02:31 +000060 return NULL;
61 }
Roger E. Masseed648a21997-01-17 16:08:55 +000062 fhp = PyObject_NEW(fhobject, &Fhtype);
Guido van Rossuma0c191e1991-04-03 19:02:31 +000063 if (fhp == NULL)
64 return NULL;
65 fhp->fh_fh = fh;
Roger E. Masseed648a21997-01-17 16:08:55 +000066 return (PyObject *)fhp;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000067}
68
69/* Font Handle methods */
70
Roger E. Masseed648a21997-01-17 16:08:55 +000071static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000072fh_scalefont(self, args)
73 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000074PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000075{
76 double size;
Roger E. Masseed648a21997-01-17 16:08:55 +000077 if (!PyArg_Parse(args, "d", &size))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000078 return NULL;
79 return newfhobject(fmscalefont(self->fh_fh, size));
80}
81
82/* XXX fmmakefont */
83
Roger E. Masseed648a21997-01-17 16:08:55 +000084static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000085fh_setfont(self, args)
86 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000087PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000088{
Roger E. Masseed648a21997-01-17 16:08:55 +000089 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +000090 return NULL;
91 fmsetfont(self->fh_fh);
Roger E. Masseed648a21997-01-17 16:08:55 +000092 Py_INCREF(Py_None);
93 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +000094}
95
Roger E. Masseed648a21997-01-17 16:08:55 +000096static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +000097fh_getfontname(self, args)
98 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +000099PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000100{
101 char fontname[256];
102 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +0000103 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000104 return NULL;
105 len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
106 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000107 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000108 return NULL;
109 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000110 return PyString_FromStringAndSize(fontname, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000111}
112
Roger E. Masseed648a21997-01-17 16:08:55 +0000113static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000114fh_getcomment(self, args)
115 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000116PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000117{
118 char comment[256];
119 int len;
Roger E. Masseed648a21997-01-17 16:08:55 +0000120 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000121 return NULL;
122 len = fmgetcomment(self->fh_fh, sizeof comment, comment);
123 if (len < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000124 PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000125 return NULL;
126 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000127 return PyString_FromStringAndSize(comment, len);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000128}
129
Roger E. Masseed648a21997-01-17 16:08:55 +0000130static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000131fh_getfontinfo(self, args)
132 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000133PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000134{
135 fmfontinfo info;
Roger E. Masseed648a21997-01-17 16:08:55 +0000136 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000137 return NULL;
138 if (fmgetfontinfo(self->fh_fh, &info) < 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000139 PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000140 return NULL;
141 }
Roger E. Masseed648a21997-01-17 16:08:55 +0000142 return Py_BuildValue("(llllllll)",
143 info.printermatched,
144 info.fixed_width,
145 info.xorig,
146 info.yorig,
147 info.xsize,
148 info.ysize,
149 info.height,
150 info.nglyphs);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000151}
152
153#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000154static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000155fh_getwholemetrics(self, args)
156 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000157PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000158{
159}
160#endif
161
Roger E. Masseed648a21997-01-17 16:08:55 +0000162static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000163fh_getstrwidth(self, args)
164 fhobject *self;
Roger E. Masseed648a21997-01-17 16:08:55 +0000165PyObject *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000166{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000167 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000168 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000169 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000170 return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000171}
172
Roger E. Masseed648a21997-01-17 16:08:55 +0000173static PyMethodDef fh_methods[] = {
174 {"scalefont", (PyCFunction)fh_scalefont},
175 {"setfont", (PyCFunction)fh_setfont},
176 {"getfontname", (PyCFunction)fh_getfontname},
177 {"getcomment", (PyCFunction)fh_getcomment},
178 {"getfontinfo", (PyCFunction)fh_getfontinfo},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000179#if 0
Roger E. Masseed648a21997-01-17 16:08:55 +0000180 {"getwholemetrics", (PyCFunction)fh_getwholemetrics},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000181#endif
Roger E. Masseed648a21997-01-17 16:08:55 +0000182 {"getstrwidth", (PyCFunction)fh_getstrwidth},
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000183 {NULL, NULL} /* sentinel */
184};
185
Roger E. Masseed648a21997-01-17 16:08:55 +0000186static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000187fh_getattr(fhp, name)
188 fhobject *fhp;
Roger E. Masseed648a21997-01-17 16:08:55 +0000189char *name;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000190{
Roger E. Masseed648a21997-01-17 16:08:55 +0000191 return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000192}
193
194static void
195fh_dealloc(fhp)
196 fhobject *fhp;
197{
198 fmfreefont(fhp->fh_fh);
Roger E. Masseed648a21997-01-17 16:08:55 +0000199 PyMem_DEL(fhp);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000200}
201
Roger E. Masseed648a21997-01-17 16:08:55 +0000202static PyTypeObject Fhtype = {
203 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000204 0, /*ob_size*/
205 "font handle", /*tp_name*/
206 sizeof(fhobject), /*tp_size*/
207 0, /*tp_itemsize*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000208 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209 (destructor)fh_dealloc, /*tp_dealloc*/
210 0, /*tp_print*/
211 (getattrfunc)fh_getattr, /*tp_getattr*/
212 0, /*tp_setattr*/
213 0, /*tp_compare*/
214 0, /*tp_repr*/
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000215};
216
217
218/* Font Manager functions */
219
Roger E. Masseed648a21997-01-17 16:08:55 +0000220static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000221fm_init(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000222 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000223{
Roger E. Masseed648a21997-01-17 16:08:55 +0000224 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000225 return NULL;
226 fminit();
Roger E. Masseed648a21997-01-17 16:08:55 +0000227 Py_INCREF(Py_None);
228 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000229}
230
Roger E. Masseed648a21997-01-17 16:08:55 +0000231static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000232fm_findfont(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000233 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000234{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000235 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000236 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000237 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000238 return newfhobject(fmfindfont(str));
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000239}
240
Roger E. Masseed648a21997-01-17 16:08:55 +0000241static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000242fm_prstr(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000243 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000244{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000245 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000246 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000247 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000248 fmprstr(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000249 Py_INCREF(Py_None);
250 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000251}
252
253/* XXX This uses a global variable as temporary! Not re-entrant! */
254
Roger E. Masseed648a21997-01-17 16:08:55 +0000255static PyObject *fontlist;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000256
257static void
258clientproc(fontname)
259 char *fontname;
260{
261 int err;
Roger E. Masseed648a21997-01-17 16:08:55 +0000262 PyObject *v;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000263 if (fontlist == NULL)
264 return;
Roger E. Masseed648a21997-01-17 16:08:55 +0000265 v = PyString_FromString(fontname);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000266 if (v == NULL)
267 err = -1;
268 else {
Roger E. Masseed648a21997-01-17 16:08:55 +0000269 err = PyList_Append(fontlist, v);
270 Py_DECREF(v);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000271 }
272 if (err != 0) {
Roger E. Masseed648a21997-01-17 16:08:55 +0000273 Py_DECREF(fontlist);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000274 fontlist = NULL;
275 }
276}
277
Roger E. Masseed648a21997-01-17 16:08:55 +0000278static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000279fm_enumerate(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000280 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000281{
Roger E. Masseed648a21997-01-17 16:08:55 +0000282 PyObject *res;
283 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000284 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000285 fontlist = PyList_New(0);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000286 if (fontlist == NULL)
287 return NULL;
288 fmenumerate(clientproc);
289 res = fontlist;
290 fontlist = NULL;
291 return res;
292}
293
Roger E. Masseed648a21997-01-17 16:08:55 +0000294static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000295fm_setpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000296 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000297{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000298 char *str;
Roger E. Masseed648a21997-01-17 16:08:55 +0000299 if (!PyArg_Parse(args, "s", &str))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000300 return NULL;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000301 fmsetpath(str);
Roger E. Masseed648a21997-01-17 16:08:55 +0000302 Py_INCREF(Py_None);
303 return Py_None;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000304}
305
Roger E. Masseed648a21997-01-17 16:08:55 +0000306static PyObject *
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000307fm_fontpath(self, args)
Roger E. Masseed648a21997-01-17 16:08:55 +0000308 PyObject *self, *args;
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000309{
Roger E. Masseed648a21997-01-17 16:08:55 +0000310 if (!PyArg_NoArgs(args))
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000311 return NULL;
Roger E. Masseed648a21997-01-17 16:08:55 +0000312 return PyString_FromString(fmfontpath());
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000313}
314
Roger E. Masseed648a21997-01-17 16:08:55 +0000315static PyMethodDef fm_methods[] = {
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000316 {"init", fm_init},
317 {"findfont", fm_findfont},
318 {"enumerate", fm_enumerate},
319 {"prstr", fm_prstr},
320 {"setpath", fm_setpath},
321 {"fontpath", fm_fontpath},
322 {NULL, NULL} /* sentinel */
323};
324
325
326void
327initfm()
328{
Roger E. Masseed648a21997-01-17 16:08:55 +0000329 Py_InitModule("fm", fm_methods);
Guido van Rossuma0c191e1991-04-03 19:02:31 +0000330 fminit();
331}