
/* imageopmodule - Various operations on pictures */

#ifdef sun
#define signed
#endif

#include "Python.h"

#if SIZEOF_INT == 4
typedef int Py_Int32;
typedef unsigned int Py_UInt32;
#else
#if SIZEOF_LONG == 4
typedef long Py_Int32;
typedef unsigned long Py_UInt32;
#else
#error "No 4-byte integral type"
#endif
#endif

#define CHARP(cp, xmax, x, y) ((char *)(cp+y*xmax+x))
#define SHORTP(cp, xmax, x, y) ((short *)(cp+2*(y*xmax+x)))
#define LONGP(cp, xmax, x, y) ((Py_Int32 *)(cp+4*(y*xmax+x)))

static PyObject *ImageopError;
static PyObject *ImageopDict;

/**
 * Check a coordonnate, make sure that (0 < value).
 * Return 0 on error.
 */
static int
check_coordonnate(int value, const char* name)
{
	if ( 0 < value)
		return 1;
	PyErr_Format(PyExc_ValueError, "%s value is negative or nul", name);
	return 0;
}

/**
 * Check integer overflow to make sure that product == x*y*size.
 * Return 0 on error.
 */
static int
check_multiply_size(int product, int x, const char* xname, int y, const char* yname, int size)
{
	if ( !check_coordonnate(x, xname) )
		return 0;
	if ( !check_coordonnate(y, yname) )
		return 0;
	if ( size == (product / y) / x )
		return 1;
	PyErr_SetString(ImageopError, "String has incorrect length");
	return 0;
}

/**
 * Check integer overflow to make sure that product == x*y.
 * Return 0 on error.
 */
static int
check_multiply(int product, int x, int y)
{
	return check_multiply_size(product, x, "x", y, "y", 1);
}

/* If this function returns true (the default if anything goes wrong), we're
   behaving in a backward-compatible way with respect to how multi-byte pixels
   are stored in the strings.  The code in this module was originally written
   for an SGI which is a big-endian system, and so the old code assumed that
   4-byte integers hold the R, G, and B values in a particular order.
   However, on little-endian systems the order is reversed, and so not
   actually compatible with what gl.lrectwrite and imgfile expect.
   (gl.lrectwrite and imgfile are also SGI-specific, however, it is
   conceivable that the data handled here comes from or goes to an SGI or that
   it is otherwise used in the expectation that the byte order in the strings
   is as specified.)

   The function returns the value of the module variable
   "backward_compatible", or 1 if the variable does not exist or is not an
   int.
 */

static int
imageop_backward_compatible(void)
{
	static PyObject *bcos;
	PyObject *bco;
	long rc;

	if (ImageopDict == NULL) /* "cannot happen" */
		return 1;
	if (bcos == NULL) {
		/* cache string object for future use */
		bcos = PyString_FromString("backward_compatible");
		if (bcos == NULL)
			return 1;
	}
	bco = PyDict_GetItem(ImageopDict, bcos);
	if (bco == NULL)
		return 1;
	if (!PyInt_Check(bco))
		return 1;
	rc = PyInt_AsLong(bco);
	if (PyErr_Occurred()) {
		/* not an integer, or too large, or something */
		PyErr_Clear();
		rc = 1;
	}
	return rc != 0;		/* convert to values 0, 1 */
}

