1
2/* =========================== Module _Fm =========================== */
3
4#include "Python.h"
5#include <Carbon/Carbon.h>
6
7#if !defined(__LP64__) && !defined(MAC_OS_X_VERSION_10_7)
8
9
10#include "pymactoolbox.h"
11
12/* Macro to test whether a weak-loaded CFM function exists */
13#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
14        PyErr_SetString(PyExc_NotImplementedError, \
15            "Not available in this shared library/OS version"); \
16        return NULL; \
17    }} while(0)
18
19
20
21
22/*
23** Parse/generate ComponentDescriptor records
24*/
25static PyObject *
26FMRec_New(FMetricRec *itself)
27{
28
29    return Py_BuildValue("O&O&O&O&O&",
30        PyMac_BuildFixed, itself->ascent,
31        PyMac_BuildFixed, itself->descent,
32        PyMac_BuildFixed, itself->leading,
33        PyMac_BuildFixed, itself->widMax,
34        ResObj_New, itself->wTabHandle);
35}
36
37#if 0
38/* Not needed... */
39static int
40FMRec_Convert(PyObject *v, FMetricRec *p_itself)
41{
42    return PyArg_ParseTuple(v, "O&O&O&O&O&",
43        PyMac_GetFixed, &itself->ascent,
44        PyMac_GetFixed, &itself->descent,
45        PyMac_GetFixed, &itself->leading,
46        PyMac_GetFixed, &itself->widMax,
47        ResObj_Convert, &itself->wTabHandle);
48}
49#endif
50
51
52static PyObject *Fm_Error;
53
54static PyObject *Fm_GetFontName(PyObject *_self, PyObject *_args)
55{
56    PyObject *_res = NULL;
57    short familyID;
58    Str255 name;
59#ifndef GetFontName
60    PyMac_PRECHECK(GetFontName);
61#endif
62    if (!PyArg_ParseTuple(_args, "h",
63                          &familyID))
64        return NULL;
65    GetFontName(familyID,
66                name);
67    _res = Py_BuildValue("O&",
68                         PyMac_BuildStr255, name);
69    return _res;
70}
71
72static PyObject *Fm_GetFNum(PyObject *_self, PyObject *_args)
73{
74    PyObject *_res = NULL;
75    Str255 name;
76    short familyID;
77#ifndef GetFNum
78    PyMac_PRECHECK(GetFNum);
79#endif
80    if (!PyArg_ParseTuple(_args, "O&",
81                          PyMac_GetStr255, name))
82        return NULL;
83    GetFNum(name,
84        &familyID);
85    _res = Py_BuildValue("h",
86                         familyID);
87    return _res;
88}
89
90static PyObject *Fm_RealFont(PyObject *_self, PyObject *_args)
91{
92    PyObject *_res = NULL;
93    Boolean _rv;
94    short fontNum;
95    short size;
96#ifndef RealFont
97    PyMac_PRECHECK(RealFont);
98#endif
99    if (!PyArg_ParseTuple(_args, "hh",
100                          &fontNum,
101                          &size))
102        return NULL;
103    _rv = RealFont(fontNum,
104                   size);
105    _res = Py_BuildValue("b",
106                         _rv);
107    return _res;
108}
109
110static PyObject *Fm_SetFScaleDisable(PyObject *_self, PyObject *_args)
111{
112    PyObject *_res = NULL;
113    Boolean fscaleDisable;
114#ifndef SetFScaleDisable
115    PyMac_PRECHECK(SetFScaleDisable);
116#endif
117    if (!PyArg_ParseTuple(_args, "b",
118                          &fscaleDisable))
119        return NULL;
120    SetFScaleDisable(fscaleDisable);
121    Py_INCREF(Py_None);
122    _res = Py_None;
123    return _res;
124}
125
126static PyObject *Fm_FontMetrics(PyObject *_self, PyObject *_args)
127{
128    PyObject *_res = NULL;
129    FMetricRec theMetrics;
130#ifndef FontMetrics
131    PyMac_PRECHECK(FontMetrics);
132#endif
133    if (!PyArg_ParseTuple(_args, ""))
134        return NULL;
135    FontMetrics(&theMetrics);
136    _res = Py_BuildValue("O&",
137                         FMRec_New, &theMetrics);
138    return _res;
139}
140
141static PyObject *Fm_SetFractEnable(PyObject *_self, PyObject *_args)
142{
143    PyObject *_res = NULL;
144    Boolean fractEnable;
145#ifndef SetFractEnable
146    PyMac_PRECHECK(SetFractEnable);
147#endif
148    if (!PyArg_ParseTuple(_args, "b",
149                          &fractEnable))
150        return NULL;
151    SetFractEnable(fractEnable);
152    Py_INCREF(Py_None);
153    _res = Py_None;
154    return _res;
155}
156
157static PyObject *Fm_GetDefFontSize(PyObject *_self, PyObject *_args)
158{
159    PyObject *_res = NULL;
160    short _rv;
161#ifndef GetDefFontSize
162    PyMac_PRECHECK(GetDefFontSize);
163#endif
164    if (!PyArg_ParseTuple(_args, ""))
165        return NULL;
166    _rv = GetDefFontSize();
167    _res = Py_BuildValue("h",
168                         _rv);
169    return _res;
170}
171
172static PyObject *Fm_IsOutline(PyObject *_self, PyObject *_args)
173{
174    PyObject *_res = NULL;
175    Boolean _rv;
176    Point numer;
177    Point denom;
178#ifndef IsOutline
179    PyMac_PRECHECK(IsOutline);
180#endif
181    if (!PyArg_ParseTuple(_args, "O&O&",
182                          PyMac_GetPoint, &numer,
183                          PyMac_GetPoint, &denom))
184        return NULL;
185    _rv = IsOutline(numer,
186                    denom);
187    _res = Py_BuildValue("b",
188                         _rv);
189    return _res;
190}
191
192static PyObject *Fm_SetOutlinePreferred(PyObject *_self, PyObject *_args)
193{
194    PyObject *_res = NULL;
195    Boolean outlinePreferred;
196#ifndef SetOutlinePreferred
197    PyMac_PRECHECK(SetOutlinePreferred);
198#endif
199    if (!PyArg_ParseTuple(_args, "b",
200                          &outlinePreferred))
201        return NULL;
202    SetOutlinePreferred(outlinePreferred);
203    Py_INCREF(Py_None);
204    _res = Py_None;
205    return _res;
206}
207
208static PyObject *Fm_GetOutlinePreferred(PyObject *_self, PyObject *_args)
209{
210    PyObject *_res = NULL;
211    Boolean _rv;
212#ifndef GetOutlinePreferred
213    PyMac_PRECHECK(GetOutlinePreferred);
214#endif
215    if (!PyArg_ParseTuple(_args, ""))
216        return NULL;
217    _rv = GetOutlinePreferred();
218    _res = Py_BuildValue("b",
219                         _rv);
220    return _res;
221}
222
223static PyObject *Fm_SetPreserveGlyph(PyObject *_self, PyObject *_args)
224{
225    PyObject *_res = NULL;
226    Boolean preserveGlyph;
227#ifndef SetPreserveGlyph
228    PyMac_PRECHECK(SetPreserveGlyph);
229#endif
230    if (!PyArg_ParseTuple(_args, "b",
231                          &preserveGlyph))
232        return NULL;
233    SetPreserveGlyph(preserveGlyph);
234    Py_INCREF(Py_None);
235    _res = Py_None;
236    return _res;
237}
238
239static PyObject *Fm_GetPreserveGlyph(PyObject *_self, PyObject *_args)
240{
241    PyObject *_res = NULL;
242    Boolean _rv;
243#ifndef GetPreserveGlyph
244    PyMac_PRECHECK(GetPreserveGlyph);
245#endif
246    if (!PyArg_ParseTuple(_args, ""))
247        return NULL;
248    _rv = GetPreserveGlyph();
249    _res = Py_BuildValue("b",
250                         _rv);
251    return _res;
252}
253
254static PyObject *Fm_GetSysFont(PyObject *_self, PyObject *_args)
255{
256    PyObject *_res = NULL;
257    short _rv;
258#ifndef GetSysFont
259    PyMac_PRECHECK(GetSysFont);
260#endif
261    if (!PyArg_ParseTuple(_args, ""))
262        return NULL;
263    _rv = GetSysFont();
264    _res = Py_BuildValue("h",
265                         _rv);
266    return _res;
267}
268
269static PyObject *Fm_GetAppFont(PyObject *_self, PyObject *_args)
270{
271    PyObject *_res = NULL;
272    short _rv;
273#ifndef GetAppFont
274    PyMac_PRECHECK(GetAppFont);
275#endif
276    if (!PyArg_ParseTuple(_args, ""))
277        return NULL;
278    _rv = GetAppFont();
279    _res = Py_BuildValue("h",
280                         _rv);
281    return _res;
282}
283
284static PyObject *Fm_QDTextBounds(PyObject *_self, PyObject *_args)
285{
286    PyObject *_res = NULL;
287    char *inText__in__;
288    int inText__len__;
289    int inText__in_len__;
290    Rect bounds;
291#ifndef QDTextBounds
292    PyMac_PRECHECK(QDTextBounds);
293#endif
294    if (!PyArg_ParseTuple(_args, "s#",
295                          &inText__in__, &inText__in_len__))
296        return NULL;
297    inText__len__ = inText__in_len__;
298    QDTextBounds(inText__len__, inText__in__,
299                 &bounds);
300    _res = Py_BuildValue("O&",
301                         PyMac_BuildRect, &bounds);
302    return _res;
303}
304
305static PyMethodDef Fm_methods[] = {
306    {"GetFontName", (PyCFunction)Fm_GetFontName, 1,
307     PyDoc_STR("(short familyID) -> (Str255 name)")},
308    {"GetFNum", (PyCFunction)Fm_GetFNum, 1,
309     PyDoc_STR("(Str255 name) -> (short familyID)")},
310    {"RealFont", (PyCFunction)Fm_RealFont, 1,
311     PyDoc_STR("(short fontNum, short size) -> (Boolean _rv)")},
312    {"SetFScaleDisable", (PyCFunction)Fm_SetFScaleDisable, 1,
313     PyDoc_STR("(Boolean fscaleDisable) -> None")},
314    {"FontMetrics", (PyCFunction)Fm_FontMetrics, 1,
315     PyDoc_STR("() -> (FMetricRec theMetrics)")},
316    {"SetFractEnable", (PyCFunction)Fm_SetFractEnable, 1,
317     PyDoc_STR("(Boolean fractEnable) -> None")},
318    {"GetDefFontSize", (PyCFunction)Fm_GetDefFontSize, 1,
319     PyDoc_STR("() -> (short _rv)")},
320    {"IsOutline", (PyCFunction)Fm_IsOutline, 1,
321     PyDoc_STR("(Point numer, Point denom) -> (Boolean _rv)")},
322    {"SetOutlinePreferred", (PyCFunction)Fm_SetOutlinePreferred, 1,
323     PyDoc_STR("(Boolean outlinePreferred) -> None")},
324    {"GetOutlinePreferred", (PyCFunction)Fm_GetOutlinePreferred, 1,
325     PyDoc_STR("() -> (Boolean _rv)")},
326    {"SetPreserveGlyph", (PyCFunction)Fm_SetPreserveGlyph, 1,
327     PyDoc_STR("(Boolean preserveGlyph) -> None")},
328    {"GetPreserveGlyph", (PyCFunction)Fm_GetPreserveGlyph, 1,
329     PyDoc_STR("() -> (Boolean _rv)")},
330    {"GetSysFont", (PyCFunction)Fm_GetSysFont, 1,
331     PyDoc_STR("() -> (short _rv)")},
332    {"GetAppFont", (PyCFunction)Fm_GetAppFont, 1,
333     PyDoc_STR("() -> (short _rv)")},
334    {"QDTextBounds", (PyCFunction)Fm_QDTextBounds, 1,
335     PyDoc_STR("(Buffer inText) -> (Rect bounds)")},
336    {NULL, NULL, 0}
337};
338
339#else  /* __LP64__ */
340
341static PyMethodDef Fm_methods[] = {
342    {NULL, NULL, 0}
343};
344
345#endif  /* __LP64__ */
346
347void init_Fm(void)
348{
349    PyObject *m;
350#if !defined(__LP64__) && !defined(MAC_OS_X_VERSION_10_7)
351    PyObject *d;
352#endif  /* __LP64__ */
353
354
355
356
357    m = Py_InitModule("_Fm", Fm_methods);
358#if !defined(__LP64__) && !defined(MAC_OS_X_VERSION_10_7)
359    d = PyModule_GetDict(m);
360    Fm_Error = PyMac_GetOSErrException();
361    if (Fm_Error == NULL ||
362        PyDict_SetItemString(d, "Error", Fm_Error) != 0)
363        return;
364#endif  /* __LP64__ */
365}
366
367/* ========================= End module _Fm ========================= */
368
369