mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			331 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			331 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***********************************************************
 | |
| Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
 | |
| The Netherlands.
 | |
| 
 | |
|                         All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and its
 | |
| documentation for any purpose and without fee is hereby granted,
 | |
| provided that the above copyright notice appear in all copies and that
 | |
| both that copyright notice and this permission notice appear in
 | |
| supporting documentation, and that the names of Stichting Mathematisch
 | |
| Centrum or CWI or Corporation for National Research Initiatives or
 | |
| CNRI not be used in advertising or publicity pertaining to
 | |
| distribution of the software without specific, written prior
 | |
| permission.
 | |
| 
 | |
| While CWI is the initial source for this software, a modified version
 | |
| is made available by the Corporation for National Research Initiatives
 | |
| (CNRI) at the Internet address ftp://ftp.python.org.
 | |
| 
 | |
| STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
 | |
| REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
 | |
| MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
 | |
| CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
 | |
| DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 | |
| PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | |
| PERFORMANCE OF THIS SOFTWARE.
 | |
| 
 | |
| ******************************************************************/
 | |
| 
 | |
| /* Font Manager module */
 | |
| 
 | |
| #include "Python.h"
 | |
| 
 | |
| #include <gl.h>
 | |
| #include <device.h>
 | |
| #include <fmclient.h>
 | |
| 
 | |
| 
 | |
| /* Font Handle object implementation */
 | |
| 
 | |
| typedef struct {
 | |
| 	PyObject_HEAD
 | |
| 	fmfonthandle fh_fh;
 | |
| } fhobject;
 | |
| 
 | |
| staticforward PyTypeObject Fhtype;
 | |
| 
 | |
| #define is_fhobject(v)		((v)->ob_type == &Fhtype)
 | |
| 
 | |
| static PyObject *
 | |
| newfhobject(fh)
 | |
| 	fmfonthandle fh;
 | |