static PyObject *
imageop_crop(PyObject *self, PyObject *args)
{
	char *cp, *ncp;
	short *nsp;
	Py_Int32 *nlp;
	int len, size, x, y, newx1, newx2, newy1, newy2, nlen;
	int ix, iy, xstep, ystep;
	PyObject *rv;

	if ( !PyArg_ParseTuple(args, "s#iiiiiii", &cp, &len, &size, &x, &y,
			  &newx1, &newy1, &newx2, &newy2) )
		return 0;

	if ( size != 1 && size != 2 && size != 4 ) {
		PyErr_SetString(ImageopError, "Size should be 1, 2 or 4");
		return 0;
	}
	if ( !check_multiply_size(len, x, "x", y, "y", size) )
		return 0;

	xstep = (newx1 < newx2)? 1 : -1;
	ystep = (newy1 < newy2)? 1 : -1;

        nlen = (abs(newx2-newx1)+1)*(abs(newy2-newy1)+1)*size;
	if ( !check_multiply_size(nlen, abs(newx2-newx1)+1, "abs(newx2-newx1)+1", abs(newy2-newy1)+1, "abs(newy2-newy1)+1", size) )
		return 0;
	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (char *)PyString_AsString(rv);
	nsp = (short *)ncp;
	nlp = (Py_Int32 *)ncp;
	newy2 += ystep;
	newx2 += xstep;
	for( iy = newy1; iy != newy2; iy+=ystep ) {
		for ( ix = newx1; ix != newx2; ix+=xstep ) {
			if ( iy < 0 || iy >= y || ix < 0 || ix >= x ) {
				if ( size == 1 )
					*ncp++ = 0;
				else
					*nlp++ = 0;
			} else {
				if ( size == 1 )
					*ncp++ = *CHARP(cp, x, ix, iy);
				else if ( size == 2 )
					*nsp++ = *SHORTP(cp, x, ix, iy);
				else
					*nlp++ = *LONGP(cp, x, ix, iy);
			}
		}
	}
	return rv;
}

static PyObject *
imageop_scale(PyObject *self, PyObject *args)
{
	char *cp, *ncp;
	short *nsp;
	Py_Int32 *nlp;
	int len, size, x, y, newx, newy, nlen;
	int ix, iy;
	int oix, oiy;
	PyObject *rv;

	if ( !PyArg_ParseTuple(args, "s#iiiii",
			  &cp, &len, &size, &x, &y, &newx, &newy) )
		return 0;

	if ( size != 1 && size != 2 && size != 4 ) {
		PyErr_SetString(ImageopError, "Size should be 1, 2 or 4");
		return 0;
	}
	if ( !check_multiply_size(len, x, "x", y, "y", size) )
		return 0;
        nlen = newx*newy*size;
	if ( !check_multiply_size(nlen, newx, "newx", newy, "newy", size) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (char *)PyString_AsString(rv);
	nsp = (short *)ncp;
	nlp = (Py_Int32 *)ncp;
	for( iy = 0; iy < newy; iy++ ) {
		for ( ix = 0; ix < newx; ix++ ) {
			oix = ix * x / newx;
			oiy = iy * y / newy;
			if ( size == 1 )
				*ncp++ = *CHARP(cp, x, oix, oiy);
			else if ( size == 2 )
				*nsp++ = *SHORTP(cp, x, oix, oiy);
			else
				*nlp++ = *LONGP(cp, x, oix, oiy);
		}
	}
	return rv;
}

/* Note: this routine can use a bit of optimizing */

static PyObject *
imageop_tovideo(PyObject *self, PyObject *args)
{
	int maxx, maxy, x, y, len;
	int i;
	unsigned char *cp, *ncp;
	int width;
	PyObject *rv;


	if ( !PyArg_ParseTuple(args, "s#iii", &cp, &len, &width, &maxx, &maxy) )
		return 0;

	if ( width != 1 && width != 4 ) {
		PyErr_SetString(ImageopError, "Size should be 1 or 4");
		return 0;
	}
	if ( !check_multiply_size(len, maxx, "max", maxy, "maxy", width) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, len);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	if ( width == 1 ) {
		memcpy(ncp, cp, maxx);		/* Copy first line */
		ncp += maxx;
		for (y=1; y<maxy; y++) {	/* Interpolate other lines */
			for(x=0; x<maxx; x++) {
				i = y*maxx + x;
				*ncp++ = ((int)cp[i] + (int)cp[i-maxx]) >> 1;
			}
		}
	} else {
		memcpy(ncp, cp, maxx*4);		/* Copy first line */
		ncp += maxx*4;
		for (y=1; y<maxy; y++) {	/* Interpolate other lines */
			for(x=0; x<maxx; x++) {
				i = (y*maxx + x)*4 + 1;
				*ncp++ = 0;	/* Skip alfa comp */
				*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
				i++;
				*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
				i++;
				*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
			}
		}
	}
	return rv;
}

static PyObject *
imageop_grey2mono(PyObject *self, PyObject *args)
{
	int tres, x, y, len;
	unsigned char *cp, *ncp;
	unsigned char ovalue;
	PyObject *rv;
	int i, bit;


	if ( !PyArg_ParseTuple(args, "s#iii", &cp, &len, &x, &y, &tres) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, (len+7)/8);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	bit = 0x80;
	ovalue = 0;
	for ( i=0; i < len; i++ ) {
		if ( (int)cp[i] > tres )
			ovalue |= bit;
		bit >>= 1;
		if ( bit == 0 ) {
			*ncp++ = ovalue;
			bit = 0x80;
			ovalue = 0;
		}
	}
	if ( bit != 0x80 )
		*ncp++ = ovalue;
	return rv;
}

static PyObject *
imageop_grey2grey4(PyObject *self, PyObject *args)
{
	int x, y, len;
	unsigned char *cp, *ncp;
	unsigned char ovalue;
	PyObject *rv;
	int i;
	int pos;


	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, (len+1)/2);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);
	pos = 0;
	ovalue = 0;
	for ( i=0; i < len; i++ ) {
		ovalue |= ((int)cp[i] & 0xf0) >> pos;
		pos += 4;
		if ( pos == 8 ) {
			*ncp++ = ovalue;
			ovalue = 0;
			pos = 0;
		}
	}
	if ( pos != 0 )
		*ncp++ = ovalue;
	return rv;
}

