diff --git a/Modules/imgfile.c b/Modules/imgfile.c
index b529d03..33266b9 100644
--- a/Modules/imgfile.c
+++ b/Modules/imgfile.c
@@ -40,11 +40,9 @@
 ** Warning: this module is very non-reentrant (esp. the readscaled stuff)
 */
 
-#include "allobjects.h"
-#include "modsupport.h"
+#include "Python.h"
 
 #include <gl/image.h>
-#include <errno.h>
 
 #include "/usr/people/4Dgifts/iristools/include/izoom.h"
 
@@ -55,7 +53,7 @@
 extern void putrow();
 extern void getrow();
 
-static object * ImgfileError; /* Exception we raise for various trouble */
+static PyObject * ImgfileError; /* Exception we raise for various trouble */
 
 static int top_to_bottom;	/* True if we want top-to-bottom images */
 
@@ -70,11 +68,11 @@
 
 static void
 imgfile_error(str)
-    char *str;
+	char *str;
 {
-    err_setstr(ImgfileError, str);
-    error_called = 1;
-    return;	/* To imglib, which will return a failure indicator */
+	PyErr_SetString(ImgfileError, str);
+	error_called = 1;
+	return;	/* To imglib, which will return a failure indicator */
 }
 
 
@@ -83,124 +81,129 @@
 
 static IMAGE *
 imgfile_open(fname)
