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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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