Added lrect{read,write} and pixmode().
Also added functions (un)packrect, not in GL but needed for tv...
Commented out all the functions that cause error messages.
diff --git a/Modules/cstubs b/Modules/cstubs
index af41213..139ab96 100644
--- a/Modules/cstubs
+++ b/Modules/cstubs
@@ -561,6 +561,216 @@
 	return v;
 }
 
+% lrectwrite
+
+static object *
+gl_lrectwrite(self, args)
+	object *self;
+	object *args;
+{
+	short x1 ;
+	short y1 ;
+	short x2 ;
+	short y2 ;
+	string parray ;
+	object *s;
+	int pixcount;
+	if (!getishortarg(args, 5, 0, &x1))
+		return NULL;
+	if (!getishortarg(args, 5, 1, &y1))
+		return NULL;
+	if (!getishortarg(args, 5, 2, &x2))
+		return NULL;
+	if (!getishortarg(args, 5, 3, &y2))
+		return NULL;
+	if (!getistringarg(args, 5, 4, &parray))
+		return NULL;
+	if (!getiobjectarg(args, 5, 4, &s))
+		return NULL;
+	pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
+	if (!is_stringobject(s) || getstringsize(s) != pixcount*sizeof(long)) {
+		fprintf(stderr, "string arg to lrectwrite has wrong size\n");
+		err_badarg();
+		return NULL;
+	}
+	lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray );
+	INCREF(None);
+	return None;
+}
+
+% lrectread
+
+static object *
+gl_lrectread(self, args)
+	object *self;
+	object *args;
+{
+	short x1 ;
+	short y1 ;
+	short x2 ;
+	short y2 ;
+	object *parray;
+	int pixcount;
+	if (!getishortarg(args, 4, 0, &x1))
+		return NULL;
+	if (!getishortarg(args, 4, 1, &y1))
+		return NULL;
+	if (!getishortarg(args, 4, 2, &x2))
+		return NULL;
+	if (!getishortarg(args, 4, 3, &y2))
+		return NULL;
+	pixcount = (long)(x2+1-x1) * (long)(y2+1-y1);
+	parray = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
+	if (parray == NULL)
+		return NULL; /* No memory */
+	lrectread(x1, y1, x2, y2, (unsigned long *) getstringvalue(parray));
+	return parray;
+}
+
+/* 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).
+*/
+
+% packrect
+
+static object *
+gl_packrect(self, args)
+	object *self;
+	object *args;
+{
+	long width, height, packfactor;
+	char *s;
+	object *unpacked, *packed;
+	int pixcount, packedcount, x, y, r, g, b;
+	unsigned long pixel;
+	unsigned char *p;
+	unsigned long *parray;
+	if (!getilongarg(args, 4, 0, &width))
+		return NULL;
+	if (!getilongarg(args, 4, 1, &height))
+		return NULL;
+	if (!getilongarg(args, 4, 2, &packfactor))
+		return NULL;
+	if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
+		return NULL;
+	if (!getiobjectarg(args, 4, 3, &unpacked))
+		return NULL;
+	if (width <= 0 || height <= 0 || packfactor <= 0) {
+		err_setstr(RuntimeError, "packrect args must be > 0");
+		return NULL;
+	}
+	pixcount = width*height;
+	packedcount = ((width+packfactor-1)/packfactor) *
+		((height+packfactor-1)/packfactor);
+	if (getstringsize(unpacked) != pixcount*sizeof(long)) {
+		fprintf(stderr, "string arg to packrect has wrong size\n");
+		err_badarg();
+		return NULL;
+	}
+	packed = newsizedstringobject((char *)NULL, packedcount);
+	if (packed == NULL)
+		return NULL;
+	parray = (unsigned long *) getstringvalue(unpacked);
+	p = getstringvalue(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++ = (r+g+b) / 3;
+		}
+	}
+	return packed;
+}
+
+% unpackrect
+
+static unsigned long unpacktab[256];
+static int unpacktab_inited = 0;
+
+static object *
+gl_unpackrect(self, args)
+	object *self;
+	object *args;
+{
+	long width, height, packfactor;
+	char *s;
+	object *unpacked, *packed;
+	int pixcount, packedcount, y;
+	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 (!getilongarg(args, 4, 0, &width))
+		return NULL;
+	if (!getilongarg(args, 4, 1, &height))
+		return NULL;
+	if (!getilongarg(args, 4, 2, &packfactor))
+		return NULL;
+	if (!getistringarg(args, 4, 3, &s)) /* For type checking only */
+		return NULL;
+	if (!getiobjectarg(args, 4, 3, &packed))
+		return NULL;
+	if (width <= 0 || height <= 0 || packfactor <= 0) {
+		err_setstr(RuntimeError, "packrect args must be > 0");
+		return NULL;
+	}
+	pixcount = width*height;
+	packedcount = ((width+packfactor-1)/packfactor) *
+		((height+packfactor-1)/packfactor);
+	if (getstringsize(packed) != packedcount) {
+		fprintf(stderr, "string arg to unpackrect has wrong size\n");
+		err_badarg();
+		return NULL;
+	}
+	unpacked = newsizedstringobject((char *)NULL, pixcount*sizeof(long));
+	if (unpacked == NULL)
+		return NULL;
+	parray = (unsigned long *) getstringvalue(unpacked);
+	p = (unsigned char *) getstringvalue(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;
+}
+
 /* End of manually written stubs */
 
 %%
@@ -828,7 +1038,7 @@
 void splf2i		long s long s[2*arg1] short s[arg1]
 void splfs		long s short s[3*arg1] short s[arg1]
 void splf2s		long s short s[2*arg1] short s[arg1]
-void defpattern		short s short s short s[arg2*arg2/16]
+###void defpattern		short s short s short s[arg2*arg2/16]
 #
 void rpatch		float s[16] float s[16] float s[16] float s[16]
 #
@@ -922,22 +1132,22 @@
 void gRGBcolor		short r short r short r
 void gRGBmask		short r short r short r
 void getscrmask	short r short r short r short r
-void gRGBcursor	short r short r short r short r short r short r short r short r long *
+###void gRGBcursor	short r short r short r short r short r short r short r short r
 void getmcolor		short s short r short r short r
 void mapw		long s short s short s float r float r float r float r float r float r
 void mapw2		long s short s short s float r float r
-void defrasterfont	short s short s short s Fontchar s[arg3] short s short s[4*arg5]
+###void defrasterfont	short s short s short s Fontchar s[arg3] short s short s[4*arg5]
 long qread		short r
 void getcursor		short r short r short r long r
 #
 #   For these we receive arrays of stuff
 #
-void getdev 		long s short s[arg1] short r[arg1]
+###void getdev 		long s short s[arg1] short r[arg1]
 #XXX not generated correctly yet
 #void getmatrix		float r[16]
-long readpixels		short s short r[retval]
-long readRGB		short s char r[retval] char r[retval] char r[retval]
-long blkqread		short s short r[arg1]
+###long readpixels		short s short r[retval]
+###long readRGB		short s char r[retval] char r[retval] char r[retval]
+###long blkqread		short s short r[arg1]
 #
 #   New 4D routines
 #
@@ -1000,10 +1210,11 @@
 void linesmooth		long s
 void lmcolor		long s
 void logicop		long s
-long lrectread	 	short s short s short s short s long r[retval]
-void lrectwrite		short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
-long rectread	 	short s short s short s short s short r[retval]
-void rectwrite		short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)]
+###long lrectread	 	short s short s short s short s long r[retval]
+###void lrectwrite		short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
+### Now manual, with string last arg
+###long rectread	 	short s short s short s short s short r[retval]
+###void rectwrite		short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)]
 void lsetdepth		long s long s
 void lshaderange	short s short s long s long s
 void n3f		float s[3]
@@ -1045,3 +1256,7 @@
 void v2d		double s[2]
 void v3d		double s[3]
 void v4d		double s[4]
+#
+# Why isn't this here?
+#
+void pixmode		long s long s