-    char *fname;
+	char *fname;
 {
-    IMAGE *image;
-    i_seterror(imgfile_error);
-    error_called = 0;
-    errno = 0;
-    if ( (image = iopen(fname, "r")) == NULL ) {
-	/* Error may already be set by imgfile_error */
-	if ( !error_called ) {
-	    if (errno)
-	        err_errno(ImgfileError);
-	    else
-	        err_setstr(ImgfileError, "Can't open image file");
-        }
-	return NULL;
-    }
-    return image;
-}
-
-static object *
-imgfile_ttob(self, args)
-    object *self;
-    object *args;
-{
-    int newval;
-    object *rv;
-    
-    if (!getargs(args, "i", &newval))
-      return NULL;
-    rv = newintobject(top_to_bottom);
-    top_to_bottom = newval;
-    return rv;
-}
-
-static object *
-imgfile_read(self, args)
-    object *self;
-    object *args;
-{
-    char *fname;
-    object *rv;
-    int xsize, ysize, zsize;
-    char *cdatap;
-    long *idatap;
-    static short rs[8192], gs[8192], bs[8192];
-    int x, y;
-    IMAGE *image;
-    int yfirst, ylast, ystep;
-
-    if ( !getargs(args, "s", &fname) )
-      return NULL;
-    
-    if ( (image = imgfile_open(fname)) == NULL )
-      return NULL;
-    
-    if ( image->colormap != CM_NORMAL ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can only handle CM_NORMAL images");
-	return NULL;
-    }
-    if ( BPP(image->type) != 1 ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1");
-	return NULL;
-    }
-    xsize = image->xsize;
-    ysize = image->ysize;
-    zsize = image->zsize;
-    if ( zsize != 1 && zsize != 3) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
-	return NULL;
-    }
-    if ( xsize > 8192 ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
-	return NULL;
-    }
-
-    if ( zsize == 3 ) zsize = 4;
-    rv = newsizedstringobject((char *)NULL, xsize*ysize*zsize);
-    if ( rv == NULL ) {
-      iclose(image);
-      return NULL;
-    }
-    cdatap = getstringvalue(rv);
-    idatap = (long *)cdatap;
-
-    if (top_to_bottom) {
-	yfirst = ysize-1;
-	ylast = -1;
-	ystep = -1;
-    } else {
-	yfirst = 0;
-	ylast = ysize;
-	ystep = 1;
-    }
-    for ( y=yfirst; y != ylast && !error_called; y += ystep ) {
-	if ( zsize == 1 ) {
-	    getrow(image, rs, y, 0);
-	    for(x=0; x<xsize; x++ )
-	      *cdatap++ = rs[x];
-	} else {
-	    getrow(image, rs, y, 0);
-	    getrow(image, gs, y, 1);
-	    getrow(image, bs, y, 2);
-	    for(x=0; x<xsize; x++ )
-	      *idatap++ = (rs[x] & 0xff)     |
-		         ((gs[x] & 0xff)<<8) |
-		         ((bs[x] & 0xff)<<16);
+	IMAGE *image;
+	i_seterror(imgfile_error);
+	error_called = 0;
+	errno = 0;
+	if ( (image = iopen(fname, "r")) == NULL ) {
+		/* Error may already be set by imgfile_error */
+		if ( !error_called ) {
+			if (errno)
+				PyErr_SetFromErrno(ImgfileError);
+			else
+				PyErr_SetString(ImgfileError,
+						"Can't open image file");
+		}
+		return NULL;
 	}
-    }
-    iclose(image);
-    if ( error_called ) {
-	DECREF(rv);
-	return NULL;
-    }
-    return rv;
+	return image;
+}
+
+static PyObject *
+imgfile_ttob(self, args)
+	PyObject *self;
+PyObject *args;
+{
+	int newval;
+	PyObject *rv;
+    
+	if (!PyArg_Parse(args, "i", &newval))
+		return NULL;
+	rv = PyInt_FromLong(top_to_bottom);
+	top_to_bottom = newval;
+	return rv;
+}
+
+static PyObject *
+imgfile_read(self, args)
+	PyObject *self;
+PyObject *args;
+{
+	char *fname;
+	PyObject *rv;
+	int xsize, ysize, zsize;
+	char *cdatap;
+	long *idatap;
+	static short rs[8192], gs[8192], bs[8192];
+	int x, y;
+	IMAGE *image;
+	int yfirst, ylast, ystep;
+
+	if ( !PyArg_Parse(args, "s", &fname) )
+		return NULL;
+    
+	if ( (image = imgfile_open(fname)) == NULL )
+		return NULL;
+    
+	if ( image->colormap != CM_NORMAL ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can only handle CM_NORMAL images");
+		return NULL;
+	}
+	if ( BPP(image->type) != 1 ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can't handle imgfiles with bpp!=1");
+		return NULL;
+	}
+	xsize = image->xsize;
+	ysize = image->ysize;
+	zsize = image->zsize;
+	if ( zsize != 1 && zsize != 3) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can only handle 1 or 3 byte pixels");
+		return NULL;
+	}
+	if ( xsize > 8192 ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can't handle image with > 8192 columns");
+		return NULL;
+	}
+
+	if ( zsize == 3 ) zsize = 4;
+	rv = PyString_FromStringAndSize((char *)NULL, xsize*ysize*zsize);
+	if ( rv == NULL ) {
+		iclose(image);
+		return NULL;
+	}
+	cdatap = PyString_AsString(rv);
+	idatap = (long *)cdatap;
+
+	if (top_to_bottom) {
+		yfirst = ysize-1;
+		ylast = -1;
+		ystep = -1;
+	} else {
+		yfirst = 0;
+		ylast = ysize;
+		ystep = 1;
+	}
+	for ( y=yfirst; y != ylast && !error_called; y += ystep ) {
+		if ( zsize == 1 ) {
+			getrow(image, rs, y, 0);
+			for(x=0; x<xsize; x++ )
+				*cdatap++ = rs[x];
+		} else {
+			getrow(image, rs, y, 0);
+			getrow(image, gs, y, 1);
+			getrow(image, bs, y, 2);
+			for(x=0; x<xsize; x++ )
+				*idatap++ = (rs[x] & 0xff)  |
+					((gs[x] & 0xff)<<8) |
+					((bs[x] & 0xff)<<16);
+		}
+	}
+	iclose(image);
+	if ( error_called ) {
+		Py_DECREF(rv);
+		return NULL;
+	}
+	return rv;
 }
 
 static IMAGE *glob_image;
@@ -209,334 +212,357 @@
 
 static void
 xs_get(buf, y)