| {
 | |
| 	fhobject *fhp;
 | |
| 	if (fh == NULL) {
 | |
| 		PyErr_SetString(PyExc_RuntimeError,
 | |
| 				"error creating new font handle");
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	fhp = PyObject_NEW(fhobject, &Fhtype);
 | |
| 	if (fhp == NULL)
 | |
| 		return NULL;
 | |
| 	fhp->fh_fh = fh;
 | |
| 	return (PyObject *)fhp;
 | |
| }
 | |
| 
 | |
| /* Font Handle methods */
 | |
| 
 | |
| static PyObject *
 | |
| fh_scalefont(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	double size;
 | |
| 	if (!PyArg_Parse(args, "d", &size))
 | |
| 		return NULL;
 | |
| 	return newfhobject(fmscalefont(self->fh_fh, size));
 | |
| }
 | |
| 
 | |
| /* XXX fmmakefont */
 | |
| 
 | |
| static PyObject *
 | |
| fh_setfont(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	fmsetfont(self->fh_fh);
 | |
| 	Py_INCREF(Py_None);
 | |
| 	return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fh_getfontname(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	char fontname[256];
 | |
| 	int len;
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
 | |
| 	if (len < 0) {
 | |
| 		PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname");
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	return PyString_FromStringAndSize(fontname, len);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fh_getcomment(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	char comment[256];
 | |
| 	int len;
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	len = fmgetcomment(self->fh_fh, sizeof comment, comment);
 | |
| 	if (len < 0) {
 | |
| 		PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment");
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	return PyString_FromStringAndSize(comment, len);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fh_getfontinfo(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	fmfontinfo info;
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	if (fmgetfontinfo(self->fh_fh, &info) < 0) {
 | |
| 		PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo");
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	return Py_BuildValue("(llllllll)",
 | |
| 			     info.printermatched,
 | |
| 			     info.fixed_width,
 | |
| 			     info.xorig,
 | |
| 			     info.yorig,
 | |
| 			     info.xsize,
 | |
| 			     info.ysize,
 | |
| 			     info.height,
 | |
| 			     info.nglyphs);
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| static PyObject *
 | |
| fh_getwholemetrics(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static PyObject *
 | |
| fh_getstrwidth(self, args)
 | |
| 	fhobject *self;
 | |
| PyObject *args;
 | |
| {
 | |
| 	char *str;
 | |
| 	if (!PyArg_Parse(args, "s", &str))
 | |
| 		return NULL;
 | |
| 	return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str));
 | |
| }
 | |
| 
 | |
| static PyMethodDef fh_methods[] = {
 | |
| 	{"scalefont",	(PyCFunction)fh_scalefont},
 | |
| 	{"setfont",	(PyCFunction)fh_setfont},
 | |
| 	{"getfontname",	(PyCFunction)fh_getfontname},
 | |
| 	{"getcomment",	(PyCFunction)fh_getcomment},
 | |
| 	{"getfontinfo",	(PyCFunction)fh_getfontinfo},
 | |
| #if 0
 | |
| 	{"getwholemetrics",	(PyCFunction)fh_getwholemetrics},
 | |
| #endif
 | |
| 	{"getstrwidth",	(PyCFunction)fh_getstrwidth},
 | |
| 	{NULL,		NULL}		/* sentinel */
 | |
| };
 | |
| 
 | |
| static PyObject *
 | |
| fh_getattr(fhp, name)
 | |
| 	fhobject *fhp;
 | |
| char *name;
 | |
| {
 | |
| 	return Py_FindMethod(fh_methods, (PyObject *)fhp, name);
 | |
| }
 | |
| 
 | |
| static void
 | |
| fh_dealloc(fhp)
 | |
| 	fhobject *fhp;
 | |
| {
 | |
| 	fmfreefont(fhp->fh_fh);
 | |
| 	PyMem_DEL(fhp);
 | |
| }
 | |
| 
 | |
| static PyTypeObject Fhtype = {
 | |
| 	PyObject_HEAD_INIT(&PyType_Type)
 | |
| 	0,				/*ob_size*/
 | |
| 	"font handle",			/*tp_name*/
 | |
| 	sizeof(fhobject),		/*tp_size*/
 | |
| 	0,				/*tp_itemsize*/
 | |
| 	/* methods */
 | |
| 	(destructor)fh_dealloc,		/*tp_dealloc*/
 | |
| 	0,				/*tp_print*/
 | |
| 	(getattrfunc)fh_getattr,	/*tp_getattr*/
 | |
| 	0,				/*tp_setattr*/
 | |
| 	0,				/*tp_compare*/
 | |
| 	0,				/*tp_repr*/
 | |
| };
 | |
| 
 | |
| 
 | |
| /* Font Manager functions */
 | |
| 
 | |
| static PyObject *
 | |
| fm_init(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	fminit();
 | |
| 	Py_INCREF(Py_None);
 | |
| 	return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fm_findfont(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	char *str;
 | |
| 	if (!PyArg_Parse(args, "s", &str))
 | |
| 		return NULL;
 | |
| 	return newfhobject(fmfindfont(str));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fm_prstr(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	char *str;
 | |
| 	if (!PyArg_Parse(args, "s", &str))
 | |
| 		return NULL;
 | |
| 	fmprstr(str);
 | |
| 	Py_INCREF(Py_None);
 | |
| 	return Py_None;
 | |
| }
 | |
| 
 | |
| /* XXX This uses a global variable as temporary! Not re-entrant! */
 | |
| 
 | |
| static PyObject *fontlist;
 | |
| 
 | |
| static void
 | |
| clientproc(fontname)
 | |
| 	char *fontname;
 | |
| {
 | |
| 	int err;
 | |
| 	PyObject *v;
 | |
| 	if (fontlist == NULL)
 | |
| 		return;
 | |
| 	v = PyString_FromString(fontname);
 | |
| 	if (v == NULL)
 | |
| 		err = -1;
 | |
| 	else {
 | |
| 		err = PyList_Append(fontlist, v);
 | |
| 		Py_DECREF(v);
 | |
| 	}
 | |
| 	if (err != 0) {
 | |
| 		Py_DECREF(fontlist);
 | |
| 		fontlist = NULL;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fm_enumerate(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	PyObject *res;
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	fontlist = PyList_New(0);
 | |
| 	if (fontlist == NULL)
 | |
| 		return NULL;
 | |
| 	fmenumerate(clientproc);
 | |
| 	res = fontlist;
 | |
| 	fontlist = NULL;
 | |
| 	return res;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fm_setpath(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	char *str;
 | |
| 	if (!PyArg_Parse(args, "s", &str))
 | |
| 		return NULL;
 | |
| 	fmsetpath(str);
 | |
| 	Py_INCREF(Py_None);
 | |
| 	return Py_None;
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| fm_fontpath(self, args)
 | |
| 	PyObject *self, *args;
 | |
| {
 | |
| 	if (!PyArg_NoArgs(args))
 | |
| 		return NULL;
 | |
| 	return PyString_FromString(fmfontpath());
 | |
| }
 | |
| 
 | |
| static PyMethodDef fm_methods[] = {
 | |
| 	{"init",	fm_init},
 | |
| 	{"findfont",	fm_findfont},
 | |
| 	{"enumerate",	fm_enumerate},
 | |
| 	{"prstr",	fm_prstr},
 | |
| 	{"setpath",	fm_setpath},
 | |
| 	{"fontpath",	fm_fontpath},
 | |
| 	{NULL,		NULL}		/* sentinel */
 | |
| };
 | |
| 
 | |
| 
 | |
| void
 | |
| initfm()
 | |
| {
 | |
| 	Py_InitModule("fm", fm_methods);
 | |
| 	fminit();
 | |
| }
 | 
