]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/fmmodule.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / fmmodule.c
CommitLineData
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
13typedef struct {\r
14 PyObject_HEAD\r
15 fmfonthandle fh_fh;\r
16} fhobject;\r
17\r
18static PyTypeObject Fhtype;\r
19\r
20#define is_fhobject(v) ((v)->ob_type == &Fhtype)\r
21\r
22static PyObject *\r
23newfhobject(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
40static PyObject *\r
41fh_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
51static PyObject *\r
52fh_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
59static PyObject *\r
60fh_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
72static PyObject *\r
73fh_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
85static PyObject *\r
86fh_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
105static PyObject *\r
106fh_getwholemetrics(fhobject *self, PyObject *args)\r
107{\r
108}\r
109#endif\r
110\r
111static PyObject *\r
112fh_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
120static 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
133static PyObject *\r
134fh_getattr(fhobject *fhp, char *name)\r
135{\r
136 return Py_FindMethod(fh_methods, (PyObject *)fhp, name);\r
137}\r
138\r
139static void\r
140fh_dealloc(fhobject *fhp)\r
141{\r
142 fmfreefont(fhp->fh_fh);\r
143 PyObject_Del(fhp);\r
144}\r
145\r
146static 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
164static PyObject *\r
165fm_init(PyObject *self)\r
166{\r
167 fminit();\r
168 Py_INCREF(Py_None);\r
169 return Py_None;\r
170}\r
171\r
172static PyObject *\r
173fm_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
181static PyObject *\r
182fm_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
194static PyObject *fontlist;\r
195\r
196static void\r
197clientproc(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
216static PyObject *\r
217fm_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
229static PyObject *\r
230fm_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
240static PyObject *\r
241fm_fontpath(PyObject *self)\r
242{\r
243 return PyString_FromString(fmfontpath());\r
244}\r
245\r
246static 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
257void\r
258initfm(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