/*
 *   	fastimg -
 *		Faster reading and writing of image files.
 *
 *      This code should work on machines with any byte order.
 *
 *	Could someone make this run real fast using multiple processors 
 *	or how about using memory mapped files to speed it up?
 *
 *				Paul Haeberli - 1991
 *
 *	Changed to return sizes.
 *				Sjoerd Mullender - 1993
 *	Changed to incorporate into Python.
 *				Sjoerd Mullender - 1993
 */
#include "Python.h"

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <string.h>

/*
 *	from image.h
 *
 */
typedef struct {
    unsigned short	imagic;		/* stuff saved on disk . . */
    unsigned short 	type;
    unsigned short 	dim;
    unsigned short 	xsize;
    unsigned short 	ysize;
    unsigned short 	zsize;
    unsigned long 	min;
    unsigned long 	max;
    unsigned long	wastebytes;	
    char 		name[80];
    unsigned long	colormap;

    long 		file;		/* stuff used in core only */
    unsigned short 	flags;
    short		dorev;
    short		x;
    short		y;
    short		z;
    short		cnt;
    unsigned short	*ptr;
    unsigned short	*base;
    unsigned short	*tmpbuf;
    unsigned long	offset;
    unsigned long	rleend;		/* for rle images */
    unsigned long	*rowstart;	/* for rle images */
    long		*rowsize;	/* for rle images */
} IMAGE;

#define IMAGIC 	0732

#define TYPEMASK		0xff00
#define BPPMASK			0x00ff
#define ITYPE_VERBATIM		0x0000
#define ITYPE_RLE		0x0100
#define ISRLE(type)		(((type) & 0xff00) == ITYPE_RLE)
#define ISVERBATIM(type)	(((type) & 0xff00) == ITYPE_VERBATIM)
#define BPP(type)		((type) & BPPMASK)
#define RLE(bpp)		(ITYPE_RLE | (bpp))
#define VERBATIM(bpp)		(ITYPE_VERBATIM | (bpp))
/*
 *	end of image.h stuff
 *
 */

#define RINTLUM (79)
#define GINTLUM (156)
#define BINTLUM (21)

#define ILUM(r,g,b)     ((int)(RINTLUM*(r)+GINTLUM*(g)+BINTLUM*(b))>>8)

#define OFFSET_R	3	/* this is byte order dependent */
#define OFFSET_G	2
#define OFFSET_B	1
#define OFFSET_A	0

#define CHANOFFSET(z)	(3-(z))	/* this is byte order dependent */

static void expandrow Py_PROTO((unsigned char *, unsigned char *, int));
static void setalpha Py_PROTO((unsigned char *, int));
static void copybw Py_PROTO((long *, int));
static void interleaverow Py_PROTO((unsigned char*, unsigned char*, int, int));
static int compressrow Py_PROTO((unsigned char *, unsigned char *, int, int));
static void lumrow Py_PROTO((unsigned char *, unsigned char *, int));

#ifdef ADD_TAGS
#define TAGLEN	(5)
#else
#define TAGLEN	(0)
#endif

static PyObject *ImgfileError;

static int reverse_order;

#ifdef ADD_TAGS
/*
 *	addlongimgtag - 
 *		this is used to extract image data from core dumps.
 *
 */
addlongimgtag(dptr,xsize,ysize)
unsigned long *dptr;
int xsize, ysize;
{
    dptr = dptr+(xsize*ysize);
    dptr[0] = 0x12345678;
    dptr[1] = 0x59493333;
    dptr[2] = 0x69434222;
    dptr[3] = xsize;
    dptr[4] = ysize;
}
#endif

/*
 *	byte order independent read/write of shorts and longs.
 *
 */
static unsigned short getshort(inf)
FILE *inf;
{
    unsigned char buf[2];

    fread(buf,2,1,inf);
    return (buf[0]<<8)+(buf[1]<<0);
}

static unsigned long getlong(inf)
FILE *inf;
{
    unsigned char buf[4];

    fread(buf,4,1,inf);
    return (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]<<0);
}

static void putshort(outf,val)
FILE *outf;
unsigned short val;
{
    unsigned char buf[2];

    buf[0] = (val>>8);
    buf[1] = (val>>0);
    fwrite(buf,2,1,outf);
}

static int putlong(outf,val)
FILE *outf;
unsigned long val;
{
    unsigned char buf[4];

    buf[0] = (val>>24);
    buf[1] = (val>>16);
    buf[2] = (val>>8);
    buf[3] = (val>>0);
    return fwrite(buf,4,1,outf);
}