-    short *buf;
-    int y;
+	short *buf;
+int y;
 {
-    if (top_to_bottom)
-      getrow(glob_image, buf, (glob_ysize-1-y), glob_z);
-    else
-      getrow(glob_image, buf, y, glob_z);
+	if (top_to_bottom)
+		getrow(glob_image, buf, (glob_ysize-1-y), glob_z);
+	else
+		getrow(glob_image, buf, y, glob_z);
 }
 
 static void
 xs_put_c(buf, y)
-    short *buf;
-    int y;
+	short *buf;
+int y;
 {
-    char *datap = (char *)glob_datap + y*glob_width;
-    int width = glob_width;
+	char *datap = (char *)glob_datap + y*glob_width;
+	int width = glob_width;
 
-    while ( width-- )
-      *datap++ = (*buf++) & 0xff;
+	while ( width-- )
+		*datap++ = (*buf++) & 0xff;
 }
 
 static void
 xs_put_0(buf, y)
-    short *buf;
-    int y;
+	short *buf;
+int y;
 {
-    long *datap = glob_datap + y*glob_width;
-    int width = glob_width;
+	long *datap = glob_datap + y*glob_width;
+	int width = glob_width;
 
-    while ( width-- )
-      *datap++ = (*buf++) & 0xff;
+	while ( width-- )
+		*datap++ = (*buf++) & 0xff;
 }
 static void
 xs_put_12(buf, y)
-    short *buf;
-    int y;
+	short *buf;
+int y;
 {
-    long *datap = glob_datap + y*glob_width;
-    int width = glob_width;
+	long *datap = glob_datap + y*glob_width;
+	int width = glob_width;
 
-    while ( width-- )
-      *datap++ |= ((*buf++) & 0xff) << (glob_z*8);
+	while ( width-- )
+		*datap++ |= ((*buf++) & 0xff) << (glob_z*8);
 }
 
 static void
 xscale(image, xsize, ysize, zsize, datap, xnew, ynew, fmode, blur)
-    IMAGE *image;
-    int xsize, ysize, zsize;
-    long *datap;
-    int xnew, ynew;
-    int fmode;
-    double blur;
+	IMAGE *image;
+int xsize, ysize, zsize;
+long *datap;
+int xnew, ynew;
+int fmode;
+double blur;
 {
-    glob_image = image;
-    glob_datap = datap;
-    glob_width = xnew;
-    glob_ysize = ysize;
-    if ( zsize == 1 ) {
-	glob_z = 0;
-	filterzoom(xs_get, xs_put_c, xsize, ysize, xnew, ynew, fmode, blur);
-    } else {
-	glob_z = 0;
-	filterzoom(xs_get, xs_put_0, xsize, ysize, xnew, ynew, fmode, blur);
-	glob_z = 1;
-	filterzoom(xs_get, xs_put_12, xsize, ysize, xnew, ynew, fmode, blur);
-	glob_z = 2;
-	filterzoom(xs_get, xs_put_12, xsize, ysize, xnew, ynew, fmode, blur);
-    }
+	glob_image = image;
+	glob_datap = datap;
+	glob_width = xnew;
+	glob_ysize = ysize;
+	if ( zsize == 1 ) {
+		glob_z = 0;
+		filterzoom(xs_get, xs_put_c, xsize, ysize,
+			   xnew, ynew, fmode, blur);
+	} else {
+		glob_z = 0;
+		filterzoom(xs_get, xs_put_0, xsize, ysize,
+			   xnew, ynew, fmode, blur);
+		glob_z = 1;
+		filterzoom(xs_get, xs_put_12, xsize, ysize,
+			   xnew, ynew, fmode, blur);
+		glob_z = 2;
+		filterzoom(xs_get, xs_put_12, xsize, ysize,
+			   xnew, ynew, fmode, blur);
+	}
 }
 
 
-static object *
+static PyObject *
 imgfile_readscaled(self, args)
