mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			333 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/***********************************************************
 | 
						|
Copyright 1991 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 not be used in advertising or publicity pertaining to
 | 
						|
distribution of the software without specific, written prior permission.
 | 
						|
 | 
						|
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
 | 
						|
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 | 
						|
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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 "allobjects.h"
 | 
						|
 | 
						|
#include "modsupport.h"
 | 
						|
 | 
						|
#include <gl.h>
 | 
						|
#include <device.h>
 | 
						|
#include <fmclient.h>
 | 
						|
 | 
						|
 | 
						|
/* Font Handle object implementation */
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	OB_HEAD
 | 
						|
	fmfonthandle fh_fh;
 | 
						|
} fhobject;
 | 
						|
 | 
						|
extern typeobject Fhtype;	/* Really static, forward */
 | 
						|
 | 
						|
#define is_fhobject(v)		((v)->ob_type == &Fhtype)
 | 
						|
 | 
						|
static object *
 | 
						|
newfhobject(fh)
 | 
						|
	fmfonthandle fh;
 | 
						|
{
 | 
						|
	fhobject *fhp;
 | 
						|
	if (fh == NULL) {
 | 
						|
		err_setstr(RuntimeError, "error creating new font handle");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	fhp = NEWOBJ(fhobject, &Fhtype);
 | 
						|
	if (fhp == NULL)
 | 
						|
		return NULL;
 | 
						|
	fhp->fh_fh = fh;
 | 
						|
	return (object *)fhp;
 | 
						|
}
 | 
						|
 | 
						|
/* Font Handle methods */
 | 
						|
 | 
						|
static object *
 | 
						|
fh_scalefont(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	double size;
 | 
						|
	if (!getdoublearg(args, &size))
 | 
						|
		return NULL;
 | 
						|
	return newfhobject(fmscalefont(self->fh_fh, size));
 | 
						|
}
 | 
						|
 | 
						|
/* XXX fmmakefont */
 | 
						|
 | 
						|
static object *
 | 
						|
fh_setfont(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	fmsetfont(self->fh_fh);
 | 
						|
	INCREF(None);
 | 
						|
	return None;
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fh_getfontname(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	char fontname[256];
 | 
						|
	int len;
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	len = fmgetfontname(self->fh_fh, sizeof fontname, fontname);
 | 
						|
	if (len < 0) {
 | 
						|
		err_setstr(RuntimeError, "error in fmgetfontname");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	return newsizedstringobject(fontname, len);
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fh_getcomment(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	char comment[256];
 | 
						|
	int len;
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	len = fmgetcomment(self->fh_fh, sizeof comment, comment);
 | 
						|
	if (len < 0) {
 | 
						|
		err_setstr(RuntimeError, "error in fmgetcomment");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	return newsizedstringobject(comment, len);
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fh_getfontinfo(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	fmfontinfo info;
 | 
						|
	object *v;
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	if (fmgetfontinfo(self->fh_fh, &info) < 0) {
 | 
						|
		err_setstr(RuntimeError, "error in fmgetfontinfo");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	v = newtupleobject(8);
 | 
						|
	if (v == NULL)
 | 
						|
		return NULL;
 | 
						|
#define SET(i, member) settupleitem(v, i, newintobject(info.member))
 | 
						|
	SET(0, printermatched);
 | 
						|
	SET(1, fixed_width);
 | 
						|
	SET(2, xorig);
 | 
						|
	SET(3, yorig);
 | 
						|
	SET(4, xsize);
 | 
						|
	SET(5, ysize);
 | 
						|
	SET(6, height);
 | 
						|
	SET(7, nglyphs);
 | 
						|
#undef SET
 | 
						|
	if (err_occurred())
 | 
						|
		return NULL;
 | 
						|
	return v;
 | 
						|
}
 | 
						|
 | 
						|
#if 0
 | 
						|
static object *
 | 
						|
fh_getwholemetrics(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
static object *
 | 
						|
fh_getstrwidth(self, args)
 | 
						|
	fhobject *self;
 | 
						|
	object *args;
 | 
						|
{
 | 
						|
	object *str;
 | 
						|
	if (!getstrarg(args, &str))
 | 
						|
		return NULL;
 | 
						|
	return newintobject(fmgetstrwidth(self->fh_fh, getstringvalue(str)));
 | 
						|
}
 | 
						|
 | 
						|
static struct methodlist fh_methods[] = {
 | 
						|
	{"scalefont",	fh_scalefont},
 | 
						|
	{"setfont",	fh_setfont},
 | 
						|
	{"getfontname",	fh_getfontname},
 | 
						|
	{"getcomment",	fh_getcomment},
 | 
						|
	{"getfontinfo",	fh_getfontinfo},
 | 
						|
#if 0
 | 
						|
	{"getwholemetrics",	fh_getwholemetrics},
 | 
						|
#endif
 | 
						|
	{"getstrwidth",	fh_getstrwidth},
 | 
						|
	{NULL,		NULL}		/* sentinel */
 | 
						|
};
 | 
						|
 | 
						|
static object *
 | 
						|
fh_getattr(fhp, name)
 | 
						|
	fhobject *fhp;
 | 
						|
	char *name;
 | 
						|
{
 | 
						|
	return findmethod(fh_methods, (object *)fhp, name);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
fh_dealloc(fhp)
 | 
						|
	fhobject *fhp;
 | 
						|
{
 | 
						|
	fmfreefont(fhp->fh_fh);
 | 
						|
	DEL(fhp);
 | 
						|
}
 | 
						|
 | 
						|
static typeobject Fhtype = {
 | 
						|
	OB_HEAD_INIT(&Typetype)
 | 
						|
	0,			/*ob_size*/
 | 
						|
	"font handle",		/*tp_name*/
 | 
						|
	sizeof(fhobject),	/*tp_size*/
 | 
						|
	0,			/*tp_itemsize*/
 | 
						|
	/* methods */
 | 
						|
	fh_dealloc,	/*tp_dealloc*/
 | 
						|
	0,		/*tp_print*/
 | 
						|
	fh_getattr,	/*tp_getattr*/
 | 
						|
	0,		/*tp_setattr*/
 | 
						|
	0,		/*tp_compare*/
 | 
						|
	0,		/*tp_repr*/
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Font Manager functions */
 | 
						|
 | 
						|
static object *
 | 
						|
fm_init(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	fminit();
 | 
						|
	INCREF(None);
 | 
						|
	return None;
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fm_findfont(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	object *str;
 | 
						|
	if (!getstrarg(args, &str))
 | 
						|
		return NULL;
 | 
						|
	return newfhobject(fmfindfont(getstringvalue(str)));
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fm_prstr(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	object *str;
 | 
						|
	if (!getstrarg(args, &str))
 | 
						|
		return NULL;
 | 
						|
	fmprstr(getstringvalue(str));
 | 
						|
	INCREF(None);
 | 
						|
	return None;
 | 
						|
}
 | 
						|
 | 
						|
/* XXX This uses a global variable as temporary! Not re-entrant! */
 | 
						|
 | 
						|
static object *fontlist;
 | 
						|
 | 
						|
static void
 | 
						|
clientproc(fontname)
 | 
						|
	char *fontname;
 | 
						|
{
 | 
						|
	int err;
 | 
						|
	object *v;
 | 
						|
	if (fontlist == NULL)
 | 
						|
		return;
 | 
						|
	v = newstringobject(fontname);
 | 
						|
	if (v == NULL)
 | 
						|
		err = -1;
 | 
						|
	else {
 | 
						|
		err = addlistitem(fontlist, v);
 | 
						|
		DECREF(v);
 | 
						|
	}
 | 
						|
	if (err != 0) {
 | 
						|
		DECREF(fontlist);
 | 
						|
		fontlist = NULL;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fm_enumerate(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	object *res;
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	fontlist = newlistobject(0);
 | 
						|
	if (fontlist == NULL)
 | 
						|
		return NULL;
 | 
						|
	fmenumerate(clientproc);
 | 
						|
	res = fontlist;
 | 
						|
	fontlist = NULL;
 | 
						|
	return res;
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fm_setpath(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	object *str;
 | 
						|
	if (!getstrarg(args, &str))
 | 
						|
		return NULL;
 | 
						|
	fmsetpath(getstringvalue(str));
 | 
						|
	INCREF(None);
 | 
						|
	return None;
 | 
						|
}
 | 
						|
 | 
						|
static object *
 | 
						|
fm_fontpath(self, args)
 | 
						|
	object *self, *args;
 | 
						|
{
 | 
						|
	if (!getnoarg(args))
 | 
						|
		return NULL;
 | 
						|
	return newstringobject(fmfontpath());
 | 
						|
}
 | 
						|
 | 
						|
static struct methodlist 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()
 | 
						|
{
 | 
						|
	initmodule("fm", fm_methods);
 | 
						|
	fminit();
 | 
						|
}
 |