diff --git a/Modules/glmodule.c b/Modules/glmodule.c
new file mode 100644
index 0000000..41956cc
--- /dev/null
+++ b/Modules/glmodule.c
@@ -0,0 +1,8530 @@
+/***********************************************************
+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.
+
+******************************************************************/
+
+/*
+Input used to generate the Python module "glmodule.c".
+The stub generator is a Python script called "cgen.py".
+
+Each definition must be contained on one line:
+
+<returntype> <name> <type> <arg> <type> <arg>
+
+<returntype> can be: void, short, long (XXX maybe others?)
+
+<type> can be: char, string, short, float, long, or double
+	string indicates a null terminated string;
+	if <type> is char and <arg> begins with a *, the * is stripped
+	and <type> is changed into string
+
+<arg> has the form <mode> or <mode>[<subscript>]
+	where <mode> can be
+		s: arg is sent
+		r: arg is received		(arg is a pointer)
+	and <subscript> can be (N and I are numbers):
+		N
+		argI
+		retval
+		N*argI
+		N*I
+		N*retval
+	In the case where the subscript consists of two parts
+	separated by *, the first part is the width of the matrix, and
+	the second part is the length of the matrix.  This order is
+	opposite from the order used in C to declare a two-dimensional
+	matrix.
+*/
+
+/*
+ * An attempt has been made to make this module switch threads on qread
+ * calls. It is far from safe, though.
+ */
+
+#include <gl.h>
+#include <device.h>
+
+#ifdef __sgi
+extern int devport();
+extern int textwritemask();
+extern int pagewritemask();
+extern int gewrite();
+extern int gettp();
+#endif
+
+#include "Python.h"
+#include "cgensupport.h"
+
+
+/*
+Some stubs are too complicated for the stub generator.
+We can include manually written versions of them here.
+A line starting with '%' gives the name of the function so the stub
+generator can include it in the table of functions.
+*/
+
+
+static PyObject *
+gl_qread(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	short arg1 ;
+	Py_BEGIN_ALLOW_THREADS
+	retval = qread( & arg1 );
+	Py_END_ALLOW_THREADS
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewlongobject(retval));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg1));
+	  return v;
+	}
+}
+
+
+/*
+varray -- an array of v.. calls.
+The argument is an array (maybe list or tuple) of points.
+Each point must be a tuple or list of coordinates (x, y, z).
+The points may be 2- or 3-dimensional but must all have the
+same dimension.  Float and int values may be mixed however.
+The points are always converted to 3D double precision points
+by assuming z=0.0 if necessary (as indicated in the man page),
+and for each point v3d() is called.
+*/
+
+
+static PyObject *
+gl_varray(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	PyObject *v, *w=NULL;
+	int i, n, width;
+	double vec[3];
+	PyObject * (*getitem) Py_FPROTO((PyObject *, int));
+	
+	if (!PyArg_GetObject(args, 1, 0, &v))
+		return NULL;
+	
+	if (PyList_Check(v)) {
+		n = PyList_Size(v);
+		getitem = PyList_GetItem;
+	}
+	else if (PyTuple_Check(v)) {
+		n = PyTuple_Size(v);
+		getitem = PyTuple_GetItem;
+	}
+	else {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	
+	if (n == 0) {
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+	if (n > 0)
+		w = (*getitem)(v, 0);
+	
+	width = 0;
+	if (w == NULL) {
+	}
+	else if (PyList_Check(w)) {
+		width = PyList_Size(w);
+	}
+	else if (PyTuple_Check(w)) {
+		width = PyTuple_Size(w);
+	}
+	
+	switch (width) {
+	case 2:
+		vec[2] = 0.0;
+		/* Fall through */
+	case 3:
+		break;
+	default:
+		PyErr_BadArgument();
+		return NULL;
+	}
+	
+	for (i = 0; i < n; i++) {
+		w = (*getitem)(v, i);
+		if (!PyArg_GetDoubleArray(w, 1, 0, width, vec))
+			return NULL;
+		v3d(vec);
+	}
+	
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/*
+vnarray, nvarray -- an array of n3f and v3f calls.
+The argument is an array (list or tuple) of pairs of points and normals.
+Each pair is a tuple (NOT a list) of a point and a normal for that point.
+Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
+Three coordinates must be given.  Float and int values may be mixed.
+For each pair, n3f() is called for the normal, and then v3f() is called
+for the vector.
+
+vnarray and nvarray differ only in the order of the vector and normal in
+the pair: vnarray expects (v, n) while nvarray expects (n, v).
+*/
+
+static PyObject *gen_nvarray(); /* Forward */
+
+
+static PyObject *
+gl_nvarray(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	return gen_nvarray(args, 0);
+}
+
+
+static PyObject *
+gl_vnarray(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	return gen_nvarray(args, 1);
+}
+
+/* Generic, internal version of {nv,nv}array: inorm indicates the
+   argument order, 0: normal first, 1: vector first. */
+
+static PyObject *
+gen_nvarray(args, inorm)
+	PyObject *args;
+	int inorm;
+{
+	PyObject *v, *w, *wnorm, *wvec;
+	int i, n;
+	float norm[3], vec[3];
+	PyObject * (*getitem) Py_FPROTO((PyObject *, int));
+	
+	if (!PyArg_GetObject(args, 1, 0, &v))
+		return NULL;
+	
+	if (PyList_Check(v)) {
+		n = PyList_Size(v);
+		getitem = PyList_GetItem;
+	}
+	else if (PyTuple_Check(v)) {
+		n = PyTuple_Size(v);
+		getitem = PyTuple_GetItem;
+	}
+	else {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	
+	for (i = 0; i < n; i++) {
+		w = (*getitem)(v, i);
+		if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) {
+			PyErr_BadArgument();
+			return NULL;
+		}
+		wnorm = PyTuple_GetItem(w, inorm);
+		wvec = PyTuple_GetItem(w, 1 - inorm);
+		if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) ||
+			!PyArg_GetFloatArray(wvec, 1, 0, 3, vec))
+			return NULL;
+		n3f(norm);
+		v3f(vec);
+	}
+	
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
+   The dimensions of ctl[] are computed as follows:
+   [len(s_knots) - s_order], [len(t_knots) - t_order]
+*/
+
+
+static PyObject *
+gl_nurbssurface(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	double * arg2 ;
+	long arg3 ;
+	double * arg4 ;
+	double *arg5 ;
+	long arg6 ;
+	long arg7 ;
+	long arg8 ;
+	long ncoords;
+	long s_byte_stride, t_byte_stride;
+	long s_nctl, t_nctl;
+	long s, t;
+	PyObject *v, *w, *pt;
+	double *pnext;
+	if (!PyArg_GetLongArraySize(args, 6, 0, &arg1))
+		return NULL;
+	if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
+		return PyErr_NoMemory();
+	}
+	if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2))
+		return NULL;
+	if (!PyArg_GetLongArraySize(args, 6, 1, &arg3))
+		return NULL;
+	if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) {
+		return PyErr_NoMemory();
+	}
+	if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 3, &arg6))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 4, &arg7))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 5, &arg8))
+		return NULL;
+	if (arg8 == N_XYZ)
+		ncoords = 3;
+	else if (arg8 == N_XYZW)
+		ncoords = 4;
+	else {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	s_nctl = arg1 - arg6;
+	t_nctl = arg3 - arg7;
+	if (!PyArg_GetObject(args, 6, 2, &v))
+		return NULL;
+	if (!PyList_Check(v) || PyList_Size(v) != s_nctl) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
+		return PyErr_NoMemory();
+	}
+	pnext = arg5;
+	for (s = 0; s < s_nctl; s++) {
+		w = PyList_GetItem(v, s);
+		if (w == NULL || !PyList_Check(w) ||
+					PyList_Size(w) != t_nctl) {
+			PyErr_BadArgument();
+			return NULL;
+		}
+		for (t = 0; t < t_nctl; t++) {
+			pt = PyList_GetItem(w, t);
+			if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext))
+				return NULL;
+			pnext += ncoords;
+		}
+	}
+	s_byte_stride = sizeof(double) * ncoords;
+	t_byte_stride = s_byte_stride * s_nctl;
+	nurbssurface( arg1 , arg2 , arg3 , arg4 ,
+		s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg4);
+	PyMem_DEL(arg5);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* nurbscurve(knots, ctlpoints, order, type).
+   The length of ctlpoints is len(knots)-order. */
+
+
+static PyObject *
+gl_nurbscurve(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	double * arg2 ;
+	long arg3 ;
+	double * arg4 ;
+	long arg5 ;
+	long arg6 ;
+	int ncoords, npoints;
+	int i;
+	PyObject *v;
+	double *pnext;
+	if (!PyArg_GetLongArraySize(args, 4, 0, &arg1))
+		return NULL;
+	if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) {
+		return PyErr_NoMemory();
+	}
+	if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg5))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg6))
+		return NULL;
+	if (arg6 == N_ST)
+		ncoords = 2;
+	else if (arg6 == N_STW)
+		ncoords = 3;
+	else {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	npoints = arg1 - arg5;
+	if (!PyArg_GetObject(args, 4, 1, &v))
+		return NULL;
+	if (!PyList_Check(v) || PyList_Size(v) != npoints) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) {
+		return PyErr_NoMemory();
+	}
+	pnext = arg4;
+	for (i = 0; i < npoints; i++) {
+		if (!PyArg_GetDoubleArray(PyList_GetItem(v, i),
+					  1, 0, ncoords, pnext))
+			return NULL;
+		pnext += ncoords;
+	}
+	arg3 = (sizeof(double)) * ncoords;
+	nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg4);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* pwlcurve(points, type).
+   Points is a list of points. Type must be N_ST. */
+
+
+static PyObject *
+gl_pwlcurve(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	PyObject *v;
+	long type;
+	double *data, *pnext;
+	long npoints, ncoords;
+	int i;
+	if (!PyArg_GetObject(args, 2, 0, &v))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &type))
+		return NULL;
+	if (!PyList_Check(v)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	npoints = PyList_Size(v);
+	if (type == N_ST)
+		ncoords = 2;
+	else {
+		PyErr_BadArgument();
+		return NULL;
+	}
+	if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) {
+		return PyErr_NoMemory();
+	}
+	pnext = data;
+	for (i = 0; i < npoints; i++) {
+		if (!PyArg_GetDoubleArray(PyList_GetItem(v, i),
+					  1, 0, ncoords, pnext))
+			return NULL;
+		pnext += ncoords;
+	}
+	pwlcurve(npoints, data, sizeof(double)*ncoords, type);
+	PyMem_DEL(data);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+
+/* Picking and Selecting */
+
+static short *pickbuffer = NULL;
+static long pickbuffersize;
+
+static PyObject *
+pick_select(args, func)
+	PyObject *args;
+	void (*func)();
+{
+	if (!PyArg_GetLong(args, 1, 0, &pickbuffersize))
+		return NULL;
+	if (pickbuffer != NULL) {
+		PyErr_SetString(PyExc_RuntimeError,
+			"pick/gselect: already picking/selecting");
+		return NULL;
+	}
+	if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) {
+		return PyErr_NoMemory();
+	}
+	(*func)(pickbuffer, pickbuffersize);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyObject *
+endpick_select(args, func)
+	PyObject *args;
+	long (*func)();
+{
+	PyObject *v, *w;
+	int i, nhits, n;
+	if (!PyArg_NoArgs(args))
+		return NULL;
+	if (pickbuffer == NULL) {
+		PyErr_SetString(PyExc_RuntimeError,
+			"endpick/endselect: not in pick/select mode");
+		return NULL;
+	}
+	nhits = (*func)(pickbuffer);
+	if (nhits < 0) {
+		nhits = -nhits; /* How to report buffer overflow otherwise? */
+	}
+	/* Scan the buffer to see how many integers */
+	n = 0;
+	for (; nhits > 0; nhits--) {
+		n += 1 + pickbuffer[n];
+	}
+	v = PyList_New(n);
+	if (v == NULL)
+		return NULL;
+	/* XXX Could do it nicer and interpret the data structure here,
+	   returning a list of lists. But this can be done in Python... */
+	for (i = 0; i < n; i++) {
+		w = PyInt_FromLong((long)pickbuffer[i]);
+		if (w == NULL) {
+			Py_DECREF(v);
+			return NULL;
+		}
+		PyList_SetItem(v, i, w);
+	}
+	PyMem_DEL(pickbuffer);
+	pickbuffer = NULL;
+	return v;
+}
+
+extern void pick(), gselect();
+extern long endpick(), endselect();
+
+static PyObject *gl_pick(self, args) PyObject *self, *args; {
+	return pick_select(args, pick);
+}
+
+static PyObject *gl_endpick(self, args) PyObject *self, *args; {
+	return endpick_select(args, endpick);
+}
+
+static PyObject *gl_gselect(self, args) PyObject *self, *args; {
+	return pick_select(args, gselect);
+}
+
+static PyObject *gl_endselect(self, args) PyObject *self, *args; {
+	return endpick_select(args, endselect);
+}
+
+
+/* XXX The generator botches this one.  Here's a quick hack to fix it. */
+
+/* XXX The generator botches this one.  Here's a quick hack to fix it. */
+
+
+static PyObject *
+gl_getmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	Matrix arg1;
+	PyObject *v, *w;
+	int i, j;
+	getmatrix( arg1 );
+	v = PyList_New(16);
+	if (v == NULL) {
+		return PyErr_NoMemory();
+	}
+	for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
+		w = mknewfloatobject(arg1[i][j]);
+		if (w == NULL) {
+			Py_DECREF(v);
+			return NULL;
+		}
+		PyList_SetItem(v, i*4+j, w);
+	}
+	return v;
+}
+
+/* Here's an alternate version that returns a 4x4 matrix instead of
+   a vector.  Unfortunately it is incompatible with loadmatrix and
+   multmatrix... */
+
+
+static PyObject *
+gl_altgetmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	Matrix arg1;
+	PyObject *v, *w;
+	int i, j;
+	getmatrix( arg1 );
+	v = PyList_New(4);
+	if (v == NULL) {
+		return NULL;
+	}
+	for (i = 0; i < 4; i++) {
+		w = PyList_New(4);
+		if (w == NULL) {
+			Py_DECREF(v);
+			return NULL;
+		}
+		PyList_SetItem(v, i, w);
+	}
+	for (i = 0; i < 4; i++) {
+		for (j = 0; j < 4; j++) {
+			w = mknewfloatobject(arg1[i][j]);
+			if (w == NULL) {
+				Py_DECREF(v);
+				return NULL;
+			}
+			PyList_SetItem(PyList_GetItem(v, i), j, w);
+		}
+	}
+	return v;
+}
+
+
+static PyObject *
+gl_lrectwrite(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short x1 ;
+	short y1 ;
+	short x2 ;
+	short y2 ;
+	string parray ;
+	PyObject *s;
+#if 0
+	int pixcount;
+#endif
+	if (!PyArg_GetShort(args, 5, 0, &x1))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 1, &y1))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 2, &x2))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &y2))
+		return NULL;
+	if (!PyArg_GetString(args, 5, 4, &parray))
+		return NULL;
+	if (!PyArg_GetObject(args, 5, 4, &s))
+		return NULL;
+#if 0
+/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */
+	pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
+	if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) {
+		PyErr_SetString(PyExc_RuntimeError,
+			   "string arg to lrectwrite has wrong size");
+		return NULL;
+	}
+#endif
+	lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+
+static PyObject *
+gl_lrectread(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short x1 ;
+	short y1 ;
+	short x2 ;
+	short y2 ;
+	PyObject *parray;
+	int pixcount;
+	if (!PyArg_GetShort(args, 4, 0, &x1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &y1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &x2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &y2))
+		return NULL;
+	pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
+	parray = PyString_FromStringAndSize((char *)NULL,
+					    pixcount*sizeof(long));
+	if (parray == NULL)
+		return NULL; /* No memory */
+	lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray));
+	return parray;
+}
+
+
+static PyObject *
+gl_readdisplay(self, args)
+	PyObject *self;
+        PyObject *args;
+{
+        short x1, y1, x2, y2;
+	unsigned long *parray, hints;
+	long size, size_ret;
+	PyObject *rv;
+
+	if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) )
+	  return 0;
+	size = (long)(x2+1-x1) * (long)(y2+1-y1);
+	rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long));
+	if ( rv == NULL )
+	  return NULL;
+	parray = (unsigned long *)PyString_AsString(rv);
+	size_ret = readdisplay(x1, y1, x2, y2, parray, hints);
+	if ( size_ret != size ) {
+	    printf("gl_readdisplay: got %ld pixels, expected %ld\n",
+		   size_ret, size);
+	    PyErr_SetString(PyExc_RuntimeError,
+			    "readdisplay returned unexpected length");
+	    return NULL;
+	}
+	return rv;
+}
+
+/* Desperately needed, here are tools to compress and decompress
+   the data manipulated by lrectread/lrectwrite.
+
+   gl.packrect(width, height, packfactor, bigdata) --> smalldata
+		makes 'bigdata' 4*(packfactor**2) times smaller by:
+		- turning it into B/W (a factor 4)
+		- replacing squares of size pacfactor by one
+		  representative
+
+   gl.unpackrect(width, height, packfactor, smalldata) --> bigdata
+		is the inverse; the numeric arguments must be *the same*.
+
+   Both work best if width and height are multiples of packfactor
+   (in fact unpackrect will leave garbage bytes).
+*/
+
+
+static PyObject *
+gl_packrect(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long width, height, packfactor;
+	char *s;
+	PyObject *unpacked, *packed;
+	int pixcount, packedcount, x, y, r, g, b;
+	unsigned long pixel;
+	unsigned char *p;
+	unsigned long *parray;
+	if (!PyArg_GetLong(args, 4, 0, &width))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &height))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &packfactor))
+		return NULL;
+	if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
+		return NULL;
+	if (!PyArg_GetObject(args, 4, 3, &unpacked))
+		return NULL;
+	if (width <= 0 || height <= 0 || packfactor <= 0) {
+		PyErr_SetString(PyExc_RuntimeError,
+				"packrect args must be > 0");
+		return NULL;
+	}
+	pixcount = width*height;
+	packedcount = ((width+packfactor-1)/packfactor) *
+		((height+packfactor-1)/packfactor);
+	if (PyString_Size(unpacked) != pixcount*sizeof(long)) {
+		PyErr_SetString(PyExc_RuntimeError,
+			   "string arg to packrect has wrong size");
+		return NULL;
+	}
+	packed = PyString_FromStringAndSize((char *)NULL, packedcount);
+	if (packed == NULL)
+		return NULL;
+	parray = (unsigned long *) PyString_AsString(unpacked);
+	p = (unsigned char *) PyString_AsString(packed);
+	for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
+		for (x = 0; x < width; x += packfactor) {
+			pixel = parray[x];
+			r = pixel & 0xff;
+			g = (pixel >> 8) & 0xff;
+			b = (pixel >> 16) & 0xff;
+			*p++ = (30*r+59*g+11*b) / 100;
+		}
+	}
+	return packed;
+}
+
+
+static unsigned long unpacktab[256];
+static int unpacktab_inited = 0;
+
+static PyObject *
+gl_unpackrect(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long width, height, packfactor;
+	char *s;
+	PyObject *unpacked, *packed;
+	int pixcount, packedcount;
+	register unsigned char *p;
+	register unsigned long *parray;
+	if (!unpacktab_inited) {
+		register int white;
+		for (white = 256; --white >= 0; )
+			unpacktab[white] = white * 0x010101L;
+		unpacktab_inited++;
+	}
+	if (!PyArg_GetLong(args, 4, 0, &width))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &height))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &packfactor))
+		return NULL;
+	if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */
+		return NULL;
+	if (!PyArg_GetObject(args, 4, 3, &packed))
+		return NULL;
+	if (width <= 0 || height <= 0 || packfactor <= 0) {
+		PyErr_SetString(PyExc_RuntimeError,
+				"packrect args must be > 0");
+		return NULL;
+	}
+	pixcount = width*height;
+	packedcount = ((width+packfactor-1)/packfactor) *
+		((height+packfactor-1)/packfactor);
+	if (PyString_Size(packed) != packedcount) {
+		PyErr_SetString(PyExc_RuntimeError,
+			   "string arg to unpackrect has wrong size");
+		return NULL;
+	}
+	unpacked = PyString_FromStringAndSize((char *)NULL,
+					      pixcount*sizeof(long));
+	if (unpacked == NULL)
+		return NULL;
+	parray = (unsigned long *) PyString_AsString(unpacked);
+	p = (unsigned char *) PyString_AsString(packed);
+	if (packfactor == 1 && width*height > 0) {
+		/* Just expand bytes to longs */
+		register int x = width * height;
+		do {
+			*parray++ = unpacktab[*p++];
+		} while (--x >= 0);
+	}
+	else {
+		register int y;
+		for (y = 0; y < height-packfactor+1;
+		     y += packfactor, parray += packfactor*width) {
+			register int x;
+			for (x = 0; x < width-packfactor+1; x += packfactor) {
+				register unsigned long pixel = unpacktab[*p++];
+				register int i;
+				for (i = packfactor*width; (i-=width) >= 0;) {
+					register int j;
+					for (j = packfactor; --j >= 0; )
+						parray[i+x+j] = pixel;
+				}
+			}
+		}
+	}
+	return unpacked;
+}
+
+static PyObject *
+gl_gversion(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	char buf[20];
+	gversion(buf);
+	return PyString_FromString(buf);
+}
+
+
+/* End of manually written stubs */
+
+
+/* long getshade */
+
+static PyObject *
+gl_getshade(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getshade( );
+	return mknewlongobject(retval);
+}
+
+/* void devport short s long s */
+
+static PyObject *
+gl_devport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	long arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	devport( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdr2i long s long s */
+
+static PyObject *
+gl_rdr2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	rdr2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rectfs short s short s short s short s */
+
+static PyObject *
+gl_rectfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	rectfs( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rects short s short s short s short s */
+
+static PyObject *
+gl_rects(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	rects( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmv2i long s long s */
+
+static PyObject *
+gl_rmv2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	rmv2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void noport */
+
+static PyObject *
+gl_noport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	noport( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void popviewport */
+
+static PyObject *
+gl_popviewport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	popviewport( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void clear */
+
+static PyObject *
+gl_clear(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	clear( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void clearhitcode */
+
+static PyObject *
+gl_clearhitcode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	clearhitcode( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void closeobj */
+
+static PyObject *
+gl_closeobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	closeobj( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cursoff */
+
+static PyObject *
+gl_cursoff(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	cursoff( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curson */
+
+static PyObject *
+gl_curson(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	curson( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void doublebuffer */
+
+static PyObject *
+gl_doublebuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	doublebuffer( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void finish */
+
+static PyObject *
+gl_finish(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	finish( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gconfig */
+
+static PyObject *
+gl_gconfig(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	gconfig( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void ginit */
+
+static PyObject *
+gl_ginit(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	ginit( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void greset */
+
+static PyObject *
+gl_greset(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	greset( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void multimap */
+
+static PyObject *
+gl_multimap(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	multimap( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void onemap */
+
+static PyObject *
+gl_onemap(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	onemap( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void popattributes */
+
+static PyObject *
+gl_popattributes(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	popattributes( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void popmatrix */
+
+static PyObject *
+gl_popmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	popmatrix( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pushattributes */
+
+static PyObject *
+gl_pushattributes(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	pushattributes( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pushmatrix */
+
+static PyObject *
+gl_pushmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	pushmatrix( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pushviewport */
+
+static PyObject *
+gl_pushviewport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	pushviewport( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void qreset */
+
+static PyObject *
+gl_qreset(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	qreset( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void RGBmode */
+
+static PyObject *
+gl_RGBmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	RGBmode( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void singlebuffer */
+
+static PyObject *
+gl_singlebuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	singlebuffer( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void swapbuffers */
+
+static PyObject *
+gl_swapbuffers(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	swapbuffers( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gsync */
+
+static PyObject *
+gl_gsync(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	gsync( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gflush */
+
+static PyObject *
+gl_gflush(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	gflush( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void tpon */
+
+static PyObject *
+gl_tpon(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	tpon( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void tpoff */
+
+static PyObject *
+gl_tpoff(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	tpoff( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void clkon */
+
+static PyObject *
+gl_clkon(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	clkon( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void clkoff */
+
+static PyObject *
+gl_clkoff(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	clkoff( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void ringbell */
+
+static PyObject *
+gl_ringbell(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	ringbell( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gbegin */
+
+static PyObject *
+gl_gbegin(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	gbegin( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void textinit */
+
+static PyObject *
+gl_textinit(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	textinit( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void initnames */
+
+static PyObject *
+gl_initnames(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	initnames( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pclos */
+
+static PyObject *
+gl_pclos(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	pclos( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void popname */
+
+static PyObject *
+gl_popname(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	popname( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void spclos */
+
+static PyObject *
+gl_spclos(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	spclos( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zclear */
+
+static PyObject *
+gl_zclear(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	zclear( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void screenspace */
+
+static PyObject *
+gl_screenspace(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	screenspace( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void reshapeviewport */
+
+static PyObject *
+gl_reshapeviewport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	reshapeviewport( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void winpush */
+
+static PyObject *
+gl_winpush(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	winpush( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void winpop */
+
+static PyObject *
+gl_winpop(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	winpop( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void foreground */
+
+static PyObject *
+gl_foreground(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	foreground( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endfullscrn */
+
+static PyObject *
+gl_endfullscrn(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endfullscrn( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endpupmode */
+
+static PyObject *
+gl_endpupmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endpupmode( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void fullscrn */
+
+static PyObject *
+gl_fullscrn(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	fullscrn( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pupmode */
+
+static PyObject *
+gl_pupmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	pupmode( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void winconstraints */
+
+static PyObject *
+gl_winconstraints(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	winconstraints( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pagecolor short s */
+
+static PyObject *
+gl_pagecolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	pagecolor( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void textcolor short s */
+
+static PyObject *
+gl_textcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	textcolor( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void color short s */
+
+static PyObject *
+gl_color(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	color( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curveit short s */
+
+static PyObject *
+gl_curveit(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	curveit( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void font short s */
+
+static PyObject *
+gl_font(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	font( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void linewidth short s */
+
+static PyObject *
+gl_linewidth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	linewidth( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setlinestyle short s */
+
+static PyObject *
+gl_setlinestyle(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	setlinestyle( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setmap short s */
+
+static PyObject *
+gl_setmap(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	setmap( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void swapinterval short s */
+
+static PyObject *
+gl_swapinterval(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	swapinterval( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void writemask short s */
+
+static PyObject *
+gl_writemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	writemask( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void textwritemask short s */
+
+static PyObject *
+gl_textwritemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	textwritemask( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void qdevice short s */
+
+static PyObject *
+gl_qdevice(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	qdevice( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void unqdevice short s */
+
+static PyObject *
+gl_unqdevice(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	unqdevice( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curvebasis short s */
+
+static PyObject *
+gl_curvebasis(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	curvebasis( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curveprecision short s */
+
+static PyObject *
+gl_curveprecision(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	curveprecision( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void loadname short s */
+
+static PyObject *
+gl_loadname(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	loadname( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void passthrough short s */
+
+static PyObject *
+gl_passthrough(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	passthrough( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pushname short s */
+
+static PyObject *
+gl_pushname(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	pushname( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setmonitor short s */
+
+static PyObject *
+gl_setmonitor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	setmonitor( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setshade short s */
+
+static PyObject *
+gl_setshade(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	setshade( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setpattern short s */
+
+static PyObject *
+gl_setpattern(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	setpattern( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pagewritemask short s */
+
+static PyObject *
+gl_pagewritemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	pagewritemask( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void callobj long s */
+
+static PyObject *
+gl_callobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	callobj( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void delobj long s */
+
+static PyObject *
+gl_delobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	delobj( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void editobj long s */
+
+static PyObject *
+gl_editobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	editobj( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void makeobj long s */
+
+static PyObject *
+gl_makeobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	makeobj( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void maketag long s */
+
+static PyObject *
+gl_maketag(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	maketag( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void chunksize long s */
+
+static PyObject *
+gl_chunksize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	chunksize( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void compactify long s */
+
+static PyObject *
+gl_compactify(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	compactify( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void deltag long s */
+
+static PyObject *
+gl_deltag(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	deltag( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lsrepeat long s */
+
+static PyObject *
+gl_lsrepeat(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	lsrepeat( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void objinsert long s */
+
+static PyObject *
+gl_objinsert(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	objinsert( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void objreplace long s */
+
+static PyObject *
+gl_objreplace(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	objreplace( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void winclose long s */
+
+static PyObject *
+gl_winclose(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	winclose( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void blanktime long s */
+
+static PyObject *
+gl_blanktime(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	blanktime( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void freepup long s */
+
+static PyObject *
+gl_freepup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	freepup( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void backbuffer long s */
+
+static PyObject *
+gl_backbuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	backbuffer( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void frontbuffer long s */
+
+static PyObject *
+gl_frontbuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	frontbuffer( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lsbackup long s */
+
+static PyObject *
+gl_lsbackup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	lsbackup( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void resetls long s */
+
+static PyObject *
+gl_resetls(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	resetls( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lampon long s */
+
+static PyObject *
+gl_lampon(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	lampon( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lampoff long s */
+
+static PyObject *
+gl_lampoff(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	lampoff( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setbell long s */
+
+static PyObject *
+gl_setbell(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	setbell( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void blankscreen long s */
+
+static PyObject *
+gl_blankscreen(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	blankscreen( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void depthcue long s */
+
+static PyObject *
+gl_depthcue(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	depthcue( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zbuffer long s */
+
+static PyObject *
+gl_zbuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	zbuffer( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void backface long s */
+
+static PyObject *
+gl_backface(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	backface( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmov2i long s long s */
+
+static PyObject *
+gl_cmov2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	cmov2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void draw2i long s long s */
+
+static PyObject *
+gl_draw2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	draw2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void move2i long s long s */
+
+static PyObject *
+gl_move2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	move2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnt2i long s long s */
+
+static PyObject *
+gl_pnt2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	pnt2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void patchbasis long s long s */
+
+static PyObject *
+gl_patchbasis(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	patchbasis( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void patchprecision long s long s */
+
+static PyObject *
+gl_patchprecision(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	patchprecision( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdr2i long s long s */
+
+static PyObject *
+gl_pdr2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	pdr2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmv2i long s long s */
+
+static PyObject *
+gl_pmv2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	pmv2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdr2i long s long s */
+
+static PyObject *
+gl_rpdr2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	rpdr2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmv2i long s long s */
+
+static PyObject *
+gl_rpmv2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	rpmv2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt2i long s long s */
+
+static PyObject *
+gl_xfpt2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	xfpt2i( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void objdelete long s long s */
+
+static PyObject *
+gl_objdelete(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	objdelete( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void patchcurves long s long s */
+
+static PyObject *
+gl_patchcurves(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	patchcurves( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void minsize long s long s */
+
+static PyObject *
+gl_minsize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	minsize( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void maxsize long s long s */
+
+static PyObject *
+gl_maxsize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	maxsize( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void keepaspect long s long s */
+
+static PyObject *
+gl_keepaspect(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	keepaspect( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void prefsize long s long s */
+
+static PyObject *
+gl_prefsize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	prefsize( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void stepunit long s long s */
+
+static PyObject *
+gl_stepunit(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	stepunit( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void fudge long s long s */
+
+static PyObject *
+gl_fudge(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	fudge( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void winmove long s long s */
+
+static PyObject *
+gl_winmove(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	winmove( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void attachcursor short s short s */
+
+static PyObject *
+gl_attachcursor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	attachcursor( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void deflinestyle short s short s */
+
+static PyObject *
+gl_deflinestyle(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	deflinestyle( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void noise short s short s */
+
+static PyObject *
+gl_noise(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	noise( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void picksize short s short s */
+
+static PyObject *
+gl_picksize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	picksize( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void qenter short s short s */
+
+static PyObject *
+gl_qenter(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	qenter( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setdepth short s short s */
+
+static PyObject *
+gl_setdepth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	setdepth( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmov2s short s short s */
+
+static PyObject *
+gl_cmov2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	cmov2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void draw2s short s short s */
+
+static PyObject *
+gl_draw2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	draw2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void move2s short s short s */
+
+static PyObject *
+gl_move2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	move2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdr2s short s short s */
+
+static PyObject *
+gl_pdr2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	pdr2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmv2s short s short s */
+
+static PyObject *
+gl_pmv2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	pmv2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnt2s short s short s */
+
+static PyObject *
+gl_pnt2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	pnt2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdr2s short s short s */
+
+static PyObject *
+gl_rdr2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	rdr2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmv2s short s short s */
+
+static PyObject *
+gl_rmv2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	rmv2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdr2s short s short s */
+
+static PyObject *
+gl_rpdr2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	rpdr2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmv2s short s short s */
+
+static PyObject *
+gl_rpmv2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	rpmv2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt2s short s short s */
+
+static PyObject *
+gl_xfpt2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	xfpt2s( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmov2 float s float s */
+
+static PyObject *
+gl_cmov2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	cmov2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void draw2 float s float s */
+
+static PyObject *
+gl_draw2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	draw2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void move2 float s float s */
+
+static PyObject *
+gl_move2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	move2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnt2 float s float s */
+
+static PyObject *
+gl_pnt2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	pnt2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdr2 float s float s */
+
+static PyObject *
+gl_pdr2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	pdr2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmv2 float s float s */
+
+static PyObject *
+gl_pmv2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	pmv2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdr2 float s float s */
+
+static PyObject *
+gl_rdr2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	rdr2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmv2 float s float s */
+
+static PyObject *
+gl_rmv2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	rmv2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdr2 float s float s */
+
+static PyObject *
+gl_rpdr2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	rpdr2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmv2 float s float s */
+
+static PyObject *
+gl_rpmv2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	rpmv2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt2 float s float s */
+
+static PyObject *
+gl_xfpt2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	xfpt2( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void loadmatrix float s[4*4] */
+
+static PyObject *
+gl_loadmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 * 4 , (float *) arg1))
+		return NULL;
+	loadmatrix( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void multmatrix float s[4*4] */
+
+static PyObject *
+gl_multmatrix(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 * 4 , (float *) arg1))
+		return NULL;
+	multmatrix( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void crv float s[3*4] */
+
+static PyObject *
+gl_crv(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 3 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 * 4 , (float *) arg1))
+		return NULL;
+	crv( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rcrv float s[4*4] */
+
+static PyObject *
+gl_rcrv(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 * 4 , (float *) arg1))
+		return NULL;
+	rcrv( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void addtopup long s char *s long s */
+
+static PyObject *
+gl_addtopup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	string arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetString(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	addtopup( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void charstr char *s */
+
+static PyObject *
+gl_charstr(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	charstr( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void getport char *s */
+
+static PyObject *
+gl_getport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	getport( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long strwidth char *s */
+
+static PyObject *
+gl_strwidth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	retval = strwidth( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* long winopen char *s */
+
+static PyObject *
+gl_winopen(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	retval = winopen( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void wintitle char *s */
+
+static PyObject *
+gl_wintitle(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	wintitle( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polf long s float s[3*arg1] */
+
+static PyObject *
+gl_polf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 * arg1 , (float *) arg2))
+		return NULL;
+	polf( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polf2 long s float s[2*arg1] */
+
+static PyObject *
+gl_polf2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 2 * arg1 , (float *) arg2))
+		return NULL;
+	polf2( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void poly long s float s[3*arg1] */
+
+static PyObject *
+gl_poly(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 * arg1 , (float *) arg2))
+		return NULL;
+	poly( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void poly2 long s float s[2*arg1] */
+
+static PyObject *
+gl_poly2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 2 * arg1 , (float *) arg2))
+		return NULL;
+	poly2( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void crvn long s float s[3*arg1] */
+
+static PyObject *
+gl_crvn(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 * arg1 , (float *) arg2))
+		return NULL;
+	crvn( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rcrvn long s float s[4*arg1] */
+
+static PyObject *
+gl_rcrvn(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 4 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 4;
+	if ((arg2 = (float(*)[4]) PyMem_NEW(float , 4 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 * arg1 , (float *) arg2))
+		return NULL;
+	rcrvn( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polf2i long s long s[2*arg1] */
+
+static PyObject *
+gl_polf2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 1, 0, 2 * arg1 , (long *) arg2))
+		return NULL;
+	polf2i( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polfi long s long s[3*arg1] */
+
+static PyObject *
+gl_polfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 1, 0, 3 * arg1 , (long *) arg2))
+		return NULL;
+	polfi( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void poly2i long s long s[2*arg1] */
+
+static PyObject *
+gl_poly2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 1, 0, 2 * arg1 , (long *) arg2))
+		return NULL;
+	poly2i( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polyi long s long s[3*arg1] */
+
+static PyObject *
+gl_polyi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 1, 0, 3 * arg1 , (long *) arg2))
+		return NULL;
+	polyi( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polf2s long s short s[2*arg1] */
+
+static PyObject *
+gl_polf2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, 2 * arg1 , (short *) arg2))
+		return NULL;
+	polf2s( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polfs long s short s[3*arg1] */
+
+static PyObject *
+gl_polfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, 3 * arg1 , (short *) arg2))
+		return NULL;
+	polfs( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polys long s short s[3*arg1] */
+
+static PyObject *
+gl_polys(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 3 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, 3 * arg1 , (short *) arg2))
+		return NULL;
+	polys( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void poly2s long s short s[2*arg1] */
+
+static PyObject *
+gl_poly2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 2 ] ;
+	if (!PyArg_GetLongArraySize(args, 1, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, 2 * arg1 , (short *) arg2))
+		return NULL;
+	poly2s( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void defcursor short s u_short s[128] */
+
+static PyObject *
+gl_defcursor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	unsigned short arg2 [ 128 ] ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShortArray(args, 2, 1, 128 , (short *) arg2))
+		return NULL;
+	defcursor( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void writepixels short s u_short s[arg1] */
+
+static PyObject *
+gl_writepixels(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	unsigned short * arg2 ;
+	if (!PyArg_GetShortArraySize(args, 1, 0, &arg1))
+		return NULL;
+	if ((arg2 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, arg1 , (short *) arg2))
+		return NULL;
+	writepixels( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void defbasis long s float s[4*4] */
+
+static PyObject *
+gl_defbasis(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float arg2 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 2, 1, 4 * 4 , (float *) arg2))
+		return NULL;
+	defbasis( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gewrite short s short s[arg1] */
+
+static PyObject *
+gl_gewrite(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short * arg2 ;
+	if (!PyArg_GetShortArraySize(args, 1, 0, &arg1))
+		return NULL;
+	if ((arg2 = PyMem_NEW(short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 1, 0, arg1 , arg2))
+		return NULL;
+	gewrite( arg1 , arg2 );
+	PyMem_DEL(arg2);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rotate short s char s */
+
+static PyObject *
+gl_rotate(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	char arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetChar(args, 2, 1, &arg2))
+		return NULL;
+	rotate( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rot float s char s */
+
+static PyObject *
+gl_rot(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	char arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetChar(args, 2, 1, &arg2))
+		return NULL;
+	rot( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circfi long s long s long s */
+
+static PyObject *
+gl_circfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	circfi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circi long s long s long s */
+
+static PyObject *
+gl_circi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	circi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmovi long s long s long s */
+
+static PyObject *
+gl_cmovi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	cmovi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void drawi long s long s long s */
+
+static PyObject *
+gl_drawi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	drawi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void movei long s long s long s */
+
+static PyObject *
+gl_movei(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	movei( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnti long s long s long s */
+
+static PyObject *
+gl_pnti(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	pnti( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void newtag long s long s long s */
+
+static PyObject *
+gl_newtag(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	newtag( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdri long s long s long s */
+
+static PyObject *
+gl_pdri(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	pdri( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmvi long s long s long s */
+
+static PyObject *
+gl_pmvi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	pmvi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdri long s long s long s */
+
+static PyObject *
+gl_rdri(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	rdri( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmvi long s long s long s */
+
+static PyObject *
+gl_rmvi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	rmvi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdri long s long s long s */
+
+static PyObject *
+gl_rpdri(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	rpdri( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmvi long s long s long s */
+
+static PyObject *
+gl_rpmvi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	rpmvi( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpti long s long s long s */
+
+static PyObject *
+gl_xfpti(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	xfpti( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circ float s float s float s */
+
+static PyObject *
+gl_circ(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	circ( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circf float s float s float s */
+
+static PyObject *
+gl_circf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	circf( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmov float s float s float s */
+
+static PyObject *
+gl_cmov(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	cmov( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void draw float s float s float s */
+
+static PyObject *
+gl_draw(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	draw( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void move float s float s float s */
+
+static PyObject *
+gl_move(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	move( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnt float s float s float s */
+
+static PyObject *
+gl_pnt(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	pnt( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void scale float s float s float s */
+
+static PyObject *
+gl_scale(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	scale( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void translate float s float s float s */
+
+static PyObject *
+gl_translate(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	translate( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdr float s float s float s */
+
+static PyObject *
+gl_pdr(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	pdr( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmv float s float s float s */
+
+static PyObject *
+gl_pmv(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	pmv( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdr float s float s float s */
+
+static PyObject *
+gl_rdr(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	rdr( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmv float s float s float s */
+
+static PyObject *
+gl_rmv(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	rmv( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdr float s float s float s */
+
+static PyObject *
+gl_rpdr(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	rpdr( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmv float s float s float s */
+
+static PyObject *
+gl_rpmv(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	rpmv( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt float s float s float s */
+
+static PyObject *
+gl_xfpt(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	if (!PyArg_GetFloat(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 3, 2, &arg3))
+		return NULL;
+	xfpt( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void RGBcolor short s short s short s */
+
+static PyObject *
+gl_RGBcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	RGBcolor( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void RGBwritemask short s short s short s */
+
+static PyObject *
+gl_RGBwritemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	RGBwritemask( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setcursor short s short s short s */
+
+static PyObject *
+gl_setcursor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	setcursor( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void tie short s short s short s */
+
+static PyObject *
+gl_tie(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	tie( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circfs short s short s short s */
+
+static PyObject *
+gl_circfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	circfs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void circs short s short s short s */
+
+static PyObject *
+gl_circs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	circs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cmovs short s short s short s */
+
+static PyObject *
+gl_cmovs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	cmovs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void draws short s short s short s */
+
+static PyObject *
+gl_draws(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	draws( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void moves short s short s short s */
+
+static PyObject *
+gl_moves(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	moves( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pdrs short s short s short s */
+
+static PyObject *
+gl_pdrs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	pdrs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pmvs short s short s short s */
+
+static PyObject *
+gl_pmvs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	pmvs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pnts short s short s short s */
+
+static PyObject *
+gl_pnts(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	pnts( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rdrs short s short s short s */
+
+static PyObject *
+gl_rdrs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	rdrs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rmvs short s short s short s */
+
+static PyObject *
+gl_rmvs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	rmvs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpdrs short s short s short s */
+
+static PyObject *
+gl_rpdrs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	rpdrs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpmvs short s short s short s */
+
+static PyObject *
+gl_rpmvs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	rpmvs( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpts short s short s short s */
+
+static PyObject *
+gl_xfpts(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	xfpts( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curorigin short s short s short s */
+
+static PyObject *
+gl_curorigin(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	curorigin( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cyclemap short s short s short s */
+
+static PyObject *
+gl_cyclemap(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	if (!PyArg_GetShort(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	cyclemap( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void patch float s[4*4] float s[4*4] float s[4*4] */
+
+static PyObject *
+gl_patch(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 4 ] ;
+	float arg2 [ 4 ] [ 4 ] ;
+	float arg3 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 3, 0, 4 * 4 , (float *) arg1))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 3, 1, 4 * 4 , (float *) arg2))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 3, 2, 4 * 4 , (float *) arg3))
+		return NULL;
+	patch( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splf long s float s[3*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 3 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 2, 0, 3 * arg1 , (float *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splf( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splf2 long s float s[2*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splf2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float (* arg2) [ 2 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 2, 0, 2 * arg1 , (float *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splf2( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splfi long s long s[3*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 3 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 2, 0, 3 * arg1 , (long *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splfi( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splf2i long s long s[2*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splf2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long (* arg2) [ 2 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetLongArray(args, 2, 0, 2 * arg1 , (long *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splf2i( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splfs long s short s[3*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 3 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 3;
+	if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 0, 3 * arg1 , (short *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splfs( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void splf2s long s short s[2*arg1] u_short s[arg1] */
+
+static PyObject *
+gl_splf2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short (* arg2) [ 2 ] ;
+	unsigned short * arg3 ;
+	if (!PyArg_GetLongArraySize(args, 2, 0, &arg1))
+		return NULL;
+	arg1 = arg1 / 2;
+	if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 0, 2 * arg1 , (short *) arg2))
+		return NULL;
+	if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetShortArray(args, 2, 1, arg1 , (short *) arg3))
+		return NULL;
+	splf2s( arg1 , arg2 , arg3 );
+	PyMem_DEL(arg2);
+	PyMem_DEL(arg3);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rpatch float s[4*4] float s[4*4] float s[4*4] float s[4*4] */
+
+static PyObject *
+gl_rpatch(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] [ 4 ] ;
+	float arg2 [ 4 ] [ 4 ] ;
+	float arg3 [ 4 ] [ 4 ] ;
+	float arg4 [ 4 ] [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 4, 0, 4 * 4 , (float *) arg1))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 4, 1, 4 * 4 , (float *) arg2))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 4, 2, 4 * 4 , (float *) arg3))
+		return NULL;
+	if (!PyArg_GetFloatArray(args, 4, 3, 4 * 4 , (float *) arg4))
+		return NULL;
+	rpatch( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void ortho2 float s float s float s float s */
+
+static PyObject *
+gl_ortho2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	ortho2( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rect float s float s float s float s */
+
+static PyObject *
+gl_rect(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	rect( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rectf float s float s float s float s */
+
+static PyObject *
+gl_rectf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	rectf( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt4 float s float s float s float s */
+
+static PyObject *
+gl_xfpt4(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	xfpt4( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void textport short s short s short s short s */
+
+static PyObject *
+gl_textport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	textport( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void mapcolor short s short s short s short s */
+
+static PyObject *
+gl_mapcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	mapcolor( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void scrmask short s short s short s short s */
+
+static PyObject *
+gl_scrmask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	scrmask( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setvaluator short s short s short s short s */
+
+static PyObject *
+gl_setvaluator(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	setvaluator( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void viewport short s short s short s short s */
+
+static PyObject *
+gl_viewport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	viewport( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void shaderange short s short s short s short s */
+
+static PyObject *
+gl_shaderange(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	shaderange( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt4s short s short s short s short s */
+
+static PyObject *
+gl_xfpt4s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	xfpt4s( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rectfi long s long s long s long s */
+
+static PyObject *
+gl_rectfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	rectfi( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void recti long s long s long s long s */
+
+static PyObject *
+gl_recti(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	recti( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void xfpt4i long s long s long s long s */
+
+static PyObject *
+gl_xfpt4i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	xfpt4i( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void prefposition long s long s long s long s */
+
+static PyObject *
+gl_prefposition(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	prefposition( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arc float s float s float s short s short s */
+
+static PyObject *
+gl_arc(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetFloat(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arc( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arcf float s float s float s short s short s */
+
+static PyObject *
+gl_arcf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetFloat(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arcf( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arcfi long s long s long s short s short s */
+
+static PyObject *
+gl_arcfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetLong(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arcfi( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arci long s long s long s short s short s */
+
+static PyObject *
+gl_arci(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetLong(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arci( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bbox2 short s short s float s float s float s float s */
+
+static PyObject *
+gl_bbox2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	float arg3 ;
+	float arg4 ;
+	float arg5 ;
+	float arg6 ;
+	if (!PyArg_GetShort(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 5, &arg6))
+		return NULL;
+	bbox2( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bbox2i short s short s long s long s long s long s */
+
+static PyObject *
+gl_bbox2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	long arg3 ;
+	long arg4 ;
+	long arg5 ;
+	long arg6 ;
+	if (!PyArg_GetShort(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetLong(args, 6, 5, &arg6))
+		return NULL;
+	bbox2i( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bbox2s short s short s short s short s short s short s */
+
+static PyObject *
+gl_bbox2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	short arg6 ;
+	if (!PyArg_GetShort(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 5, &arg6))
+		return NULL;
+	bbox2s( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void blink short s short s short s short s short s */
+
+static PyObject *
+gl_blink(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetShort(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	blink( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void ortho float s float s float s float s float s float s */
+
+static PyObject *
+gl_ortho(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	float arg5 ;
+	float arg6 ;
+	if (!PyArg_GetFloat(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 5, &arg6))
+		return NULL;
+	ortho( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void window float s float s float s float s float s float s */
+
+static PyObject *
+gl_window(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	float arg5 ;
+	float arg6 ;
+	if (!PyArg_GetFloat(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetFloat(args, 6, 5, &arg6))
+		return NULL;
+	window( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lookat float s float s float s float s float s float s short s */
+
+static PyObject *
+gl_lookat(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	float arg5 ;
+	float arg6 ;
+	short arg7 ;
+	if (!PyArg_GetFloat(args, 7, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 7, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 7, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 7, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetFloat(args, 7, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetFloat(args, 7, 5, &arg6))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 6, &arg7))
+		return NULL;
+	lookat( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void perspective short s float s float s float s */
+
+static PyObject *
+gl_perspective(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	perspective( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void polarview float s short s short s short s */
+
+static PyObject *
+gl_polarview(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	polarview( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arcfs short s short s short s short s short s */
+
+static PyObject *
+gl_arcfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetShort(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arcfs( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void arcs short s short s short s short s short s */
+
+static PyObject *
+gl_arcs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	if (!PyArg_GetShort(args, 5, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 5, 4, &arg5))
+		return NULL;
+	arcs( arg1 , arg2 , arg3 , arg4 , arg5 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rectcopy short s short s short s short s short s short s */
+
+static PyObject *
+gl_rectcopy(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	short arg6 ;
+	if (!PyArg_GetShort(args, 6, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetShort(args, 6, 5, &arg6))
+		return NULL;
+	rectcopy( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void RGBcursor short s short s short s short s short s short s short s */
+
+static PyObject *
+gl_RGBcursor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	short arg6 ;
+	short arg7 ;
+	if (!PyArg_GetShort(args, 7, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 5, &arg6))
+		return NULL;
+	if (!PyArg_GetShort(args, 7, 6, &arg7))
+		return NULL;
+	RGBcursor( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long getbutton short s */
+
+static PyObject *
+gl_getbutton(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	retval = getbutton( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* long getcmmode */
+
+static PyObject *
+gl_getcmmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getcmmode( );
+	return mknewlongobject(retval);
+}
+
+/* long getlsbackup */
+
+static PyObject *
+gl_getlsbackup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getlsbackup( );
+	return mknewlongobject(retval);
+}
+
+/* long getresetls */
+
+static PyObject *
+gl_getresetls(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getresetls( );
+	return mknewlongobject(retval);
+}
+
+/* long getdcm */
+
+static PyObject *
+gl_getdcm(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getdcm( );
+	return mknewlongobject(retval);
+}
+
+/* long getzbuffer */
+
+static PyObject *
+gl_getzbuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getzbuffer( );
+	return mknewlongobject(retval);
+}
+
+/* long ismex */
+
+static PyObject *
+gl_ismex(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = ismex( );
+	return mknewlongobject(retval);
+}
+
+/* long isobj long s */
+
+static PyObject *
+gl_isobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = isobj( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* long isqueued short s */
+
+static PyObject *
+gl_isqueued(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	retval = isqueued( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* long istag long s */
+
+static PyObject *
+gl_istag(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = istag( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* long genobj */
+
+static PyObject *
+gl_genobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = genobj( );
+	return mknewlongobject(retval);
+}
+
+/* long gentag */
+
+static PyObject *
+gl_gentag(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = gentag( );
+	return mknewlongobject(retval);
+}
+
+/* long getbuffer */
+
+static PyObject *
+gl_getbuffer(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getbuffer( );
+	return mknewlongobject(retval);
+}
+
+/* long getcolor */
+
+static PyObject *
+gl_getcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getcolor( );
+	return mknewlongobject(retval);
+}
+
+/* long getdisplaymode */
+
+static PyObject *
+gl_getdisplaymode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getdisplaymode( );
+	return mknewlongobject(retval);
+}
+
+/* long getfont */
+
+static PyObject *
+gl_getfont(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getfont( );
+	return mknewlongobject(retval);
+}
+
+/* long getheight */
+
+static PyObject *
+gl_getheight(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getheight( );
+	return mknewlongobject(retval);
+}
+
+/* long gethitcode */
+
+static PyObject *
+gl_gethitcode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = gethitcode( );
+	return mknewlongobject(retval);
+}
+
+/* long getlstyle */
+
+static PyObject *
+gl_getlstyle(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getlstyle( );
+	return mknewlongobject(retval);
+}
+
+/* long getlwidth */
+
+static PyObject *
+gl_getlwidth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getlwidth( );
+	return mknewlongobject(retval);
+}
+
+/* long getmap */
+
+static PyObject *
+gl_getmap(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getmap( );
+	return mknewlongobject(retval);
+}
+
+/* long getplanes */
+
+static PyObject *
+gl_getplanes(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getplanes( );
+	return mknewlongobject(retval);
+}
+
+/* long getwritemask */
+
+static PyObject *
+gl_getwritemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getwritemask( );
+	return mknewlongobject(retval);
+}
+
+/* long qtest */
+
+static PyObject *
+gl_qtest(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = qtest( );
+	return mknewlongobject(retval);
+}
+
+/* long getlsrepeat */
+
+static PyObject *
+gl_getlsrepeat(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getlsrepeat( );
+	return mknewlongobject(retval);
+}
+
+/* long getmonitor */
+
+static PyObject *
+gl_getmonitor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getmonitor( );
+	return mknewlongobject(retval);
+}
+
+/* long getopenobj */
+
+static PyObject *
+gl_getopenobj(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getopenobj( );
+	return mknewlongobject(retval);
+}
+
+/* long getpattern */
+
+static PyObject *
+gl_getpattern(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getpattern( );
+	return mknewlongobject(retval);
+}
+
+/* long winget */
+
+static PyObject *
+gl_winget(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = winget( );
+	return mknewlongobject(retval);
+}
+
+/* long winattach */
+
+static PyObject *
+gl_winattach(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = winattach( );
+	return mknewlongobject(retval);
+}
+
+/* long getothermonitor */
+
+static PyObject *
+gl_getothermonitor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getothermonitor( );
+	return mknewlongobject(retval);
+}
+
+/* long newpup */
+
+static PyObject *
+gl_newpup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = newpup( );
+	return mknewlongobject(retval);
+}
+
+/* long getvaluator short s */
+
+static PyObject *
+gl_getvaluator(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	short arg1 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	retval = getvaluator( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void winset long s */
+
+static PyObject *
+gl_winset(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	winset( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long dopup long s */
+
+static PyObject *
+gl_dopup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = dopup( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void getdepth short r short r */
+
+static PyObject *
+gl_getdepth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	getdepth( & arg1 , & arg2 );
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  return v;
+	}
+}
+
+/* void getcpos short r short r */
+
+static PyObject *
+gl_getcpos(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	getcpos( & arg1 , & arg2 );
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  return v;
+	}
+}
+
+/* void getsize long r long r */
+
+static PyObject *
+gl_getsize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	getsize( & arg1 , & arg2 );
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewlongobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewlongobject(arg2));
+	  return v;
+	}
+}
+
+/* void getorigin long r long r */
+
+static PyObject *
+gl_getorigin(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	getorigin( & arg1 , & arg2 );
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewlongobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewlongobject(arg2));
+	  return v;
+	}
+}
+
+/* void getviewport short r short r short r short r */
+
+static PyObject *
+gl_getviewport(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	getviewport( & arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 4 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg3));
+	  PyTuple_SetItem(v, 3, mknewshortobject(arg4));
+	  return v;
+	}
+}
+
+/* void gettp short r short r short r short r */
+
+static PyObject *
+gl_gettp(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	gettp( & arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 4 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg3));
+	  PyTuple_SetItem(v, 3, mknewshortobject(arg4));
+	  return v;
+	}
+}
+
+/* void getgpos float r float r float r float r */
+
+static PyObject *
+gl_getgpos(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	getgpos( & arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 4 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewfloatobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewfloatobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewfloatobject(arg3));
+	  PyTuple_SetItem(v, 3, mknewfloatobject(arg4));
+	  return v;
+	}
+}
+
+/* void winposition long s long s long s long s */
+
+static PyObject *
+gl_winposition(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	winposition( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gRGBcolor short r short r short r */
+
+static PyObject *
+gl_gRGBcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	gRGBcolor( & arg1 , & arg2 , & arg3 );
+	{ PyObject *v = PyTuple_New( 3 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg3));
+	  return v;
+	}
+}
+
+/* void gRGBmask short r short r short r */
+
+static PyObject *
+gl_gRGBmask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	gRGBmask( & arg1 , & arg2 , & arg3 );
+	{ PyObject *v = PyTuple_New( 3 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg3));
+	  return v;
+	}
+}
+
+/* void getscrmask short r short r short r short r */
+
+static PyObject *
+gl_getscrmask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	getscrmask( & arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 4 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg3));
+	  PyTuple_SetItem(v, 3, mknewshortobject(arg4));
+	  return v;
+	}
+}
+
+/* void getmcolor short s short r short r short r */
+
+static PyObject *
+gl_getmcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 1, 0, &arg1))
+		return NULL;
+	getmcolor( arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 3 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg2));
+	  PyTuple_SetItem(v, 1, mknewshortobject(arg3));
+	  PyTuple_SetItem(v, 2, mknewshortobject(arg4));
+	  return v;
+	}
+}
+
+/* void mapw long s short s short s float r float r float r
+   float r float r float r */
+
+static PyObject *
+gl_mapw(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short arg2 ;
+	short arg3 ;
+	float arg4 ;
+	float arg5 ;
+	float arg6 ;
+	float arg7 ;
+	float arg8 ;
+	float arg9 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	mapw( arg1, arg2, arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9 );
+	{ PyObject *v = PyTuple_New( 6 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewfloatobject(arg4));
+	  PyTuple_SetItem(v, 1, mknewfloatobject(arg5));
+	  PyTuple_SetItem(v, 2, mknewfloatobject(arg6));
+	  PyTuple_SetItem(v, 3, mknewfloatobject(arg7));
+	  PyTuple_SetItem(v, 4, mknewfloatobject(arg8));
+	  PyTuple_SetItem(v, 5, mknewfloatobject(arg9));
+	  return v;
+	}
+}
+
+/* void mapw2 long s short s short s float r float r */
+
+static PyObject *
+gl_mapw2(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	short arg2 ;
+	short arg3 ;
+	float arg4 ;
+	float arg5 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 3, 2, &arg3))
+		return NULL;
+	mapw2( arg1 , arg2 , arg3 , & arg4 , & arg5 );
+	{ PyObject *v = PyTuple_New( 2 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewfloatobject(arg4));
+	  PyTuple_SetItem(v, 1, mknewfloatobject(arg5));
+	  return v;
+	}
+}
+
+/* void getcursor short r u_short r u_short r long r */
+
+static PyObject *
+gl_getcursor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	unsigned short arg2 ;
+	unsigned short arg3 ;
+	long arg4 ;
+	getcursor( & arg1 , & arg2 , & arg3 , & arg4 );
+	{ PyObject *v = PyTuple_New( 4 );
+	  if (v == NULL) return NULL;
+	  PyTuple_SetItem(v, 0, mknewshortobject(arg1));
+	  PyTuple_SetItem(v, 1, mknewshortobject((short) arg2));
+	  PyTuple_SetItem(v, 2, mknewshortobject((short) arg3));
+	  PyTuple_SetItem(v, 3, mknewlongobject(arg4));
+	  return v;
+	}
+}
+
+/* void cmode */
+
+static PyObject *
+gl_cmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	cmode( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void concave long s */
+
+static PyObject *
+gl_concave(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	concave( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void curstype long s */
+
+static PyObject *
+gl_curstype(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	curstype( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void drawmode long s */
+
+static PyObject *
+gl_drawmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	drawmode( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void gammaramp short s[256] short s[256] short s[256] */
+
+static PyObject *
+gl_gammaramp(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 256 ] ;
+	short arg2 [ 256 ] ;
+	short arg3 [ 256 ] ;
+	if (!PyArg_GetShortArray(args, 3, 0, 256 , arg1))
+		return NULL;
+	if (!PyArg_GetShortArray(args, 3, 1, 256 , arg2))
+		return NULL;
+	if (!PyArg_GetShortArray(args, 3, 2, 256 , arg3))
+		return NULL;
+	gammaramp( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long getbackface */
+
+static PyObject *
+gl_getbackface(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getbackface( );
+	return mknewlongobject(retval);
+}
+
+/* long getdescender */
+
+static PyObject *
+gl_getdescender(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getdescender( );
+	return mknewlongobject(retval);
+}
+
+/* long getdrawmode */
+
+static PyObject *
+gl_getdrawmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getdrawmode( );
+	return mknewlongobject(retval);
+}
+
+/* long getmmode */
+
+static PyObject *
+gl_getmmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getmmode( );
+	return mknewlongobject(retval);
+}
+
+/* long getsm */
+
+static PyObject *
+gl_getsm(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = getsm( );
+	return mknewlongobject(retval);
+}
+
+/* long getvideo long s */
+
+static PyObject *
+gl_getvideo(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = getvideo( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void imakebackground */
+
+static PyObject *
+gl_imakebackground(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	imakebackground( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lmbind short s short s */
+
+static PyObject *
+gl_lmbind(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	if (!PyArg_GetShort(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 2, 1, &arg2))
+		return NULL;
+	lmbind( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lmdef long s long s long s float s[arg3] */
+
+static PyObject *
+gl_lmdef(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	float * arg4 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLongArraySize(args, 3, 2, &arg3))
+		return NULL;
+	if ((arg4 = PyMem_NEW(float , arg3 )) == NULL)
+		return PyErr_NoMemory();
+	if (!PyArg_GetFloatArray(args, 3, 2, arg3 , arg4))
+		return NULL;
+	lmdef( arg1 , arg2 , arg3 , arg4 );
+	PyMem_DEL(arg4);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void mmode long s */
+
+static PyObject *
+gl_mmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	mmode( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void normal float s[3] */
+
+static PyObject *
+gl_normal(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 3 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	normal( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void overlay long s */
+
+static PyObject *
+gl_overlay(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	overlay( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void RGBrange short s short s short s
+   short s short s short s short s short s */
+
+static PyObject *
+gl_RGBrange(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	short arg6 ;
+	short arg7 ;
+	short arg8 ;
+	if (!PyArg_GetShort(args, 8, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 5, &arg6))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 6, &arg7))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 7, &arg8))
+		return NULL;
+	RGBrange( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setvideo long s long s */
+
+static PyObject *
+gl_setvideo(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	setvideo( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void shademodel long s */
+
+static PyObject *
+gl_shademodel(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	shademodel( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void underlay long s */
+
+static PyObject *
+gl_underlay(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	underlay( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgnclosedline */
+
+static PyObject *
+gl_bgnclosedline(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgnclosedline( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgnline */
+
+static PyObject *
+gl_bgnline(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgnline( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgnpoint */
+
+static PyObject *
+gl_bgnpoint(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgnpoint( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgnpolygon */
+
+static PyObject *
+gl_bgnpolygon(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgnpolygon( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgnsurface */
+
+static PyObject *
+gl_bgnsurface(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgnsurface( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgntmesh */
+
+static PyObject *
+gl_bgntmesh(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgntmesh( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void bgntrim */
+
+static PyObject *
+gl_bgntrim(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	bgntrim( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endclosedline */
+
+static PyObject *
+gl_endclosedline(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endclosedline( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endline */
+
+static PyObject *
+gl_endline(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endline( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endpoint */
+
+static PyObject *
+gl_endpoint(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endpoint( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endpolygon */
+
+static PyObject *
+gl_endpolygon(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endpolygon( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endsurface */
+
+static PyObject *
+gl_endsurface(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endsurface( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endtmesh */
+
+static PyObject *
+gl_endtmesh(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endtmesh( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void endtrim */
+
+static PyObject *
+gl_endtrim(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	endtrim( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void blendfunction long s long s */
+
+static PyObject *
+gl_blendfunction(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	blendfunction( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c3f float s[3] */
+
+static PyObject *
+gl_c3f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 3 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	c3f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c3i long s[3] */
+
+static PyObject *
+gl_c3i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 [ 3 ] ;
+	if (!PyArg_GetLongArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	c3i( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c3s short s[3] */
+
+static PyObject *
+gl_c3s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 3 ] ;
+	if (!PyArg_GetShortArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	c3s( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c4f float s[4] */
+
+static PyObject *
+gl_c4f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	c4f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c4i long s[4] */
+
+static PyObject *
+gl_c4i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 [ 4 ] ;
+	if (!PyArg_GetLongArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	c4i( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void c4s short s[4] */
+
+static PyObject *
+gl_c4s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 4 ] ;
+	if (!PyArg_GetShortArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	c4s( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void colorf float s */
+
+static PyObject *
+gl_colorf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	if (!PyArg_GetFloat(args, 1, 0, &arg1))
+		return NULL;
+	colorf( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void cpack long s */
+
+static PyObject *
+gl_cpack(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	cpack( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void czclear long s long s */
+
+static PyObject *
+gl_czclear(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	czclear( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void dglclose long s */
+
+static PyObject *
+gl_dglclose(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	dglclose( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long dglopen char *s long s */
+
+static PyObject *
+gl_dglopen(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	string arg1 ;
+	long arg2 ;
+	if (!PyArg_GetString(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	retval = dglopen( arg1 , arg2 );
+	return mknewlongobject(retval);
+}
+
+/* long getgdesc long s */
+
+static PyObject *
+gl_getgdesc(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = getgdesc( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void getnurbsproperty long s float r */
+
+static PyObject *
+gl_getnurbsproperty(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float arg2 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	getnurbsproperty( arg1 , & arg2 );
+	return mknewfloatobject(arg2);
+}
+
+/* void glcompat long s long s */
+
+static PyObject *
+gl_glcompat(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	glcompat( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void iconsize long s long s */
+
+static PyObject *
+gl_iconsize(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	iconsize( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void icontitle char *s */
+
+static PyObject *
+gl_icontitle(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	string arg1 ;
+	if (!PyArg_GetString(args, 1, 0, &arg1))
+		return NULL;
+	icontitle( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lRGBrange short s short s short s short s
+   short s short s long s long s */
+
+static PyObject *
+gl_lRGBrange(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	short arg5 ;
+	short arg6 ;
+	long arg7 ;
+	long arg8 ;
+	if (!PyArg_GetShort(args, 8, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 3, &arg4))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 4, &arg5))
+		return NULL;
+	if (!PyArg_GetShort(args, 8, 5, &arg6))
+		return NULL;
+	if (!PyArg_GetLong(args, 8, 6, &arg7))
+		return NULL;
+	if (!PyArg_GetLong(args, 8, 7, &arg8))
+		return NULL;
+	lRGBrange( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void linesmooth long s */
+
+static PyObject *
+gl_linesmooth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	linesmooth( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lmcolor long s */
+
+static PyObject *
+gl_lmcolor(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	lmcolor( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void logicop long s */
+
+static PyObject *
+gl_logicop(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	logicop( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lsetdepth long s long s */
+
+static PyObject *
+gl_lsetdepth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	lsetdepth( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void lshaderange short s short s long s long s */
+
+static PyObject *
+gl_lshaderange(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	lshaderange( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void n3f float s[3] */
+
+static PyObject *
+gl_n3f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 3 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	n3f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void noborder */
+
+static PyObject *
+gl_noborder(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	noborder( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pntsmooth long s */
+
+static PyObject *
+gl_pntsmooth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	pntsmooth( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void readsource long s */
+
+static PyObject *
+gl_readsource(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	readsource( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void rectzoom float s float s */
+
+static PyObject *
+gl_rectzoom(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	if (!PyArg_GetFloat(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	rectzoom( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sbox float s float s float s float s */
+
+static PyObject *
+gl_sbox(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	sbox( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sboxi long s long s long s long s */
+
+static PyObject *
+gl_sboxi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	sboxi( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sboxs short s short s short s short s */
+
+static PyObject *
+gl_sboxs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	sboxs( arg1, arg2, arg3, arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sboxf float s float s float s float s */
+
+static PyObject *
+gl_sboxf(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 ;
+	float arg2 ;
+	float arg3 ;
+	float arg4 ;
+	if (!PyArg_GetFloat(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetFloat(args, 4, 3, &arg4))
+		return NULL;
+	sboxf( arg1, arg2, arg3, arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sboxfi long s long s long s long s */
+
+static PyObject *
+gl_sboxfi(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	long arg4 ;
+	if (!PyArg_GetLong(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetLong(args, 4, 3, &arg4))
+		return NULL;
+	sboxfi( arg1, arg2, arg3, arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void sboxfs short s short s short s short s */
+
+static PyObject *
+gl_sboxfs(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 ;
+	short arg2 ;
+	short arg3 ;
+	short arg4 ;
+	if (!PyArg_GetShort(args, 4, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 2, &arg3))
+		return NULL;
+	if (!PyArg_GetShort(args, 4, 3, &arg4))
+		return NULL;
+	sboxfs( arg1 , arg2 , arg3 , arg4 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setnurbsproperty long s float s */
+
+static PyObject *
+gl_setnurbsproperty(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	float arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetFloat(args, 2, 1, &arg2))
+		return NULL;
+	setnurbsproperty( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void setpup long s long s long s */
+
+static PyObject *
+gl_setpup(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	long arg3 ;
+	if (!PyArg_GetLong(args, 3, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 1, &arg2))
+		return NULL;
+	if (!PyArg_GetLong(args, 3, 2, &arg3))
+		return NULL;
+	setpup( arg1 , arg2 , arg3 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void smoothline long s */
+
+static PyObject *
+gl_smoothline(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	smoothline( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void subpixel long s */
+
+static PyObject *
+gl_subpixel(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	subpixel( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void swaptmesh */
+
+static PyObject *
+gl_swaptmesh(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	swaptmesh( );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long swinopen long s */
+
+static PyObject *
+gl_swinopen(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = swinopen( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void v2f float s[2] */
+
+static PyObject *
+gl_v2f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 2 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 2 , arg1))
+		return NULL;
+	v2f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v2i long s[2] */
+
+static PyObject *
+gl_v2i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 [ 2 ] ;
+	if (!PyArg_GetLongArray(args, 1, 0, 2 , arg1))
+		return NULL;
+	v2i( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v2s short s[2] */
+
+static PyObject *
+gl_v2s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 2 ] ;
+	if (!PyArg_GetShortArray(args, 1, 0, 2 , arg1))
+		return NULL;
+	v2s( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v3f float s[3] */
+
+static PyObject *
+gl_v3f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 3 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	v3f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v3i long s[3] */
+
+static PyObject *
+gl_v3i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 [ 3 ] ;
+	if (!PyArg_GetLongArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	v3i( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v3s short s[3] */
+
+static PyObject *
+gl_v3s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 3 ] ;
+	if (!PyArg_GetShortArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	v3s( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v4f float s[4] */
+
+static PyObject *
+gl_v4f(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	float arg1 [ 4 ] ;
+	if (!PyArg_GetFloatArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	v4f( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v4i long s[4] */
+
+static PyObject *
+gl_v4i(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 [ 4 ] ;
+	if (!PyArg_GetLongArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	v4i( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v4s short s[4] */
+
+static PyObject *
+gl_v4s(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	short arg1 [ 4 ] ;
+	if (!PyArg_GetShortArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	v4s( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void videocmd long s */
+
+static PyObject *
+gl_videocmd(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	videocmd( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long windepth long s */
+
+static PyObject *
+gl_windepth(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	retval = windepth( arg1 );
+	return mknewlongobject(retval);
+}
+
+/* void wmpack long s */
+
+static PyObject *
+gl_wmpack(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	wmpack( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zdraw long s */
+
+static PyObject *
+gl_zdraw(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	zdraw( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zfunction long s */
+
+static PyObject *
+gl_zfunction(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	zfunction( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zsource long s */
+
+static PyObject *
+gl_zsource(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	zsource( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void zwritemask long s */
+
+static PyObject *
+gl_zwritemask(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	zwritemask( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v2d double s[2] */
+
+static PyObject *
+gl_v2d(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	double arg1 [ 2 ] ;
+	if (!PyArg_GetDoubleArray(args, 1, 0, 2 , arg1))
+		return NULL;
+	v2d( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v3d double s[3] */
+
+static PyObject *
+gl_v3d(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	double arg1 [ 3 ] ;
+	if (!PyArg_GetDoubleArray(args, 1, 0, 3 , arg1))
+		return NULL;
+	v3d( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void v4d double s[4] */
+
+static PyObject *
+gl_v4d(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	double arg1 [ 4 ] ;
+	if (!PyArg_GetDoubleArray(args, 1, 0, 4 , arg1))
+		return NULL;
+	v4d( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* void pixmode long s long s */
+
+static PyObject *
+gl_pixmode(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	long arg2 ;
+	if (!PyArg_GetLong(args, 2, 0, &arg1))
+		return NULL;
+	if (!PyArg_GetLong(args, 2, 1, &arg2))
+		return NULL;
+	pixmode( arg1 , arg2 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* long qgetfd */
+
+static PyObject *
+gl_qgetfd(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long retval;
+	retval = qgetfd( );
+	return mknewlongobject(retval);
+}
+
+/* void dither long s */
+
+static PyObject *
+gl_dither(self, args)
+	PyObject *self;
+	PyObject *args;
+{
+	long arg1 ;
+	if (!PyArg_GetLong(args, 1, 0, &arg1))
+		return NULL;
+	dither( arg1 );
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyMethodDef gl_methods[] = {
+	{"qread", gl_qread},
+	{"varray", gl_varray},
+	{"nvarray", gl_nvarray},
+	{"vnarray", gl_vnarray},
+	{"nurbssurface", gl_nurbssurface},
+	{"nurbscurve", gl_nurbscurve},
+	{"pwlcurve", gl_pwlcurve},
+	{"pick", gl_pick},
+	{"endpick", gl_endpick},
+	{"gselect", gl_gselect},
+	{"endselect", gl_endselect},
+	{"getmatrix", gl_getmatrix},
+	{"altgetmatrix", gl_altgetmatrix},
+	{"lrectwrite", gl_lrectwrite},
+	{"lrectread", gl_lrectread},
+	{"readdisplay", gl_readdisplay},
+	{"packrect", gl_packrect},
+	{"unpackrect", gl_unpackrect},
+	{"gversion", gl_gversion},
+	{"getshade", gl_getshade},
+	{"devport", gl_devport},
+	{"rdr2i", gl_rdr2i},
+	{"rectfs", gl_rectfs},
+	{"rects", gl_rects},
+	{"rmv2i", gl_rmv2i},
+	{"noport", gl_noport},
+	{"popviewport", gl_popviewport},
+	{"clear", gl_clear},
+	{"clearhitcode", gl_clearhitcode},
+	{"closeobj", gl_closeobj},
+	{"cursoff", gl_cursoff},
+	{"curson", gl_curson},
+	{"doublebuffer", gl_doublebuffer},
+	{"finish", gl_finish},
+	{"gconfig", gl_gconfig},
+	{"ginit", gl_ginit},
+	{"greset", gl_greset},
+	{"multimap", gl_multimap},
+	{"onemap", gl_onemap},
+	{"popattributes", gl_popattributes},
+	{"popmatrix", gl_popmatrix},
+	{"pushattributes", gl_pushattributes},
+	{"pushmatrix", gl_pushmatrix},
+	{"pushviewport", gl_pushviewport},
+	{"qreset", gl_qreset},
+	{"RGBmode", gl_RGBmode},
+	{"singlebuffer", gl_singlebuffer},
+	{"swapbuffers", gl_swapbuffers},
+	{"gsync", gl_gsync},
+	{"gflush", gl_gflush},
+	{"tpon", gl_tpon},
+	{"tpoff", gl_tpoff},
+	{"clkon", gl_clkon},
+	{"clkoff", gl_clkoff},
+	{"ringbell", gl_ringbell},
+	{"gbegin", gl_gbegin},
+	{"textinit", gl_textinit},
+	{"initnames", gl_initnames},
+	{"pclos", gl_pclos},
+	{"popname", gl_popname},
+	{"spclos", gl_spclos},
+	{"zclear", gl_zclear},
+	{"screenspace", gl_screenspace},
+	{"reshapeviewport", gl_reshapeviewport},
+	{"winpush", gl_winpush},
+	{"winpop", gl_winpop},
+	{"foreground", gl_foreground},
+	{"endfullscrn", gl_endfullscrn},
+	{"endpupmode", gl_endpupmode},
+	{"fullscrn", gl_fullscrn},
+	{"pupmode", gl_pupmode},
+	{"winconstraints", gl_winconstraints},
+	{"pagecolor", gl_pagecolor},
+	{"textcolor", gl_textcolor},
+	{"color", gl_color},
+	{"curveit", gl_curveit},
+	{"font", gl_font},
+	{"linewidth", gl_linewidth},
+	{"setlinestyle", gl_setlinestyle},
+	{"setmap", gl_setmap},
+	{"swapinterval", gl_swapinterval},
+	{"writemask", gl_writemask},
+	{"textwritemask", gl_textwritemask},
+	{"qdevice", gl_qdevice},
+	{"unqdevice", gl_unqdevice},
+	{"curvebasis", gl_curvebasis},
+	{"curveprecision", gl_curveprecision},
+	{"loadname", gl_loadname},
+	{"passthrough", gl_passthrough},
+	{"pushname", gl_pushname},
+	{"setmonitor", gl_setmonitor},
+	{"setshade", gl_setshade},
+	{"setpattern", gl_setpattern},
+	{"pagewritemask", gl_pagewritemask},
+	{"callobj", gl_callobj},
+	{"delobj", gl_delobj},
+	{"editobj", gl_editobj},
+	{"makeobj", gl_makeobj},
+	{"maketag", gl_maketag},
+	{"chunksize", gl_chunksize},
+	{"compactify", gl_compactify},
+	{"deltag", gl_deltag},
+	{"lsrepeat", gl_lsrepeat},
+	{"objinsert", gl_objinsert},
+	{"objreplace", gl_objreplace},
+	{"winclose", gl_winclose},
+	{"blanktime", gl_blanktime},
+	{"freepup", gl_freepup},
+	{"backbuffer", gl_backbuffer},
+	{"frontbuffer", gl_frontbuffer},
+	{"lsbackup", gl_lsbackup},
+	{"resetls", gl_resetls},
+	{"lampon", gl_lampon},
+	{"lampoff", gl_lampoff},
+	{"setbell", gl_setbell},
+	{"blankscreen", gl_blankscreen},
+	{"depthcue", gl_depthcue},
+	{"zbuffer", gl_zbuffer},
+	{"backface", gl_backface},
+	{"cmov2i", gl_cmov2i},
+	{"draw2i", gl_draw2i},
+	{"move2i", gl_move2i},
+	{"pnt2i", gl_pnt2i},
+	{"patchbasis", gl_patchbasis},
+	{"patchprecision", gl_patchprecision},
+	{"pdr2i", gl_pdr2i},
+	{"pmv2i", gl_pmv2i},
+	{"rpdr2i", gl_rpdr2i},
+	{"rpmv2i", gl_rpmv2i},
+	{"xfpt2i", gl_xfpt2i},
+	{"objdelete", gl_objdelete},
+	{"patchcurves", gl_patchcurves},
+	{"minsize", gl_minsize},
+	{"maxsize", gl_maxsize},
+	{"keepaspect", gl_keepaspect},
+	{"prefsize", gl_prefsize},
+	{"stepunit", gl_stepunit},
+	{"fudge", gl_fudge},
+	{"winmove", gl_winmove},
+	{"attachcursor", gl_attachcursor},
+	{"deflinestyle", gl_deflinestyle},
+	{"noise", gl_noise},
+	{"picksize", gl_picksize},
+	{"qenter", gl_qenter},
+	{"setdepth", gl_setdepth},
+	{"cmov2s", gl_cmov2s},
+	{"draw2s", gl_draw2s},
+	{"move2s", gl_move2s},
+	{"pdr2s", gl_pdr2s},
+	{"pmv2s", gl_pmv2s},
+	{"pnt2s", gl_pnt2s},
+	{"rdr2s", gl_rdr2s},
+	{"rmv2s", gl_rmv2s},
+	{"rpdr2s", gl_rpdr2s},
+	{"rpmv2s", gl_rpmv2s},
+	{"xfpt2s", gl_xfpt2s},
+	{"cmov2", gl_cmov2},
+	{"draw2", gl_draw2},
+	{"move2", gl_move2},
+	{"pnt2", gl_pnt2},
+	{"pdr2", gl_pdr2},
+	{"pmv2", gl_pmv2},
+	{"rdr2", gl_rdr2},
+	{"rmv2", gl_rmv2},
+	{"rpdr2", gl_rpdr2},
+	{"rpmv2", gl_rpmv2},
+	{"xfpt2", gl_xfpt2},
+	{"loadmatrix", gl_loadmatrix},
+	{"multmatrix", gl_multmatrix},
+	{"crv", gl_crv},
+	{"rcrv", gl_rcrv},
+	{"addtopup", gl_addtopup},
+	{"charstr", gl_charstr},
+	{"getport", gl_getport},
+	{"strwidth", gl_strwidth},
+	{"winopen", gl_winopen},
+	{"wintitle", gl_wintitle},
+	{"polf", gl_polf},
+	{"polf2", gl_polf2},
+	{"poly", gl_poly},
+	{"poly2", gl_poly2},
+	{"crvn", gl_crvn},
+	{"rcrvn", gl_rcrvn},
+	{"polf2i", gl_polf2i},
+	{"polfi", gl_polfi},
+	{"poly2i", gl_poly2i},
+	{"polyi", gl_polyi},
+	{"polf2s", gl_polf2s},
+	{"polfs", gl_polfs},
+	{"polys", gl_polys},
+	{"poly2s", gl_poly2s},
+	{"defcursor", gl_defcursor},
+	{"writepixels", gl_writepixels},
+	{"defbasis", gl_defbasis},
+	{"gewrite", gl_gewrite},
+	{"rotate", gl_rotate},
+	{"rot", gl_rot},
+	{"circfi", gl_circfi},
+	{"circi", gl_circi},
+	{"cmovi", gl_cmovi},
+	{"drawi", gl_drawi},
+	{"movei", gl_movei},
+	{"pnti", gl_pnti},
+	{"newtag", gl_newtag},
+	{"pdri", gl_pdri},
+	{"pmvi", gl_pmvi},
+	{"rdri", gl_rdri},
+	{"rmvi", gl_rmvi},
+	{"rpdri", gl_rpdri},
+	{"rpmvi", gl_rpmvi},
+	{"xfpti", gl_xfpti},
+	{"circ", gl_circ},
+	{"circf", gl_circf},
+	{"cmov", gl_cmov},
+	{"draw", gl_draw},
+	{"move", gl_move},
+	{"pnt", gl_pnt},
+	{"scale", gl_scale},
+	{"translate", gl_translate},
+	{"pdr", gl_pdr},
+	{"pmv", gl_pmv},
+	{"rdr", gl_rdr},
+	{"rmv", gl_rmv},
+	{"rpdr", gl_rpdr},
+	{"rpmv", gl_rpmv},
+	{"xfpt", gl_xfpt},
+	{"RGBcolor", gl_RGBcolor},
+	{"RGBwritemask", gl_RGBwritemask},
+	{"setcursor", gl_setcursor},
+	{"tie", gl_tie},
+	{"circfs", gl_circfs},
+	{"circs", gl_circs},
+	{"cmovs", gl_cmovs},
+	{"draws", gl_draws},
+	{"moves", gl_moves},
+	{"pdrs", gl_pdrs},
+	{"pmvs", gl_pmvs},
+	{"pnts", gl_pnts},
+	{"rdrs", gl_rdrs},
+	{"rmvs", gl_rmvs},
+	{"rpdrs", gl_rpdrs},
+	{"rpmvs", gl_rpmvs},
+	{"xfpts", gl_xfpts},
+	{"curorigin", gl_curorigin},
+	{"cyclemap", gl_cyclemap},
+	{"patch", gl_patch},
+	{"splf", gl_splf},
+	{"splf2", gl_splf2},
+	{"splfi", gl_splfi},
+	{"splf2i", gl_splf2i},
+	{"splfs", gl_splfs},
+	{"splf2s", gl_splf2s},
+	{"rpatch", gl_rpatch},
+	{"ortho2", gl_ortho2},
+	{"rect", gl_rect},
+	{"rectf", gl_rectf},
+	{"xfpt4", gl_xfpt4},
+	{"textport", gl_textport},
+	{"mapcolor", gl_mapcolor},
+	{"scrmask", gl_scrmask},
+	{"setvaluator", gl_setvaluator},
+	{"viewport", gl_viewport},
+	{"shaderange", gl_shaderange},
+	{"xfpt4s", gl_xfpt4s},
+	{"rectfi", gl_rectfi},
+	{"recti", gl_recti},
+	{"xfpt4i", gl_xfpt4i},
+	{"prefposition", gl_prefposition},
+	{"arc", gl_arc},
+	{"arcf", gl_arcf},
+	{"arcfi", gl_arcfi},
+	{"arci", gl_arci},
+	{"bbox2", gl_bbox2},
+	{"bbox2i", gl_bbox2i},
+	{"bbox2s", gl_bbox2s},
+	{"blink", gl_blink},
+	{"ortho", gl_ortho},
+	{"window", gl_window},
+	{"lookat", gl_lookat},
+	{"perspective", gl_perspective},
+	{"polarview", gl_polarview},
+	{"arcfs", gl_arcfs},
+	{"arcs", gl_arcs},
+	{"rectcopy", gl_rectcopy},
+	{"RGBcursor", gl_RGBcursor},
+	{"getbutton", gl_getbutton},
+	{"getcmmode", gl_getcmmode},
+	{"getlsbackup", gl_getlsbackup},
+	{"getresetls", gl_getresetls},
+	{"getdcm", gl_getdcm},
+	{"getzbuffer", gl_getzbuffer},
+	{"ismex", gl_ismex},
+	{"isobj", gl_isobj},
+	{"isqueued", gl_isqueued},
+	{"istag", gl_istag},
+	{"genobj", gl_genobj},
+	{"gentag", gl_gentag},
+	{"getbuffer", gl_getbuffer},
+	{"getcolor", gl_getcolor},
+	{"getdisplaymode", gl_getdisplaymode},
+	{"getfont", gl_getfont},
+	{"getheight", gl_getheight},
+	{"gethitcode", gl_gethitcode},
+	{"getlstyle", gl_getlstyle},
+	{"getlwidth", gl_getlwidth},
+	{"getmap", gl_getmap},
+	{"getplanes", gl_getplanes},
+	{"getwritemask", gl_getwritemask},
+	{"qtest", gl_qtest},
+	{"getlsrepeat", gl_getlsrepeat},
+	{"getmonitor", gl_getmonitor},
+	{"getopenobj", gl_getopenobj},
+	{"getpattern", gl_getpattern},
+	{"winget", gl_winget},
+	{"winattach", gl_winattach},
+	{"getothermonitor", gl_getothermonitor},
+	{"newpup", gl_newpup},
+	{"getvaluator", gl_getvaluator},
+	{"winset", gl_winset},
+	{"dopup", gl_dopup},
+	{"getdepth", gl_getdepth},
+	{"getcpos", gl_getcpos},
+	{"getsize", gl_getsize},
+	{"getorigin", gl_getorigin},
+	{"getviewport", gl_getviewport},
+	{"gettp", gl_gettp},
+	{"getgpos", gl_getgpos},
+	{"winposition", gl_winposition},
+	{"gRGBcolor", gl_gRGBcolor},
+	{"gRGBmask", gl_gRGBmask},
+	{"getscrmask", gl_getscrmask},
+	{"getmcolor", gl_getmcolor},
+	{"mapw", gl_mapw},
+	{"mapw2", gl_mapw2},
+	{"getcursor", gl_getcursor},
+	{"cmode", gl_cmode},
+	{"concave", gl_concave},
+	{"curstype", gl_curstype},
+	{"drawmode", gl_drawmode},
+	{"gammaramp", gl_gammaramp},
+	{"getbackface", gl_getbackface},
+	{"getdescender", gl_getdescender},
+	{"getdrawmode", gl_getdrawmode},
+	{"getmmode", gl_getmmode},
+	{"getsm", gl_getsm},
+	{"getvideo", gl_getvideo},
+	{"imakebackground", gl_imakebackground},
+	{"lmbind", gl_lmbind},
+	{"lmdef", gl_lmdef},
+	{"mmode", gl_mmode},
+	{"normal", gl_normal},
+	{"overlay", gl_overlay},
+	{"RGBrange", gl_RGBrange},
+	{"setvideo", gl_setvideo},
+	{"shademodel", gl_shademodel},
+	{"underlay", gl_underlay},
+	{"bgnclosedline", gl_bgnclosedline},
+	{"bgnline", gl_bgnline},
+	{"bgnpoint", gl_bgnpoint},
+	{"bgnpolygon", gl_bgnpolygon},
+	{"bgnsurface", gl_bgnsurface},
+	{"bgntmesh", gl_bgntmesh},
+	{"bgntrim", gl_bgntrim},
+	{"endclosedline", gl_endclosedline},
+	{"endline", gl_endline},
+	{"endpoint", gl_endpoint},
+	{"endpolygon", gl_endpolygon},
+	{"endsurface", gl_endsurface},
+	{"endtmesh", gl_endtmesh},
+	{"endtrim", gl_endtrim},
+	{"blendfunction", gl_blendfunction},
+	{"c3f", gl_c3f},
+	{"c3i", gl_c3i},
+	{"c3s", gl_c3s},
+	{"c4f", gl_c4f},
+	{"c4i", gl_c4i},
+	{"c4s", gl_c4s},
+	{"colorf", gl_colorf},
+	{"cpack", gl_cpack},
+	{"czclear", gl_czclear},
+	{"dglclose", gl_dglclose},
+	{"dglopen", gl_dglopen},
+	{"getgdesc", gl_getgdesc},
+	{"getnurbsproperty", gl_getnurbsproperty},
+	{"glcompat", gl_glcompat},
+	{"iconsize", gl_iconsize},
+	{"icontitle", gl_icontitle},
+	{"lRGBrange", gl_lRGBrange},
+	{"linesmooth", gl_linesmooth},
+	{"lmcolor", gl_lmcolor},
+	{"logicop", gl_logicop},
+	{"lsetdepth", gl_lsetdepth},
+	{"lshaderange", gl_lshaderange},
+	{"n3f", gl_n3f},
+	{"noborder", gl_noborder},
+	{"pntsmooth", gl_pntsmooth},
+	{"readsource", gl_readsource},
+	{"rectzoom", gl_rectzoom},
+	{"sbox", gl_sbox},
+	{"sboxi", gl_sboxi},
+	{"sboxs", gl_sboxs},
+	{"sboxf", gl_sboxf},
+	{"sboxfi", gl_sboxfi},
+	{"sboxfs", gl_sboxfs},
+	{"setnurbsproperty", gl_setnurbsproperty},
+	{"setpup", gl_setpup},
+	{"smoothline", gl_smoothline},
+	{"subpixel", gl_subpixel},
+	{"swaptmesh", gl_swaptmesh},
+	{"swinopen", gl_swinopen},
+	{"v2f", gl_v2f},
+	{"v2i", gl_v2i},
+	{"v2s", gl_v2s},
+	{"v3f", gl_v3f},
+	{"v3i", gl_v3i},
+	{"v3s", gl_v3s},
+	{"v4f", gl_v4f},
+	{"v4i", gl_v4i},
+	{"v4s", gl_v4s},
+	{"videocmd", gl_videocmd},
+	{"windepth", gl_windepth},
+	{"wmpack", gl_wmpack},
+	{"zdraw", gl_zdraw},
+	{"zfunction", gl_zfunction},
+	{"zsource", gl_zsource},
+	{"zwritemask", gl_zwritemask},
+	{"v2d", gl_v2d},
+	{"v3d", gl_v3d},
+	{"v4d", gl_v4d},
+	{"pixmode", gl_pixmode},
+	{"qgetfd", gl_qgetfd},
+	{"dither", gl_dither},
+	{NULL, NULL} /* Sentinel */
+};
+
+void
+initgl()
+{
+	Py_InitModule("gl", gl_methods);
+}
