diff options
Diffstat (limited to 'Modules/fmmodule.c')
-rw-r--r-- | Modules/fmmodule.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/Modules/fmmodule.c b/Modules/fmmodule.c new file mode 100644 index 0000000..dae8290 --- /dev/null +++ b/Modules/fmmodule.c @@ -0,0 +1,333 @@ +/*********************************************************** +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(); +} |