static PyObject *
imageop_grey2grey2(PyObject *self, PyObject *args)
{
	int x, y, len;
	unsigned char *cp, *ncp;
	unsigned char ovalue;
	PyObject *rv;
	int i;
	int pos;


	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, (len+3)/4);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);
	pos = 0;
	ovalue = 0;
	for ( i=0; i < len; i++ ) {
		ovalue |= ((int)cp[i] & 0xc0) >> pos;
		pos += 2;
		if ( pos == 8 ) {
			*ncp++ = ovalue;
			ovalue = 0;
			pos = 0;
		}
	}
	if ( pos != 0 )
		*ncp++ = ovalue;
	return rv;
}

static PyObject *
imageop_dither2mono(PyObject *self, PyObject *args)
{
	int sum, x, y, len;
	unsigned char *cp, *ncp;
	unsigned char ovalue;
	PyObject *rv;
	int i, bit;


	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, (len+7)/8);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	bit = 0x80;
	ovalue = 0;
	sum = 0;
	for ( i=0; i < len; i++ ) {
		sum += cp[i];
		if ( sum >= 256 ) {
			sum -= 256;
			ovalue |= bit;
		}
		bit >>= 1;
		if ( bit == 0 ) {
			*ncp++ = ovalue;
			bit = 0x80;
			ovalue = 0;
		}
	}
	if ( bit != 0x80 )
		*ncp++ = ovalue;
	return rv;
}

static PyObject *
imageop_dither2grey2(PyObject *self, PyObject *args)
{
	int x, y, len;
	unsigned char *cp, *ncp;
	unsigned char ovalue;
	PyObject *rv;
	int i;
	int pos;
	int sum = 0, nvalue;


	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, (len+3)/4);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);
	pos = 1;
	ovalue = 0;
	for ( i=0; i < len; i++ ) {
		sum += cp[i];
		nvalue = sum & 0x180;
		sum -= nvalue;
		ovalue |= nvalue >> pos;
		pos += 2;
		if ( pos == 9 ) {
			*ncp++ = ovalue;
			ovalue = 0;
			pos = 1;
		}
	}
	if ( pos != 0 )
		*ncp++ = ovalue;
	return rv;
}

static PyObject *
imageop_mono2grey(PyObject *self, PyObject *args)
{
	int v0, v1, x, y, len, nlen;
	unsigned char *cp, *ncp;
	PyObject *rv;
	int i, bit;

	if ( !PyArg_ParseTuple(args, "s#iiii", &cp, &len, &x, &y, &v0, &v1) )
		return 0;

        nlen = x*y;
	if ( !check_multiply(nlen, x, y) )
		return 0;
	if ( (nlen+7)/8 != len ) {
		PyErr_SetString(ImageopError, "String has incorrect length");
		return 0;
	}

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	bit = 0x80;
	for ( i=0; i < nlen; i++ ) {
		if ( *cp & bit )
			*ncp++ = v1;
		else
			*ncp++ = v0;
		bit >>= 1;
		if ( bit == 0 ) {
			bit = 0x80;
			cp++;
		}
	}
	return rv;
}