-    object *self;
-    object *args;
+	PyObject *self;
+PyObject *args;
 {
-    char *fname;
-    object *rv;
-    int xsize, ysize, zsize;
-    char *cdatap;
-    long *idatap;
-    static short rs[8192], gs[8192], bs[8192];
-    int x, y;
-    int xwtd, ywtd, xorig, yorig;
-    float xfac, yfac;
-    int cnt;
-    IMAGE *image;
-    char *filter;
-    double blur;
-    int extended;
-    int fmode = 0;
-    int yfirst, ylast, ystep;
+	char *fname;
+	PyObject *rv;
+	int xsize, ysize, zsize;
+	char *cdatap;
+	long *idatap;
+	static short rs[8192], gs[8192], bs[8192];
+	int x, y;
+	int xwtd, ywtd, xorig, yorig;
+	float xfac, yfac;
+	int cnt;
+	IMAGE *image;
+	char *filter;
+	double blur;
+	int extended;
+	int fmode = 0;
+	int yfirst, ylast, ystep;
 
-    /*
-     ** Parse args. Funny, since arg 4 and 5 are optional
-     ** (filter name and blur factor). Also, 4 or 5 arguments indicates
-     ** extended scale algorithm in stead of simple-minded pixel drop/dup.
-     */
-    extended = 0;
-    cnt = gettuplesize(args);
-    if ( cnt == 5 ) {
-	extended = 1;
-	if ( !getargs(args, "(siisd)", &fname, &xwtd, &ywtd, &filter, &blur) )
-	  return NULL;
-    } else if ( cnt == 4 ) {
-	extended = 1;
-	if ( !getargs(args, "(siis)", &fname, &xwtd, &ywtd, &filter) )
-	  return NULL;
-	blur = 1.0;
-    } else if ( !getargs(args, "(sii)", &fname, &xwtd, &ywtd) )
-      return NULL;
+	/*
+	** Parse args. Funny, since arg 4 and 5 are optional
+	** (filter name and blur factor). Also, 4 or 5 arguments indicates
+	** extended scale algorithm in stead of simple-minded pixel drop/dup.
+	*/
+	extended = 0;
+	cnt = PyTuple_Size(args);
+	if ( cnt == 5 ) {
+		extended = 1;
+		if ( !PyArg_Parse(args, "(siisd)",
+				  &fname, &xwtd, &ywtd, &filter, &blur) )
+			return NULL;
+	} else if ( cnt == 4 ) {
+		extended = 1;
+		if ( !PyArg_Parse(args, "(siis)",
+				  &fname, &xwtd, &ywtd, &filter) )
+			return NULL;
+		blur = 1.0;
+	} else if ( !PyArg_Parse(args, "(sii)", &fname, &xwtd, &ywtd) )
+		return NULL;
 
-    /*
-     ** Check parameters, open file and check type, rows, etc.
-     */
-    if ( extended ) {
-	if ( strcmp(filter, "impulse") == 0 ) fmode = IMPULSE;
-	else if ( strcmp( filter, "box") == 0 ) fmode = BOX;
-	else if ( strcmp( filter, "triangle") == 0 ) fmode = TRIANGLE;
-	else if ( strcmp( filter, "quadratic") == 0 ) fmode = QUADRATIC;
-	else if ( strcmp( filter, "gaussian") == 0 ) fmode = GAUSSIAN;
-	else {
-	    err_setstr(ImgfileError, "Unknown filter type");
-	    return NULL;
+	/*
+	** Check parameters, open file and check type, rows, etc.
+	*/
+	if ( extended ) {
+		if ( strcmp(filter, "impulse") == 0 )
+			fmode = IMPULSE;
+		else if ( strcmp( filter, "box") == 0 )
+			fmode = BOX;
+		else if ( strcmp( filter, "triangle") == 0 )
+			fmode = TRIANGLE;
+		else if ( strcmp( filter, "quadratic") == 0 )
+			fmode = QUADRATIC;
+		else if ( strcmp( filter, "gaussian") == 0 )
+			fmode = GAUSSIAN;
+		else {
+			PyErr_SetString(ImgfileError, "Unknown filter type");
+			return NULL;
+		}
 	}
-    }
     
-    if ( (image = imgfile_open(fname)) == NULL )
-      return NULL;
+	if ( (image = imgfile_open(fname)) == NULL )
+		return NULL;
     
-    if ( image->colormap != CM_NORMAL ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can only handle CM_NORMAL images");
-	return NULL;
-    }
-    if ( BPP(image->type) != 1 ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1");
-	return NULL;
-    }
-    xsize = image->xsize;
-    ysize = image->ysize;
-    zsize = image->zsize;
-    if ( zsize != 1 && zsize != 3) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
-	return NULL;
-    }
-    if ( xsize > 8192 ) {
-	iclose(image);
-	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
-	return NULL;
-    }
+	if ( image->colormap != CM_NORMAL ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can only handle CM_NORMAL images");
+		return NULL;
+	}
+	if ( BPP(image->type) != 1 ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can't handle imgfiles with bpp!=1");
+		return NULL;
+	}
+	xsize = image->xsize;
+	ysize = image->ysize;
+	zsize = image->zsize;
+	if ( zsize != 1 && zsize != 3) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can only handle 1 or 3 byte pixels");
+		return NULL;
+	}
+	if ( xsize > 8192 ) {
+		iclose(image);
+		PyErr_SetString(ImgfileError,
+				"Can't handle image with > 8192 columns");
+		return NULL;
+	}
 