static void readheader(inf,image)
FILE *inf;
IMAGE *image;
{
    memset(image,0,sizeof(IMAGE));
    image->imagic = getshort(inf);
    image->type = getshort(inf);
    image->dim = getshort(inf);
    image->xsize = getshort(inf);
    image->ysize = getshort(inf);
    image->zsize = getshort(inf);
}

static int writeheader(outf,image)
FILE *outf;
IMAGE *image;
{
    IMAGE t;

    memset(&t,0,sizeof(IMAGE));
    fwrite(&t,sizeof(IMAGE),1,outf);
    fseek(outf,0,SEEK_SET);
    putshort(outf,image->imagic);
    putshort(outf,image->type);
    putshort(outf,image->dim);
    putshort(outf,image->xsize);
    putshort(outf,image->ysize);
    putshort(outf,image->zsize);
    putlong(outf,image->min);
    putlong(outf,image->max);
    putlong(outf,0);
    return fwrite("no name",8,1,outf);
}

static int writetab(outf,tab,len)
FILE *outf;
/*unsigned*/ long *tab;
int len;
{
    int r = 0;

    while(len) {
	r = putlong(outf,*tab++);
	len -= 4;
    }
    return r;
}

static void readtab(inf,tab,len)
FILE *inf;
/*unsigned*/ long *tab;
int len;
{
    while(len) {
	*tab++ = getlong(inf);
	len -= 4;
    }
}

/*
 *	sizeofimage - 
 *		return the xsize and ysize of an iris image file.
 *
 */
static PyObject *
sizeofimage(self, args)
    PyObject *self, *args;
{
    char *name;
    IMAGE image;
    FILE *inf;

    if (!PyArg_Parse(args, "s", &name))
	return NULL;

    inf = fopen(name,"r");
    if(!inf) {
	PyErr_SetString(ImgfileError, "can't open image file");
	return NULL;
    }
    readheader(inf,&image);
    fclose(inf);
    if(image.imagic != IMAGIC) {
	PyErr_SetString(ImgfileError, "bad magic number in image file");
	return NULL;
    }
    return Py_BuildValue("(ii)", image.xsize, image.ysize);
}

/*
 *	longimagedata - 
 *		read in a B/W RGB or RGBA iris image file and return a 
 *	pointer to an array of longs.
 *
 */