static PyObject *
imageop_grey22grey(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp, *ncp;
	PyObject *rv;
	int i, pos, value = 0, nvalue;

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	nlen = x*y;
	if ( !check_multiply(nlen, x, y) ) {
		return 0;
	}
	if ( (nlen+3)/4 != len ) {
		PyErr_SetString(ImageopError, "String has incorrect length");
		return 0;
	}

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	pos = 0;
	for ( i=0; i < nlen; i++ ) {
		if ( pos == 0 ) {
			value = *cp++;
			pos = 8;
		}
		pos -= 2;
		nvalue = (value >> pos) & 0x03;
		*ncp++ = nvalue | (nvalue << 2) |
			 (nvalue << 4) | (nvalue << 6);
	}
	return rv;
}

static PyObject *
imageop_grey42grey(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp, *ncp;
	PyObject *rv;
	int i, pos, value = 0, nvalue;

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	nlen = x*y;
	if ( !check_multiply(nlen, x, y) )
		return 0;
	if ( (nlen+1)/2 != len ) {
		PyErr_SetString(ImageopError, "String has incorrect length");
		return 0;
	}

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	pos = 0;
	for ( i=0; i < nlen; i++ ) {
		if ( pos == 0 ) {
			value = *cp++;
			pos = 8;
		}
		pos -= 4;
		nvalue = (value >> pos) & 0x0f;
		*ncp++ = nvalue | (nvalue << 4);
	}
	return rv;
}

static PyObject *
imageop_rgb2rgb8(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp;
	unsigned char *ncp;
	PyObject *rv;
	int i, r, g, b;
	int backward_compatible = imageop_backward_compatible();

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply_size(len, x, "x", y, "y", 4) )
		return 0;
	nlen = x*y;
	if ( !check_multiply(nlen, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	for ( i=0; i < nlen; i++ ) {
		/* Bits in source: aaaaaaaa BBbbbbbb GGGggggg RRRrrrrr */
		if (backward_compatible) {
			Py_UInt32 value = * (Py_UInt32 *) cp;
			cp += 4;
			r = (int) ((value & 0xff) / 255. * 7. + .5);
			g = (int) (((value >> 8) & 0xff) / 255. * 7. + .5);
			b = (int) (((value >> 16) & 0xff) / 255. * 3. + .5);
		} else {
			cp++;		/* skip alpha channel */
			b = (int) (*cp++ / 255. * 3. + .5);
			g = (int) (*cp++ / 255. * 7. + .5);
			r = (int) (*cp++ / 255. * 7. + .5);
		}
		*ncp++ = (unsigned char)((r<<5) | (b<<3) | g);
	}
	return rv;
}

static PyObject *
imageop_rgb82rgb(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp;
	unsigned char *ncp;
	PyObject *rv;
	int i, r, g, b;
	unsigned char value;
	int backward_compatible = imageop_backward_compatible();

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;
	nlen = x*y*4;
	if ( !check_multiply_size(nlen, x, "x", y, "y", 4) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	for ( i=0; i < len; i++ ) {
		/* Bits in source: RRRBBGGG
		** Red and Green are multiplied by 36.5, Blue by 85
		*/
		value = *cp++;
		r = (value >> 5) & 7;
		g = (value     ) & 7;
		b = (value >> 3) & 3;
		r = (r<<5) | (r<<3) | (r>>1);
		g = (g<<5) | (g<<3) | (g>>1);
		b = (b<<6) | (b<<4) | (b<<2) | b;
		if (backward_compatible) {
			Py_UInt32 nvalue = r | (g<<8) | (b<<16);
			* (Py_UInt32 *) ncp = nvalue;
			ncp += 4;
		} else {
			*ncp++ = 0;
			*ncp++ = b;
			*ncp++ = g;
			*ncp++ = r;
		}
	}
	return rv;
}

static PyObject *
imageop_rgb2grey(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp;
	unsigned char *ncp;
	PyObject *rv;
	int i, r, g, b;
	int nvalue;
	int backward_compatible = imageop_backward_compatible();

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply_size(len, x, "x", y, "y", 4) )
		return 0;
	nlen = x*y;
	if ( !check_multiply(nlen, x, y) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	for ( i=0; i < nlen; i++ ) {
		if (backward_compatible) {
			Py_UInt32 value = * (Py_UInt32 *) cp;
			cp += 4;
			r = (int) ((value & 0xff) / 255. * 7. + .5);
			g = (int) (((value >> 8) & 0xff) / 255. * 7. + .5);
			b = (int) (((value >> 16) & 0xff) / 255. * 3. + .5);
		} else {
			cp++;		/* skip alpha channel */
			b = *cp++;
			g = *cp++;
			r = *cp++;
		}
		nvalue = (int)(0.30*r + 0.59*g + 0.11*b);
		if ( nvalue > 255 ) nvalue = 255;
		*ncp++ = (unsigned char)nvalue;
	}
	return rv;
}

static PyObject *
imageop_grey2rgb(PyObject *self, PyObject *args)
{
	int x, y, len, nlen;
	unsigned char *cp;
	unsigned char *ncp;
	PyObject *rv;
	int i;
	unsigned char value;
	int backward_compatible = imageop_backward_compatible();

	if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) )
		return 0;

	if ( !check_multiply(len, x, y) )
		return 0;
        nlen = x*y*4;
	if ( !check_multiply_size(nlen, x, "x", y, "y", 4) )
		return 0;

	rv = PyString_FromStringAndSize(NULL, nlen);
	if ( rv == 0 )
		return 0;
	ncp = (unsigned char *)PyString_AsString(rv);

	for ( i=0; i < len; i++ ) {
		value = *cp++;
		if (backward_compatible) {
			* (Py_UInt32 *) ncp = (Py_UInt32) value | ((Py_UInt32) value << 8 ) | ((Py_UInt32) value << 16);
			ncp += 4;
		} else {
			*ncp++ = 0;
			*ncp++ = value;
			*ncp++ = value;
			*ncp++ = value;
		}
	}
	return rv;
}

