]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | \r |
2 | /* Font Manager module */\r | |
3 | \r | |
4 | #include "Python.h"\r | |
5 | \r | |
6 | #include <gl.h>\r | |
7 | #include <device.h>\r | |
8 | #include <fmclient.h>\r | |
9 | \r | |
10 | \r | |
11 | /* Font Handle object implementation */\r | |
12 | \r | |
13 | typedef struct {\r | |
14 | PyObject_HEAD\r | |
15 | fmfonthandle fh_fh;\r | |
16 | } fhobject;\r | |
17 | \r | |
18 | static PyTypeObject Fhtype;\r | |
19 | \r | |
20 | #define is_fhobject(v) ((v)->ob_type == &Fhtype)\r | |
21 | \r | |
22 | static PyObject *\r | |
23 | newfhobject(fmfonthandle fh)\r | |
24 | {\r | |
25 | fhobject *fhp;\r | |
26 | if (fh == NULL) {\r | |
27 | PyErr_SetString(PyExc_RuntimeError,\r | |
28 | "error creating new font handle");\r | |
29 | return NULL;\r | |
30 | }\r | |
31 | fhp = PyObject_New(fhobject, &Fhtype);\r | |
32 | if (fhp == NULL)\r | |
33 | return NULL;\r | |
34 | fhp->fh_fh = fh;\r | |
35 | return (PyObject *)fhp;\r | |
36 | }\r | |
37 | \r | |
38 | /* Font Handle methods */\r | |
39 | \r | |
40 | static PyObject *\r | |
41 | fh_scalefont(fhobject *self, PyObject *args)\r | |
42 | {\r | |
43 | double size;\r | |
44 | if (!PyArg_ParseTuple(args, "d", &size))\r | |
45 | return NULL;\r | |
46 | return newfhobject(fmscalefont(self->fh_fh, size));\r | |
47 | }\r | |
48 | \r | |
49 | /* XXX fmmakefont */\r | |
50 | \r | |
51 | static PyObject *\r | |
52 | fh_setfont(fhobject *self)\r | |
53 | {\r | |
54 | fmsetfont(self->fh_fh);\r | |
55 | Py_INCREF(Py_None);\r | |
56 | return Py_None;\r | |
57 | }\r | |
58 | \r | |
59 | static PyObject *\r | |
60 | fh_getfontname(fhobject *self)\r | |
61 | {\r | |
62 | char fontname[256];\r | |
63 | int len;\r | |
64 | len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);\r | |
65 | if (len < 0) {\r | |
66 | PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");\r | |
67 | return NULL;\r | |
68 | }\r | |
69 | return PyString_FromStringAndSize(fontname, len);\r | |
70 | }\r | |
71 | \r | |
72 | static PyObject *\r | |
73 | fh_getcomment(fhobject *self)\r | |
74 | {\r | |
75 | char comment[256];\r | |
76 | int len;\r | |
77 | len = fmgetcomment(self->fh_fh, sizeof comment, comment);\r | |
78 | if (len < 0) {\r | |
79 | PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");\r | |
80 | return NULL;\r | |
81 | }\r | |
82 | return PyString_FromStringAndSize(comment, len);\r | |
83 | }\r | |
84 | \r | |
85 | static PyObject *\r | |
86 | fh_getfontinfo(fhobject *self)\r | |
87 | {\r | |
88 | fmfontinfo info;\r | |
89 | if (fmgetfontinfo(self->fh_fh, &info) < 0) {\r | |
90 | PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");\r | |
91 | return NULL;\r | |
92 | }\r | |
93 | return Py_BuildValue("(llllllll)",\r | |
94 | info.printermatched,\r | |
95 | info.fixed_width,\r | |
96 | info.xorig,\r | |
97 | info.yorig,\r | |
98 | info.xsize,\r | |
99 | info.ysize,\r | |
100 | info.height,\r | |
101 | info.nglyphs);\r | |
102 | }\r | |
103 | \r | |
104 | #if 0\r | |
105 | static PyObject *\r | |
106 | fh_getwholemetrics(fhobject *self, PyObject *args)\r | |
107 | {\r | |
108 | }\r | |
109 | #endif\r | |
110 | \r | |
111 | static PyObject *\r | |
112 | fh_getstrwidth(fhobject *self, PyObject *args)\r | |
113 | {\r | |
114 | char *str;\r | |
115 | if (!PyArg_ParseTuple(args, "s", &str))\r | |
116 | return NULL;\r | |
117 | return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));\r | |
118 | }\r | |
119 | \r | |
120 | static PyMethodDef fh_methods[] = {\r | |
121 | {"scalefont", (PyCFunction)fh_scalefont, METH_VARARGS},\r | |
122 | {"setfont", (PyCFunction)fh_setfont, METH_NOARGS},\r | |
123 | {"getfontname", (PyCFunction)fh_getfontname, METH_NOARGS},\r | |
124 | {"getcomment", (PyCFunction)fh_getcomment, METH_NOARGS},\r | |
125 | {"getfontinfo", (PyCFunction)fh_getfontinfo, METH_NOARGS},\r | |
126 | #if 0\r | |
127 | {"getwholemetrics", (PyCFunction)fh_getwholemetrics, METH_VARARGS},\r | |
128 | #endif\r | |
129 | {"getstrwidth", (PyCFunction)fh_getstrwidth, METH_VARARGS},\r | |
130 | {NULL, NULL} /* sentinel */\r | |
131 | };\r | |
132 | \r | |
133 | static PyObject *\r | |
134 | fh_getattr(fhobject *fhp, char *name)\r | |
135 | {\r | |
136 | return Py_FindMethod(fh_methods, (PyObject *)fhp, name);\r | |
137 | }\r | |
138 | \r | |
139 | static void\r | |
140 | fh_dealloc(fhobject *fhp)\r | |
141 | {\r | |
142 | fmfreefont(fhp->fh_fh);\r | |
143 | PyObject_Del(fhp);\r | |
144 | }\r | |
145 | \r | |
146 | static PyTypeObject Fhtype = {\r | |
147 | PyObject_HEAD_INIT(&PyType_Type)\r | |
148 | 0, /*ob_size*/\r | |
149 | "fm.font handle", /*tp_name*/\r | |
150 | sizeof(fhobject), /*tp_size*/\r | |
151 | 0, /*tp_itemsize*/\r | |
152 | /* methods */\r | |
153 | (destructor)fh_dealloc, /*tp_dealloc*/\r | |
154 | 0, /*tp_print*/\r | |
155 | (getattrfunc)fh_getattr, /*tp_getattr*/\r | |
156 | 0, /*tp_setattr*/\r | |
157 | 0, /*tp_compare*/\r | |
158 | 0, /*tp_repr*/\r | |
159 | };\r | |
160 | \r | |
161 | \r | |
162 | /* Font Manager functions */\r | |
163 | \r | |
164 | static PyObject *\r | |
165 | fm_init(PyObject *self)\r | |
166 | {\r | |
167 | fminit();\r | |
168 | Py_INCREF(Py_None);\r | |
169 | return Py_None;\r | |
170 | }\r | |
171 | \r | |
172 | static PyObject *\r | |
173 | fm_findfont(PyObject *self, PyObject *args)\r | |
174 | {\r | |
175 | char *str;\r | |
176 | if (!PyArg_ParseTuple(args, "s", &str))\r | |
177 | return NULL;\r | |
178 | return newfhobject(fmfindfont(str));\r | |
179 | }\r | |
180 | \r | |
181 | static PyObject *\r | |
182 | fm_prstr(PyObject *self, PyObject *args)\r | |
183 | {\r | |
184 | char *str;\r | |
185 | if (!PyArg_ParseTuple(args, "s", &str))\r | |
186 | return NULL;\r | |
187 | fmprstr(str);\r | |
188 | Py_INCREF(Py_None);\r | |
189 | return Py_None;\r | |
190 | }\r | |
191 | \r | |
192 | /* XXX This uses a global variable as temporary! Not re-entrant! */\r | |
193 | \r | |
194 | static PyObject *fontlist;\r | |
195 | \r | |
196 | static void\r | |
197 | clientproc(char *fontname)\r | |
198 | {\r | |
199 | int err;\r | |
200 | PyObject *v;\r | |
201 | if (fontlist == NULL)\r | |
202 | return;\r | |
203 | v = PyString_FromString(fontname);\r | |
204 | if (v == NULL)\r | |
205 | err = -1;\r | |
206 | else {\r | |
207 | err = PyList_Append(fontlist, v);\r | |
208 | Py_DECREF(v);\r | |
209 | }\r | |
210 | if (err != 0) {\r | |
211 | Py_DECREF(fontlist);\r | |
212 | fontlist = NULL;\r | |
213 | }\r | |
214 | }\r | |
215 | \r | |
216 | static PyObject *\r | |
217 | fm_enumerate(PyObject *self)\r | |
218 | {\r | |
219 | PyObject *res;\r | |
220 | fontlist = PyList_New(0);\r | |
221 | if (fontlist == NULL)\r | |
222 | return NULL;\r | |
223 | fmenumerate(clientproc);\r | |
224 | res = fontlist;\r | |
225 | fontlist = NULL;\r | |
226 | return res;\r | |
227 | }\r | |
228 | \r | |
229 | static PyObject *\r | |
230 | fm_setpath(PyObject *self, PyObject *args)\r | |
231 | {\r | |
232 | char *str;\r | |
233 | if (!PyArg_ParseTuple(args, "s", &str))\r | |
234 | return NULL;\r | |
235 | fmsetpath(str);\r | |
236 | Py_INCREF(Py_None);\r | |
237 | return Py_None;\r | |
238 | }\r | |
239 | \r | |
240 | static PyObject *\r | |
241 | fm_fontpath(PyObject *self)\r | |
242 | {\r | |
243 | return PyString_FromString(fmfontpath());\r | |
244 | }\r | |
245 | \r | |
246 | static PyMethodDef fm_methods[] = {\r | |
247 | {"init", fm_init, METH_NOARGS},\r | |
248 | {"findfont", fm_findfont, METH_VARARGS},\r | |
249 | {"enumerate", fm_enumerate, METH_NOARGS},\r | |
250 | {"prstr", fm_prstr, METH_VARARGS},\r | |
251 | {"setpath", fm_setpath, METH_VARARGS},\r | |
252 | {"fontpath", fm_fontpath, METH_NOARGS},\r | |
253 | {NULL, NULL} /* sentinel */\r | |
254 | };\r | |
255 | \r | |
256 | \r | |
257 | void\r | |
258 | initfm(void)\r | |
259 | {\r | |
260 | \r | |
261 | if (PyErr_WarnPy3k("the fm module has been removed in "\r | |
262 | "Python 3.0", 2) < 0)\r | |
263 | return;\r | |
264 | \r | |
265 | Py_InitModule("fm", fm_methods);\r | |
266 | if (m == NULL)\r | |
267 | return;\r | |
268 | fminit();\r | |
269 | }\r |