static PyObject *
longimagedata(self, args)
    PyObject *self, *args;
{
    char *name;
    unsigned char *base, *lptr;
    unsigned char *rledat, *verdat;
    long *starttab, *lengthtab;
    FILE *inf;
    IMAGE image;
    int y, z, tablen;
    int xsize, ysize, zsize;
    int bpp, rle, cur, badorder;
    int rlebuflen;
    PyObject *rv;

    if (!PyArg_Parse(args, "s", &name))
	return NULL;

    inf = fopen(name,"r");
    if(!inf) {
	PyErr_SetString(ImgfileError,"can't open image file");
	return NULL;
    }
    readheader(inf,&image);
    if(image.imagic != IMAGIC) {
	PyErr_SetString(ImgfileError,"bad magic number in image file");
	fclose(inf);
	return NULL;
    }
    rle = ISRLE(image.type);
    bpp = BPP(image.type);
    if(bpp != 1 ) {
	PyErr_SetString(ImgfileError,"image must have 1 byte per pix chan");
	fclose(inf);
	return NULL;
    }
    xsize = image.xsize;
    ysize = image.ysize;
    zsize = image.zsize;
    if(rle) {
	tablen = ysize*zsize*sizeof(long);
	starttab = (long *)malloc(tablen);
	lengthtab = (long *)malloc(tablen);
	rlebuflen = 1.05*xsize+10;
	rledat = (unsigned char *)malloc(rlebuflen);
	fseek(inf,512,SEEK_SET);
 	readtab(inf,starttab,tablen);
	readtab(inf,lengthtab,tablen);

/* check data order */
	cur = 0;
	badorder = 0;
	for(y=0; y<ysize; y++) {
	    for(z=0; z<zsize; z++) {
		if(starttab[y+z*ysize]<cur) {
		    badorder = 1;
		    break;
		}
		cur = starttab[y+z*ysize];
	    }
	    if(badorder) 
		break;
	}

	fseek(inf,512+2*tablen,SEEK_SET);
	cur = 512+2*tablen;
	rv = PyString_FromStringAndSize((char *) 0,
					(xsize*ysize+TAGLEN)*sizeof(long));
	if (rv == NULL) {
	    fclose(inf);
	    free(lengthtab);
	    free(starttab);
	    free(rledat);
	    return NULL;
	}
	base = (unsigned char *) PyString_AsString(rv);
#ifdef ADD_TAGS
	addlongimgtag(base,xsize,ysize);
#endif
  	if(badorder) {
	    for(z=0; z<zsize; z++) {
		lptr = base;
		if (reverse_order)
		    lptr += (ysize - 1) * xsize * sizeof(unsigned long);
		for(y=0; y<ysize; y++) {
		    if(cur != starttab[y+z*ysize]) {
			fseek(inf,starttab[y+z*ysize],SEEK_SET);
			cur = starttab[y+z*ysize];
		    }
		    if(lengthtab[y+z*ysize]>rlebuflen) {
			PyErr_SetString(ImgfileError,
					"rlebuf is too small - bad poop");
			fclose(inf);
			Py_DECREF(rv);
			free(rledat);
			free(starttab);
			free(lengthtab);
			return NULL;
		    }
		    fread(rledat,lengthtab[y+z*ysize],1,inf);
		    cur += lengthtab[y+z*ysize];
		    expandrow(lptr,rledat,3-z);
		    if (reverse_order)
			lptr -= xsize * sizeof(unsigned long);
		    else
			lptr += xsize * sizeof(unsigned long);
		}
	    }
	} else {
	    lptr = base;
	    if (reverse_order)
		lptr += (ysize - 1) * xsize * sizeof(unsigned long);
	    for(y=0; y<ysize; y++) {
		for(z=0; z<zsize; z++) {
		    if(cur != starttab[y+z*ysize]) {
			fseek(inf,starttab[y+z*ysize],SEEK_SET);
			cur = starttab[y+z*ysize];
		    }
		    fread(rledat,lengthtab[y+z*ysize],1,inf);
		    cur += lengthtab[y+z*ysize];
		    expandrow(lptr,rledat,3-z);
		}
		if (reverse_order)
		    lptr -= xsize * sizeof(unsigned long);
		else
		    lptr += xsize * sizeof(unsigned long);
	    }
    	}
	if(zsize == 3) 
	    setalpha(base,xsize*ysize);
	else if(zsize<3) 
	    copybw((long *) base,xsize*ysize);
	fclose(inf);
	free(starttab);
	free(lengthtab);
	free(rledat);
	return rv;
    } else {
	rv = PyString_FromStringAndSize((char *) 0,
					(xsize*ysize+TAGLEN)*sizeof(long));
	if (rv == NULL) {
	    fclose(inf);
	    return NULL;
	}
	base = (unsigned char *) PyString_AsString(rv);
#ifdef ADD_TAGS
	addlongimgtag(base,xsize,ysize);
#endif
	verdat = (unsigned char *)malloc(xsize);
	fseek(inf,512,SEEK_SET);
	for(z=0; z<zsize; z++) {
	    lptr = base;
	    if (reverse_order)
		lptr += (ysize - 1) * xsize * sizeof(unsigned long);
	    for(y=0; y<ysize; y++) {
		fread(verdat,xsize,1,inf);
		interleaverow(lptr,verdat,3-z,xsize);
		if (reverse_order)
		    lptr -= xsize * sizeof(unsigned long);
		else
		    lptr += xsize * sizeof(unsigned long);
	    }
	}
	if(zsize == 3) 
	    setalpha(base,xsize*ysize);
	else if(zsize<3) 
	    copybw((long *) base,xsize*ysize);
	fclose(inf);
	free(verdat);
	return rv;
    }
}

/* static utility functions for longimagedata */

static void interleaverow(lptr,cptr,z,n)
unsigned char *lptr, *cptr;
int z, n;
{
    lptr += z;
    while(n--) {
	*lptr = *cptr++;
	lptr += 4;
    }
}

static void copybw(lptr,n)
long *lptr;
int n;
{
    while(n>=8) {
	lptr[0] = 0xff000000+(0x010101*(lptr[0]&0xff));
	lptr[1] = 0xff000000+(0x010101*(lptr[1]&0xff));
	lptr[2] = 0xff000000+(0x010101*(lptr[2]&0xff));
	lptr[3] = 0xff000000+(0x010101*(lptr[3]&0xff));
	lptr[4] = 0xff000000+(0x010101*(lptr[4]&0xff));
	lptr[5] = 0xff000000+(0x010101*(lptr[5]&0xff));
	lptr[6] = 0xff000000+(0x010101*(lptr[6]&0xff));
	lptr[7] = 0xff000000+(0x010101*(lptr[7]&0xff));
	lptr += 8;
	n-=8;
    }
    while(n--) {
	*lptr = 0xff000000+(0x010101*(*lptr&0xff));
	lptr++;
    }
}