-    if ( zsize == 3 ) zsize = 4;
-    rv = newsizedstringobject(NULL, xwtd*ywtd*zsize);
-    if ( rv == NULL ) {
-	iclose(image);
-	return NULL;
-    }
-    xfac = (float)xsize/(float)xwtd;
-    yfac = (float)ysize/(float)ywtd;
-    cdatap = getstringvalue(rv);
-    idatap = (long *)cdatap;
+	if ( zsize == 3 ) zsize = 4;
+	rv = PyString_FromStringAndSize(NULL, xwtd*ywtd*zsize);
+	if ( rv == NULL ) {
+		iclose(image);
+		return NULL;
+	}
+	xfac = (float)xsize/(float)xwtd;
+	yfac = (float)ysize/(float)ywtd;
+	cdatap = PyString_AsString(rv);
+	idatap = (long *)cdatap;
 
-    if ( extended ) {
-	xscale(image, xsize, ysize, zsize, idatap, xwtd, ywtd, fmode, blur);
-    } else {
-	if (top_to_bottom) {
-	    yfirst = ywtd-1;
-	    ylast = -1;
-	    ystep = -1;
+	if ( extended ) {
+		xscale(image, xsize, ysize, zsize,
+		       idatap, xwtd, ywtd, fmode, blur);
 	} else {
-	    yfirst = 0;
-	    ylast = ywtd;
-	    ystep = 1;
+		if (top_to_bottom) {
+			yfirst = ywtd-1;
+			ylast = -1;
+			ystep = -1;
+		} else {
+			yfirst = 0;
+			ylast = ywtd;
+			ystep = 1;
+		}
+		for ( y=yfirst; y != ylast && !error_called; y += ystep ) {
+			yorig = (int)(y*yfac);
+			if ( zsize == 1 ) {
+				getrow(image, rs, yorig, 0);
+				for(x=0; x<xwtd; x++ ) {
+					*cdatap++ = rs[(int)(x*xfac)];	
+				}
+			} else {
+				getrow(image, rs, yorig, 0);
+				getrow(image, gs, yorig, 1);
+				getrow(image, bs, yorig, 2);
+				for(x=0; x<xwtd; x++ ) {
+					xorig = (int)(x*xfac);
+					*idatap++ = (rs[xorig] & 0xff)  |
+						((gs[xorig] & 0xff)<<8) |
+						((bs[xorig] & 0xff)<<16);
+				}
+			}
+		}
+	}
+	iclose(image);
+	if ( error_called ) {
+		Py_DECREF(rv);
+		return NULL;
+	}
+	return rv;
+}
+
+static PyObject *
+imgfile_getsizes(self, args)
+	PyObject *self;
+PyObject *args;
+{
+	char *fname;
+	PyObject *rv;
+	IMAGE *image;
+    
+	if ( !PyArg_Parse(args, "s", &fname) )
+		return NULL;
+    
+	if ( (image = imgfile_open(fname)) == NULL )
+		return NULL;
+	rv = Py_BuildValue("(iii)", image->xsize, image->ysize, image->zsize);
+	iclose(image);
+	return rv;
+}
+
+static PyObject *
+imgfile_write(self, args)
+	PyObject *self;
+PyObject *args;
+{
+	IMAGE *image;
+	char *fname;
+	int xsize, ysize, zsize, len;
+	char *cdatap;
+	long *idatap;
+	short rs[8192], gs[8192], bs[8192];
+	short r, g, b;
+	long rgb;
+	int x, y;
+	int yfirst, ylast, ystep;
+
+
+	if ( !PyArg_Parse(args, "(ss#iii)",
+			  &fname, &cdatap, &len, &xsize, &ysize, &zsize) )
+		return NULL;
+    
+	if ( zsize != 1 && zsize != 3 ) {
+		PyErr_SetString(ImgfileError,
+				"Can only handle 1 or 3 byte pixels");
+		return NULL;
+	}
+	if ( len != xsize * ysize * (zsize == 1 ? 1 : 4) ) {
+		PyErr_SetString(ImgfileError, "Data does not match sizes");
+		return NULL;
+	}
+	if ( xsize > 8192 ) {
+		PyErr_SetString(ImgfileError,
+				"Can't handle image with > 8192 columns");
+		return NULL;
+	}
+
+	error_called = 0;
+	errno = 0;
+	image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize);
+	if ( image == 0 ) {
+		if ( ! error_called ) {
+			if (errno)
+				PyErr_SetFromErrno(ImgfileError);
+			else
+				PyErr_SetString(ImgfileError,
+						"Can't create image file");
+		}
+		return NULL;
+	}
+
+	idatap = (long *)cdatap;
+    
+	if (top_to_bottom) {
+		yfirst = ysize-1;
+		ylast = -1;
+		ystep = -1;
+	} else {
+		yfirst = 0;
+		ylast = ysize;
+		ystep = 1;
 	}
 	for ( y=yfirst; y != ylast && !error_called; y += ystep ) {
-	    yorig = (int)(y*yfac);
-	    if ( zsize == 1 ) {
-		getrow(image, rs, yorig, 0);
-		for(x=0; x<xwtd; x++ ) {
-		    *cdatap++ = rs[(int)(x*xfac)];	
+		if ( zsize == 1 ) {
+			for( x=0; x<xsize; x++ )
+				rs[x] = *cdatap++;
+			putrow(image, rs, y, 0);
+		} else {
+			for( x=0; x<xsize; x++ ) {
+				rgb = *idatap++;
+				r = rgb & 0xff;
+				g = (rgb >> 8 ) & 0xff;
+				b = (rgb >> 16 ) & 0xff;
+				rs[x] = r;
+				gs[x] = g;
+				bs[x] = b;
+			}
+			putrow(image, rs, y, 0);
+			putrow(image, gs, y, 1);
+			putrow(image, bs, y, 2);
 		}
-	    } else {
-		getrow(image, rs, yorig, 0);
-		getrow(image, gs, yorig, 1);
-		getrow(image, bs, yorig, 2);
-		for(x=0; x<xwtd; x++ ) {
-		    xorig = (int)(x*xfac);
-		    *idatap++ = (rs[xorig] & 0xff)     |
-		      ((gs[xorig] & 0xff)<<8) |
-			((bs[xorig] & 0xff)<<16);
-		}
-	    }
 	}
-    }
-    iclose(image);
-    if ( error_called ) {
-	DECREF(rv);
-	return NULL;
-    }
-    return rv;
-}
-
-static object *
-imgfile_getsizes(self, args)
-    object *self;
-    object *args;
-{
-    char *fname;
-    object *rv;
-    IMAGE *image;
-    
-    if ( !getargs(args, "s", &fname) )
-      return NULL;
-    
-    if ( (image = imgfile_open(fname)) == NULL )
-      return NULL;
-    rv = mkvalue("(iii)", image->xsize, image->ysize, image->zsize);
-    iclose(image);
-    return rv;
-}
-
-static object *
-imgfile_write(self, args)
-    object *self;
-    object *args;
-{
-    IMAGE *image;
-    char *fname;
-    int xsize, ysize, zsize, len;
-    char *cdatap;
-    long *idatap;
-    short rs[8192], gs[8192], bs[8192];
-    short r, g, b;
-    long rgb;
-    int x, y;
-    int yfirst, ylast, ystep;
-
-
-    if ( !getargs(args, "(ss#iii)",
-		  &fname, &cdatap, &len, &xsize, &ysize, &zsize) )
-      return NULL;
-    
-    if ( zsize != 1 && zsize != 3 ) {
-	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
-	return NULL;
-    }
-    if ( len != xsize * ysize * (zsize == 1 ? 1 : 4) ) {
-	err_setstr(ImgfileError, "Data does not match sizes");
-	return NULL;
-    }
-    if ( xsize > 8192 ) {
-	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
-	return NULL;
-    }
-
-    error_called = 0;
-    errno = 0;
-    image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize);
-    if ( image == 0 ) {
-	if ( ! error_called ) {
-	    if (errno)
-		err_errno(ImgfileError);
-	    else
-	        err_setstr(ImgfileError, "Can't create image file");
-	}
-	return NULL;
-    }
-
-    idatap = (long *)cdatap;
-    
-    if (top_to_bottom) {
-	yfirst = ysize-1;
-	ylast = -1;
-	ystep = -1;
-    } else {
-	yfirst = 0;
-	ylast = ysize;
-	ystep = 1;
-    }
-    for ( y=yfirst; y != ylast && !error_called; y += ystep ) {
-	if ( zsize == 1 ) {
-	    for( x=0; x<xsize; x++ )
-	      rs[x] = *cdatap++;
-	    putrow(image, rs, y, 0);
-	} else {
-	    for( x=0; x<xsize; x++ ) {
-		rgb = *idatap++;
-		r = rgb & 0xff;
-		g = (rgb >> 8 ) & 0xff;
-		b = (rgb >> 16 ) & 0xff;
-		rs[x] = r;
-		gs[x] = g;
-		bs[x] = b;
-	    }
-	    putrow(image, rs, y, 0);
-	    putrow(image, gs, y, 1);
-	    putrow(image, bs, y, 2);
-	}
-    }
-    iclose(image);
-    if ( error_called )
-      return NULL;
-    INCREF(None);
-    return None;
+	iclose(image);
+	if ( error_called )
+		return NULL;
+	Py_INCREF(Py_None);
+	return Py_None;
     
 }
 
 