static PyMethodDef imageop_methods[] = {
	{ "crop",		imageop_crop, METH_VARARGS },
	{ "scale",		imageop_scale, METH_VARARGS },
	{ "grey2mono",	        imageop_grey2mono, METH_VARARGS },
	{ "grey2grey2",	        imageop_grey2grey2, METH_VARARGS },
	{ "grey2grey4",	        imageop_grey2grey4, METH_VARARGS },
	{ "dither2mono",	imageop_dither2mono, METH_VARARGS },
	{ "dither2grey2",	imageop_dither2grey2, METH_VARARGS },
	{ "mono2grey",	        imageop_mono2grey, METH_VARARGS },
	{ "grey22grey",	        imageop_grey22grey, METH_VARARGS },
	{ "grey42grey",	        imageop_grey42grey, METH_VARARGS },
	{ "tovideo",	        imageop_tovideo, METH_VARARGS },
	{ "rgb2rgb8",	        imageop_rgb2rgb8, METH_VARARGS },
	{ "rgb82rgb",	        imageop_rgb82rgb, METH_VARARGS },
	{ "rgb2grey",	        imageop_rgb2grey, METH_VARARGS },
	{ "grey2rgb",	        imageop_grey2rgb, METH_VARARGS },
	{ 0,                    0 }
};


PyMODINIT_FUNC
initimageop(void)
{
	PyObject *m;

	if (PyErr_WarnPy3k("the imageop module has been removed in "
	                   "Python 3.0", 2) < 0)
	    return;

	m = Py_InitModule("imageop", imageop_methods);
	if (m == NULL)
		return;
	ImageopDict = PyModule_GetDict(m);
	ImageopError = PyErr_NewException("imageop.error", NULL, NULL);
	if (ImageopError != NULL)
		PyDict_SetItemString(ImageopDict, "error", ImageopError);
}
