| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1995-01-04 19:10:35 +00:00
										 |  |  | Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							|  |  |  | The Netherlands. | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | /* IMGFILE module - Interface to sgi libimage */ | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | /* XXX This modele should be done better at some point. It should return
 | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | ** 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). | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | ** | 
					
						
							|  |  |  | ** Warning: this module is very non-reentrant (esp. the readscaled stuff) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "allobjects.h"
 | 
					
						
							|  |  |  | #include "modsupport.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gl/image.h>
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | #include <errno.h>
 | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-01-19 15:33:13 +00:00
										 |  |  | #include "/usr/people/4Dgifts/iristools/include/izoom.h"
 | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | static object * ImgfileError; /* Exception we raise for various trouble */ | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  | static int top_to_bottom;	/* True if we want top-to-bottom images */ | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | /* 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(). */ | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  | static int error_called; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* The error handler */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  | static imgfile_error(str) | 
					
						
							|  |  |  |     char *str; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     err_setstr(ImgfileError, str); | 
					
						
							|  |  |  |     error_called = 1; | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  |     return;	/* To imglib, which will return a failure indicator */ | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Open an image file and return a pointer to it.
 | 
					
						
							|  |  |  |    Make sure we raise an exception if we fail. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static IMAGE * | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | imgfile_open(fname) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |     char *fname; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     IMAGE *image; | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  |     i_seterror(imgfile_error); | 
					
						
							|  |  |  |     error_called = 0; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     errno = 0; | 
					
						
							|  |  |  |     if ( (image = iopen(fname, "r")) == NULL ) { | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  | 	/* Error may already be set by imgfile_error */ | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	if ( !error_called ) { | 
					
						
							|  |  |  | 	    if (errno) | 
					
						
							|  |  |  | 	        err_errno(ImgfileError); | 
					
						
							|  |  |  | 	    else | 
					
						
							|  |  |  | 	        err_setstr(ImgfileError, "Can't open image file"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     return image; | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     IMAGE *image; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     int yfirst, ylast, ystep; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |     if ( !getargs(args, "s", &fname) ) | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( (image = imgfile_open(fname)) == NULL ) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if ( image->colormap != CM_NORMAL ) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 	err_setstr(ImgfileError, "Can only handle CM_NORMAL images"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ( BPP(image->type) != 1 ) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1"); | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     xsize = image->xsize; | 
					
						
							|  |  |  |     ysize = image->ysize; | 
					
						
							|  |  |  |     zsize = image->zsize; | 
					
						
							|  |  |  |     if ( zsize != 1 && zsize != 3) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( xsize > 8192 ) { | 
					
						
							|  |  |  | 	iclose(image); | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can't handle image with > 8192 columns"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ( zsize == 3 ) zsize = 4; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     rv = newsizedstringobject((char *)NULL, xsize*ysize*zsize); | 
					
						
							|  |  |  |     if ( rv == NULL ) { | 
					
						
							|  |  |  |       iclose(image); | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |     cdatap = getstringvalue(rv); | 
					
						
							|  |  |  |     idatap = (long *)cdatap; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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 ) { | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 	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); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     iclose(image); | 
					
						
							| 
									
										
										
										
											1992-03-23 18:21:32 +00:00
										 |  |  |     if ( error_called ) { | 
					
						
							|  |  |  | 	DECREF(rv); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |     return rv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | static IMAGE *glob_image; | 
					
						
							|  |  |  | static long *glob_datap; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  | static int glob_width, glob_z, glob_ysize; | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static | 
					
						
							|  |  |  | xs_get(buf, y) | 
					
						
							|  |  |  |     short *buf; | 
					
						
							|  |  |  |     int y; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     if (top_to_bottom) | 
					
						
							|  |  |  |       getrow(glob_image, buf, (glob_ysize-1-y), glob_z); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       getrow(glob_image, buf, y, glob_z); | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static | 
					
						
							|  |  |  | xs_put_c(buf, y) | 
					
						
							|  |  |  |     short *buf; | 
					
						
							|  |  |  |     int y; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     char *datap = (char *)glob_datap + y*glob_width; | 
					
						
							|  |  |  |     int width = glob_width; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ( width-- ) | 
					
						
							|  |  |  |       *datap++ = (*buf++) & 0xff; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static | 
					
						
							|  |  |  | xs_put_0(buf, y) | 
					
						
							|  |  |  |     short *buf; | 
					
						
							|  |  |  |     int y; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     long *datap = glob_datap + y*glob_width; | 
					
						
							|  |  |  |     int width = glob_width; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ( width-- ) | 
					
						
							|  |  |  |       *datap++ = (*buf++) & 0xff; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | static | 
					
						
							|  |  |  | xs_put_12(buf, y) | 
					
						
							|  |  |  |     short *buf; | 
					
						
							|  |  |  |     int y; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     long *datap = glob_datap + y*glob_width; | 
					
						
							|  |  |  |     int width = glob_width; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     glob_image = image; | 
					
						
							|  |  |  |     glob_datap = datap; | 
					
						
							|  |  |  |     glob_width = xnew; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     glob_ysize = ysize; | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  |     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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     IMAGE *image; | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  |     char *filter; | 
					
						
							|  |  |  |     double blur; | 
					
						
							|  |  |  |     int extended; | 
					
						
							|  |  |  |     int fmode; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     int yfirst, ylast, ystep; | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      ** 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) ) | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      ** 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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( (image = imgfile_open(fname)) == NULL ) | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |       return NULL; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if ( image->colormap != CM_NORMAL ) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 	err_setstr(ImgfileError, "Can only handle CM_NORMAL images"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ( BPP(image->type) != 1 ) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1"); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     xsize = image->xsize; | 
					
						
							|  |  |  |     ysize = image->ysize; | 
					
						
							|  |  |  |     zsize = image->zsize; | 
					
						
							|  |  |  |     if ( zsize != 1 && zsize != 3) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	iclose(image); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( xsize > 8192 ) { | 
					
						
							|  |  |  | 	iclose(image); | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can't handle image with > 8192 columns"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ( zsize == 3 ) zsize = 4; | 
					
						
							|  |  |  |     rv = newsizedstringobject(NULL, xwtd*ywtd*zsize); | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( rv == NULL ) { | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 	iclose(image); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |     xfac = (float)xsize/(float)xwtd; | 
					
						
							|  |  |  |     yfac = (float)ysize/(float)ywtd; | 
					
						
							|  |  |  |     cdatap = getstringvalue(rv); | 
					
						
							|  |  |  |     idatap = (long *)cdatap; | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ( extended ) { | 
					
						
							|  |  |  | 	xscale(image, xsize, ysize, zsize, idatap, xwtd, ywtd, fmode, blur); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  | 	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 ) { | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  | 	    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); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	    } | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     iclose(image); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |     if ( error_called ) { | 
					
						
							|  |  |  | 	DECREF(rv); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return rv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | static object * | 
					
						
							|  |  |  | imgfile_getsizes(self, args) | 
					
						
							|  |  |  |     object *self; | 
					
						
							|  |  |  |     object *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     char *fname; | 
					
						
							|  |  |  |     object *rv; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     IMAGE *image; | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |     if ( !getargs(args, "s", &fname) ) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     if ( (image = imgfile_open(fname)) == NULL ) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     rv = mkvalue("(iii)", image->xsize, image->ysize, image->zsize); | 
					
						
							|  |  |  |     iclose(image); | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  |     return rv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     int yfirst, ylast, ystep; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ( !getargs(args, "(ss#iii)", | 
					
						
							|  |  |  | 		  &fname, &cdatap, &len, &xsize, &ysize, &zsize) ) | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     if ( zsize != 1 && zsize != 3 ) { | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels"); | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     if ( len != xsize * ysize * (zsize == 1 ? 1 : 4) ) { | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  | 	err_setstr(ImgfileError, "Data does not match sizes"); | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ( xsize > 8192 ) { | 
					
						
							|  |  |  | 	err_setstr(ImgfileError, "Can't handle image with > 8192 columns"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     error_called = 0; | 
					
						
							|  |  |  |     errno = 0; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize); | 
					
						
							|  |  |  |     if ( image == 0 ) { | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	if ( ! error_called ) { | 
					
						
							|  |  |  | 	    if (errno) | 
					
						
							|  |  |  | 		err_errno(ImgfileError); | 
					
						
							|  |  |  | 	    else | 
					
						
							|  |  |  | 	        err_setstr(ImgfileError, "Can't create image file"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     idatap = (long *)cdatap; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     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 ) { | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  | 	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 ) | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |       return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     INCREF(None); | 
					
						
							|  |  |  |     return None; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | static struct methodlist imgfile_methods[] = { | 
					
						
							| 
									
										
										
										
											1992-06-03 17:06:36 +00:00
										 |  |  |     { "getsizes",	imgfile_getsizes }, | 
					
						
							|  |  |  |     { "read",		imgfile_read }, | 
					
						
							| 
									
										
										
										
											1993-01-19 15:17:13 +00:00
										 |  |  |     { "readscaled",	imgfile_readscaled, 1}, | 
					
						
							| 
									
										
										
										
											1992-08-20 11:54:27 +00:00
										 |  |  |     { "write",		imgfile_write }, | 
					
						
							| 
									
										
										
										
											1993-10-11 12:54:31 +00:00
										 |  |  |     { "ttob",		imgfile_ttob }, | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  |     { NULL,		NULL } /* Sentinel */ | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | initimgfile() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	object *m, *d; | 
					
						
							|  |  |  | 	m = initmodule("imgfile", imgfile_methods); | 
					
						
							|  |  |  | 	d = getmoduledict(m); | 
					
						
							|  |  |  | 	ImgfileError = newstringobject("imgfile.error"); | 
					
						
							| 
									
										
										
										
											1992-09-03 20:41:22 +00:00
										 |  |  | 	if ( ImgfileError == NULL || dictinsert(d, "error", ImgfileError) ) | 
					
						
							| 
									
										
										
										
											1992-03-04 16:40:03 +00:00
										 |  |  | 	    fatal("can't define imgfile.error"); | 
					
						
							|  |  |  | } |