summaryrefslogtreecommitdiffstats
path: root/Modules/fmmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/fmmodule.c')
-rw-r--r--Modules/fmmodule.c333
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();
+}