static void setalpha(lptr,n)
unsigned char *lptr;
{
    while(n>=8) {
	lptr[0*4] = 0xff;
	lptr[1*4] = 0xff;
	lptr[2*4] = 0xff;
	lptr[3*4] = 0xff;
	lptr[4*4] = 0xff;
	lptr[5*4] = 0xff;
	lptr[6*4] = 0xff;
	lptr[7*4] = 0xff;
	lptr += 4*8;
	n -= 8;
    }
    while(n--) {
	*lptr = 0xff;
	lptr += 4;
    }
}

static void expandrow(optr,iptr,z)
unsigned char *optr, *iptr;
int z;
{
    unsigned char pixel, count;

    optr += z;
    while(1) {
	pixel = *iptr++;
	if ( !(count = (pixel & 0x7f)) )
	    return;
	if(pixel & 0x80) {
	    while(count>=8) {
		optr[0*4] = iptr[0];
		optr[1*4] = iptr[1];
		optr[2*4] = iptr[2];
		optr[3*4] = iptr[3];
		optr[4*4] = iptr[4];
		optr[5*4] = iptr[5];
		optr[6*4] = iptr[6];
		optr[7*4] = iptr[7];
		optr += 8*4;
		iptr += 8;
		count -= 8;
	    }
	    while(count--) {
		*optr = *iptr++;
		optr+=4;
	    }
	} else {
	    pixel = *iptr++;
	    while(count>=8) {
		optr[0*4] = pixel;
		optr[1*4] = pixel;
		optr[2*4] = pixel;
		optr[3*4] = pixel;
		optr[4*4] = pixel;
		optr[5*4] = pixel;
		optr[6*4] = pixel;
		optr[7*4] = pixel;
		optr += 8*4;
		count -= 8;
	    }
	    while(count--) {
		*optr = pixel;
		optr+=4;
	    }
	}
    }
}

/*
 *	longstoimage -
 *		copy an array of longs to an iris image file.  Each long
 *	represents one pixel.  xsize and ysize specify the dimensions of
 *	the pixel array.  zsize specifies what kind of image file to
 *	write out.  if zsize is 1, the luminance of the pixels are
 *	calculated, and a sinlge channel black and white image is saved.
 *	If zsize is 3, an RGB image file is saved.  If zsize is 4, an
 *	RGBA image file is saved.
 *
 */
static PyObject *
longstoimage(self, args)
    PyObject *self, *args;
{
    unsigned char *lptr;
    char *name;
    int xsize, ysize, zsize;
    FILE *outf;
    IMAGE image;
    int tablen, y, z, pos, len;
    long *starttab, *lengthtab;
    unsigned char *rlebuf;
    unsigned char *lumbuf;
    int rlebuflen, goodwrite;

    if (!PyArg_Parse(args, "(s#iiis)", &lptr, &len, &xsize, &ysize, &zsize,
		     &name))
	return NULL;

    goodwrite = 1;
    outf = fopen(name,"w");
    if(!outf) {
	PyErr_SetString(ImgfileError,"can't open output file");
	return NULL;
    }
    tablen = ysize*zsize*sizeof(long);

    starttab = (long *)malloc(tablen);
    lengthtab = (long *)malloc(tablen);
    rlebuflen = 1.05*xsize+10;
    rlebuf = (unsigned char *)malloc(rlebuflen);
    lumbuf = (unsigned char *)malloc(xsize*sizeof(long));

    memset(&image,0,sizeof(IMAGE));
    image.imagic = IMAGIC; 
    image.type = RLE(1);
    if(zsize>1)
	image.dim = 3;
    else
	image.dim = 2;
    image.xsize = xsize;
    image.ysize = ysize;
    image.zsize = zsize;
    image.min = 0;
    image.max = 255;
    goodwrite *= writeheader(outf,&image);
    fseek(outf,512+2*tablen,SEEK_SET);
    pos = 512+2*tablen;
    if (reverse_order)
	lptr += (ysize - 1) * xsize * sizeof(unsigned long);
    for(y=0; y<ysize; y++) {
	for(z=0; z<zsize; z++) {
	    if(zsize == 1) {
		lumrow(lptr,lumbuf,xsize);
		len = compressrow(lumbuf,rlebuf,CHANOFFSET(z),xsize);
	    } else {
		len = compressrow(lptr,rlebuf,CHANOFFSET(z),xsize);
	    }
	    if(len>rlebuflen) {
		PyErr_SetString(ImgfileError,"rlebuf is too small - bad poop");
		free(starttab);
		free(lengthtab);
		free(rlebuf);
		free(lumbuf);
		fclose(outf);
		return NULL;
	    }
	    goodwrite *= fwrite(rlebuf,len,1,outf);
	    starttab[y+z*ysize] = pos;
	    lengthtab[y+z*ysize] = len;
	    pos += len;
	}
	if (reverse_order)
	    lptr -= xsize * sizeof(unsigned long);
	else
	    lptr += xsize * sizeof(unsigned long);
    }

    fseek(outf,512,SEEK_SET);
    goodwrite *= writetab(outf,starttab,tablen);
    goodwrite *= writetab(outf,lengthtab,tablen);
    free(starttab);
    free(lengthtab);
    free(rlebuf);
    free(lumbuf);
    fclose(outf);
    if(goodwrite) {
	Py_INCREF(Py_None);
	return Py_None;
    } else {
	PyErr_SetString(ImgfileError,"not enough space for image!!");
	return NULL;
    }
}

