/***********************************************************
Copyright 1991, 1992 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 not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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.

******************************************************************/

/* IMGFILE module - Interface to sgi libimage */

/* XXX This modele should be done better at some point. It should return
** an object of image file class, and have routines to manipulate these
** image files in a neater way (so you can get rgb images off a greyscale
** file, for instance, or do a straight display without having to get the
** image bits into python, etc).
*/

#include "allobjects.h"
#include "modsupport.h"

#include <gl/image.h>
#include <errno.h>

static object * ImgfileError; /* Exception we raise for various trouble */


/* The image library does not always call the error hander :-(,
   therefore we have a global variable indicating that it was called.
   It is cleared by imgfile_open(). */

static int error_called;


/* The error handler */

static imgfile_error(str)
    char *str;
{
    err_setstr(ImgfileError, str);
    error_called = 1;
    return;	/* To imglib, which will return a failure indictaor */
}


/* Open an image file and return a pointer to it.
   Make sure we raise an exception if we fail. */

static IMAGE *
imgfile_open(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_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;
    
    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;
    for ( y=0; y < ysize && !error_called; y++ ) {
	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 ) {
	DECREF(rv);
	return NULL;
    }
    return rv;
}


static object *
imgfile_readscaled(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;
    int xwtd, ywtd, xorig, yorig;
    float xfac, yfac;
    int cnt;
    IMAGE *image;
    
    if ( !getargs(args, "(sii)", &fname, &xwtd, &ywtd) )
      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(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;
    for ( y=0; y < ywtd && !error_called; y++ ) {
	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 ) {
	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;

    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;
    
    for( y=0; y<ysize && !error_called; y++ ) {
	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;
    
}


static struct methodlist imgfile_methods[] = {
    { "getsizes",	imgfile_getsizes },
    { "read",		imgfile_read },
    { "readscaled",	imgfile_readscaled },
    { "write",		imgfile_write },
    { 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");
}
