Home | History | Annotate | Download | only in fm
      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