• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
25 static PyObject *
FMRec_New(FMetricRec * itself)26 FMRec_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... */
39 static int
40 FMRec_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 
52 static PyObject *Fm_Error;
53 
Fm_GetFontName(PyObject * _self,PyObject * _args)54 static 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 
Fm_GetFNum(PyObject * _self,PyObject * _args)72 static 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 
Fm_RealFont(PyObject * _self,PyObject * _args)90 static 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 
Fm_SetFScaleDisable(PyObject * _self,PyObject * _args)110 static 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 
Fm_FontMetrics(PyObject * _self,PyObject * _args)126 static 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 
Fm_SetFractEnable(PyObject * _self,PyObject * _args)141 static 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 
Fm_GetDefFontSize(PyObject * _self,PyObject * _args)157 static 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 
Fm_IsOutline(PyObject * _self,PyObject * _args)172 static 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 
Fm_SetOutlinePreferred(PyObject * _self,PyObject * _args)192 static 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 
Fm_GetOutlinePreferred(PyObject * _self,PyObject * _args)208 static 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 
Fm_SetPreserveGlyph(PyObject * _self,PyObject * _args)223 static 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 
Fm_GetPreserveGlyph(PyObject * _self,PyObject * _args)239 static 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 
Fm_GetSysFont(PyObject * _self,PyObject * _args)254 static 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 
Fm_GetAppFont(PyObject * _self,PyObject * _args)269 static 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 
Fm_QDTextBounds(PyObject * _self,PyObject * _args)284 static 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 
305 static 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 
341 static PyMethodDef Fm_methods[] = {
342     {NULL, NULL, 0}
343 };
344 
345 #endif  /* __LP64__ */
346 
init_Fm(void)347 void 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