438 lines
9.8 KiB
C
438 lines
9.8 KiB
C
|
|
/* =========================== Module _Fm =========================== */
|
|
|
|
#include "Python.h"
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
#include "pywintoolbox.h"
|
|
#else
|
|
#include "macglue.h"
|
|
#include "pymactoolbox.h"
|
|
#endif
|
|
|
|
/* Macro to test whether a weak-loaded CFM function exists */
|
|
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\
|
|
PyErr_SetString(PyExc_NotImplementedError, \
|
|
"Not available in this shared library/OS version"); \
|
|
return NULL; \
|
|
}} while(0)
|
|
|
|
|
|
#ifdef WITHOUT_FRAMEWORKS
|
|
#include <Fonts.h>
|
|
#else
|
|
#include <Carbon/Carbon.h>
|
|
#endif
|
|
|
|
|
|
/*
|
|
** Parse/generate ComponentDescriptor records
|
|
*/
|
|
static PyObject *
|
|
FMRec_New(FMetricRec *itself)
|
|
{
|
|
|
|
return Py_BuildValue("O&O&O&O&O&",
|
|
PyMac_BuildFixed, itself->ascent,
|
|
PyMac_BuildFixed, itself->descent,
|
|
PyMac_BuildFixed, itself->leading,
|
|
PyMac_BuildFixed, itself->widMax,
|
|
ResObj_New, itself->wTabHandle);
|
|
}
|
|
|
|
#if 0
|
|
/* Not needed... */
|
|
static int
|
|
FMRec_Convert(PyObject *v, FMetricRec *p_itself)
|
|
{
|
|
return PyArg_ParseTuple(v, "O&O&O&O&O&",
|
|
PyMac_GetFixed, &itself->ascent,
|
|
PyMac_GetFixed, &itself->descent,
|
|
PyMac_GetFixed, &itself->leading,
|
|
PyMac_GetFixed, &itself->widMax,
|
|
ResObj_Convert, &itself->wTabHandle);
|
|
}
|
|
#endif
|
|
|
|
|
|
static PyObject *Fm_Error;
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
|
|
static PyObject *Fm_InitFonts(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
#ifndef InitFonts
|
|
PyMac_PRECHECK(InitFonts);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
InitFonts();
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
#endif
|
|
|
|
static PyObject *Fm_GetFontName(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
short familyID;
|
|
Str255 name;
|
|
#ifndef GetFontName
|
|
PyMac_PRECHECK(GetFontName);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "h",
|
|
&familyID))
|
|
return NULL;
|
|
GetFontName(familyID,
|
|
name);
|
|
_res = Py_BuildValue("O&",
|
|
PyMac_BuildStr255, name);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_GetFNum(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Str255 name;
|
|
short familyID;
|
|
#ifndef GetFNum
|
|
PyMac_PRECHECK(GetFNum);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "O&",
|
|
PyMac_GetStr255, name))
|
|
return NULL;
|
|
GetFNum(name,
|
|
&familyID);
|
|
_res = Py_BuildValue("h",
|
|
familyID);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_RealFont(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean _rv;
|
|
short fontNum;
|
|
short size;
|
|
#ifndef RealFont
|
|
PyMac_PRECHECK(RealFont);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "hh",
|
|
&fontNum,
|
|
&size))
|
|
return NULL;
|
|
_rv = RealFont(fontNum,
|
|
size);
|
|
_res = Py_BuildValue("b",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
|
|
static PyObject *Fm_SetFontLock(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean lockFlag;
|
|
#ifndef SetFontLock
|
|
PyMac_PRECHECK(SetFontLock);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "b",
|
|
&lockFlag))
|
|
return NULL;
|
|
SetFontLock(lockFlag);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
#endif
|
|
|
|
static PyObject *Fm_SetFScaleDisable(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean fscaleDisable;
|
|
#ifndef SetFScaleDisable
|
|
PyMac_PRECHECK(SetFScaleDisable);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "b",
|
|
&fscaleDisable))
|
|
return NULL;
|
|
SetFScaleDisable(fscaleDisable);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_FontMetrics(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
FMetricRec theMetrics;
|
|
#ifndef FontMetrics
|
|
PyMac_PRECHECK(FontMetrics);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
FontMetrics(&theMetrics);
|
|
_res = Py_BuildValue("O&",
|
|
FMRec_New, &theMetrics);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_SetFractEnable(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean fractEnable;
|
|
#ifndef SetFractEnable
|
|
PyMac_PRECHECK(SetFractEnable);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "b",
|
|
&fractEnable))
|
|
return NULL;
|
|
SetFractEnable(fractEnable);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_GetDefFontSize(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
short _rv;
|
|
#ifndef GetDefFontSize
|
|
PyMac_PRECHECK(GetDefFontSize);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_rv = GetDefFontSize();
|
|
_res = Py_BuildValue("h",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_IsOutline(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean _rv;
|
|
Point numer;
|
|
Point denom;
|
|
#ifndef IsOutline
|
|
PyMac_PRECHECK(IsOutline);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "O&O&",
|
|
PyMac_GetPoint, &numer,
|
|
PyMac_GetPoint, &denom))
|
|
return NULL;
|
|
_rv = IsOutline(numer,
|
|
denom);
|
|
_res = Py_BuildValue("b",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_SetOutlinePreferred(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean outlinePreferred;
|
|
#ifndef SetOutlinePreferred
|
|
PyMac_PRECHECK(SetOutlinePreferred);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "b",
|
|
&outlinePreferred))
|
|
return NULL;
|
|
SetOutlinePreferred(outlinePreferred);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_GetOutlinePreferred(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean _rv;
|
|
#ifndef GetOutlinePreferred
|
|
PyMac_PRECHECK(GetOutlinePreferred);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_rv = GetOutlinePreferred();
|
|
_res = Py_BuildValue("b",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_SetPreserveGlyph(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean preserveGlyph;
|
|
#ifndef SetPreserveGlyph
|
|
PyMac_PRECHECK(SetPreserveGlyph);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "b",
|
|
&preserveGlyph))
|
|
return NULL;
|
|
SetPreserveGlyph(preserveGlyph);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_GetPreserveGlyph(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
Boolean _rv;
|
|
#ifndef GetPreserveGlyph
|
|
PyMac_PRECHECK(GetPreserveGlyph);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_rv = GetPreserveGlyph();
|
|
_res = Py_BuildValue("b",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
|
|
static PyObject *Fm_FlushFonts(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
OSErr _err;
|
|
#ifndef FlushFonts
|
|
PyMac_PRECHECK(FlushFonts);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_err = FlushFonts();
|
|
if (_err != noErr) return PyMac_Error(_err);
|
|
Py_INCREF(Py_None);
|
|
_res = Py_None;
|
|
return _res;
|
|
}
|
|
#endif
|
|
|
|
static PyObject *Fm_GetSysFont(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
short _rv;
|
|
#ifndef GetSysFont
|
|
PyMac_PRECHECK(GetSysFont);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_rv = GetSysFont();
|
|
_res = Py_BuildValue("h",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_GetAppFont(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
short _rv;
|
|
#ifndef GetAppFont
|
|
PyMac_PRECHECK(GetAppFont);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, ""))
|
|
return NULL;
|
|
_rv = GetAppFont();
|
|
_res = Py_BuildValue("h",
|
|
_rv);
|
|
return _res;
|
|
}
|
|
|
|
static PyObject *Fm_QDTextBounds(PyObject *_self, PyObject *_args)
|
|
{
|
|
PyObject *_res = NULL;
|
|
char *inText__in__;
|
|
int inText__len__;
|
|
int inText__in_len__;
|
|
Rect bounds;
|
|
#ifndef QDTextBounds
|
|
PyMac_PRECHECK(QDTextBounds);
|
|
#endif
|
|
if (!PyArg_ParseTuple(_args, "s#",
|
|
&inText__in__, &inText__in_len__))
|
|
return NULL;
|
|
inText__len__ = inText__in_len__;
|
|
QDTextBounds(inText__len__, inText__in__,
|
|
&bounds);
|
|
_res = Py_BuildValue("O&",
|
|
PyMac_BuildRect, &bounds);
|
|
return _res;
|
|
}
|
|
|
|
static PyMethodDef Fm_methods[] = {
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
{"InitFonts", (PyCFunction)Fm_InitFonts, 1,
|
|
PyDoc_STR("() -> None")},
|
|
#endif
|
|
{"GetFontName", (PyCFunction)Fm_GetFontName, 1,
|
|
PyDoc_STR("(short familyID) -> (Str255 name)")},
|
|
{"GetFNum", (PyCFunction)Fm_GetFNum, 1,
|
|
PyDoc_STR("(Str255 name) -> (short familyID)")},
|
|
{"RealFont", (PyCFunction)Fm_RealFont, 1,
|
|
PyDoc_STR("(short fontNum, short size) -> (Boolean _rv)")},
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
{"SetFontLock", (PyCFunction)Fm_SetFontLock, 1,
|
|
PyDoc_STR("(Boolean lockFlag) -> None")},
|
|
#endif
|
|
{"SetFScaleDisable", (PyCFunction)Fm_SetFScaleDisable, 1,
|
|
PyDoc_STR("(Boolean fscaleDisable) -> None")},
|
|
{"FontMetrics", (PyCFunction)Fm_FontMetrics, 1,
|
|
PyDoc_STR("() -> (FMetricRec theMetrics)")},
|
|
{"SetFractEnable", (PyCFunction)Fm_SetFractEnable, 1,
|
|
PyDoc_STR("(Boolean fractEnable) -> None")},
|
|
{"GetDefFontSize", (PyCFunction)Fm_GetDefFontSize, 1,
|
|
PyDoc_STR("() -> (short _rv)")},
|
|
{"IsOutline", (PyCFunction)Fm_IsOutline, 1,
|
|
PyDoc_STR("(Point numer, Point denom) -> (Boolean _rv)")},
|
|
{"SetOutlinePreferred", (PyCFunction)Fm_SetOutlinePreferred, 1,
|
|
PyDoc_STR("(Boolean outlinePreferred) -> None")},
|
|
{"GetOutlinePreferred", (PyCFunction)Fm_GetOutlinePreferred, 1,
|
|
PyDoc_STR("() -> (Boolean _rv)")},
|
|
{"SetPreserveGlyph", (PyCFunction)Fm_SetPreserveGlyph, 1,
|
|
PyDoc_STR("(Boolean preserveGlyph) -> None")},
|
|
{"GetPreserveGlyph", (PyCFunction)Fm_GetPreserveGlyph, 1,
|
|
PyDoc_STR("() -> (Boolean _rv)")},
|
|
|
|
#if !TARGET_API_MAC_CARBON
|
|
{"FlushFonts", (PyCFunction)Fm_FlushFonts, 1,
|
|
PyDoc_STR("() -> None")},
|
|
#endif
|
|
{"GetSysFont", (PyCFunction)Fm_GetSysFont, 1,
|
|
PyDoc_STR("() -> (short _rv)")},
|
|
{"GetAppFont", (PyCFunction)Fm_GetAppFont, 1,
|
|
PyDoc_STR("() -> (short _rv)")},
|
|
{"QDTextBounds", (PyCFunction)Fm_QDTextBounds, 1,
|
|
PyDoc_STR("(Buffer inText) -> (Rect bounds)")},
|
|
{NULL, NULL, 0}
|
|
};
|
|
|
|
|
|
|
|
|
|
void init_Fm(void)
|
|
{
|
|
PyObject *m;
|
|
PyObject *d;
|
|
|
|
|
|
|
|
|
|
m = Py_InitModule("_Fm", Fm_methods);
|
|
d = PyModule_GetDict(m);
|
|
Fm_Error = PyMac_GetOSErrException();
|
|
if (Fm_Error == NULL ||
|
|
PyDict_SetItemString(d, "Error", Fm_Error) != 0)
|
|
return;
|
|
}
|
|
|
|
/* ========================= End module _Fm ========================= */
|
|
|