-static struct methodlist imgfile_methods[] = {
-    { "getsizes",	imgfile_getsizes },
-    { "read",		imgfile_read },
-    { "readscaled",	imgfile_readscaled, 1},
-    { "write",		imgfile_write },
-    { "ttob",		imgfile_ttob },
-    { NULL,		NULL } /* Sentinel */
+static PyMethodDef imgfile_methods[] = {
+	{ "getsizes",	imgfile_getsizes },
+	{ "read",	imgfile_read },
+	{ "readscaled",	imgfile_readscaled, 1},
+	{ "write",	imgfile_write },
+	{ "ttob",	imgfile_ttob },
+	{ NULL,		NULL } /* Sentinel */
 };
 
 
 void
 initimgfile()
 {
-	object *m, *d;
-	m = initmodule("imgfile", imgfile_methods);
-	d = getmoduledict(m);
-	ImgfileError = newstringobject("imgfile.error");
-	if ( ImgfileError == NULL || dictinsert(d, "error", ImgfileError) )
-	    fatal("can't define imgfile.error");
+	PyObject *m, *d;
+	m = Py_InitModule("imgfile", imgfile_methods);
+	d = PyModule_GetDict(m);
+	ImgfileError = PyString_FromString("imgfile.error");
+	if ( ImgfileError == NULL
+	 || PyDict_SetItemString(d, "error", ImgfileError) )
+		Py_FatalError("can't define imgfile.error");
 }
+
+
+