/* static utility functions for longstoimage */

static void lumrow(rgbptr,lumptr,n) 
unsigned char *rgbptr, *lumptr;
int n;
{
    lumptr += CHANOFFSET(0);
    while(n--) {
	*lumptr = ILUM(rgbptr[OFFSET_R],rgbptr[OFFSET_G],rgbptr[OFFSET_B]);
	lumptr += 4;
	rgbptr += 4;
    }
}

static int compressrow(lbuf,rlebuf,z,cnt)
unsigned char *lbuf, *rlebuf;
int z, cnt;
{
    unsigned char *iptr, *ibufend, *sptr, *optr;
    short todo, cc;							
    long count;

    lbuf += z;
    iptr = lbuf;
    ibufend = iptr+cnt*4;
    optr = rlebuf;

    while(iptr<ibufend) {
	sptr = iptr;
	iptr += 8;
	while((iptr<ibufend)&& ((iptr[-8]!=iptr[-4])||(iptr[-4]!=iptr[0])))
	    iptr+=4;
	iptr -= 8;
	count = (iptr-sptr)/4;
	while(count) {
	    todo = count>126 ? 126:count;
	    count -= todo;
	    *optr++ = 0x80|todo;
	    while(todo>8) {
		optr[0] = sptr[0*4];
		optr[1] = sptr[1*4];
		optr[2] = sptr[2*4];
		optr[3] = sptr[3*4];
		optr[4] = sptr[4*4];
		optr[5] = sptr[5*4];
		optr[6] = sptr[6*4];
		optr[7] = sptr[7*4];
		optr += 8;
		sptr += 8*4;
		todo -= 8;
	    }
	    while(todo--) {
		*optr++ = *sptr;
		sptr += 4;
	    }
	}
	sptr = iptr;
	cc = *iptr;
	iptr += 4;
	while( (iptr<ibufend) && (*iptr == cc) )
	    iptr += 4;
	count = (iptr-sptr)/4;
	while(count) {
	    todo = count>126 ? 126:count;
	    count -= todo;
	    *optr++ = todo;
	    *optr++ = cc;
	}
    }
    *optr++ = 0;
    return optr - (unsigned char *)rlebuf;
}

static PyObject *
ttob(self, args)
    PyObject *self;
    PyObject *args;
{
    int order, oldorder;

    if (!PyArg_Parse(args, "i", &order))
	return NULL;
    oldorder = reverse_order;
    reverse_order = order;
    return PyInt_FromLong(oldorder);
}

static PyMethodDef rgbimg_methods[] = {
    {"sizeofimage",	sizeofimage},
    {"longimagedata",	longimagedata},
    {"longstoimage",	longstoimage},
    {"ttob",		ttob},
    {NULL, NULL}		/* sentinel */
};

void
initrgbimg()
{
    PyObject *m, *d;
    m = Py_InitModule("rgbimg", rgbimg_methods);
    d = PyModule_GetDict(m);
    ImgfileError = PyString_FromString("rgbimg.error");
    if (ImgfileError == NULL || PyDict_SetItemString(d, "error", ImgfileError))
	Py_FatalError("can't define rgbimg.error");
}
