diff --git a/src/modules/Image/encodings/iff.c b/src/modules/Image/encodings/iff.c
index a514f1bc899cd247a8ac9a0a2e742e2b5054e042..0d1ddb5ca2b7db21f97343d461a597ae3de1483f 100644
--- a/src/modules/Image/encodings/iff.c
+++ b/src/modules/Image/encodings/iff.c
@@ -1,9 +1,9 @@
-/* $Id: iff.c,v 1.6 2000/08/03 21:25:32 grubba Exp $ */
+/* $Id: iff.c,v 1.7 2000/08/06 13:53:31 grubba Exp $ */
 
 #include "global.h"
 
 #include "stralloc.h"
-RCSID("$Id: iff.c,v 1.6 2000/08/03 21:25:32 grubba Exp $");
+RCSID("$Id: iff.c,v 1.7 2000/08/06 13:53:31 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -18,13 +18,14 @@ RCSID("$Id: iff.c,v 1.6 2000/08/03 21:25:32 grubba Exp $");
 /* MUST BE INCLUDED LAST */
 #include "module_magic.h"
 
-static INT32 low_parse_iff(unsigned char *data, INT32 len, unsigned char *hdr,
-			   struct mapping *m, unsigned char *stopchunk)
+static ptrdiff_t low_parse_iff(unsigned char *data, ptrdiff_t len,
+			       unsigned char *hdr,
+			       struct mapping *m, unsigned char *stopchunk)
 {
-  INT32 clen;
+  ptrdiff_t clen;
   clen = (EXTRACT_CHAR(hdr+4)<<24)|(hdr[5]<<16)|(hdr[6]<<8)|hdr[7];
 
-  if(clen==-1)
+  if((clen & 0xffffffff) == 0xffffffff)
     clen = len;
   else {
     if(!memcmp(hdr, "FORM", 4))
@@ -36,9 +37,10 @@ static INT32 low_parse_iff(unsigned char *data, INT32 len, unsigned char *hdr,
   }
 
   if((!memcmp(hdr, "FORM", 4)) || (!memcmp(hdr, "LIST", 4))) {
-    INT32 pos=0;
+    ptrdiff_t pos=0;
     while(pos+8 <= clen) {
-      INT32 l = low_parse_iff(data+pos+8, clen-pos-8, data+pos, m, stopchunk);
+      ptrdiff_t l = low_parse_iff(data+pos+8, clen-pos-8, data+pos,
+				  m, stopchunk);
       if(!l)
 	return 0;
       pos += l+8;
@@ -54,7 +56,7 @@ static INT32 low_parse_iff(unsigned char *data, INT32 len, unsigned char *hdr,
   return clen + (clen & 1);
 }
 
-void parse_iff(char *id, unsigned char *data, INT32 len,
+void parse_iff(char *id, unsigned char *data, ptrdiff_t len,
 	       struct mapping *m, char *stopchunk)
 {
   if(len<12 || memcmp("FORM", data, 4))
diff --git a/src/modules/Image/encodings/ilbm.c b/src/modules/Image/encodings/ilbm.c
index e73c045306d87adb8f0d37de7f184c2e6d7cb6c5..d75351def733abb65674fc71bf533221c9ff80f8 100644
--- a/src/modules/Image/encodings/ilbm.c
+++ b/src/modules/Image/encodings/ilbm.c
@@ -1,9 +1,9 @@
-/* $Id: ilbm.c,v 1.16 2000/08/03 21:25:32 grubba Exp $ */
+/* $Id: ilbm.c,v 1.17 2000/08/06 13:53:31 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: ilbm.c,v 1.16 2000/08/03 21:25:32 grubba Exp $
+**!	$Id: ilbm.c,v 1.17 2000/08/06 13:53:31 grubba Exp $
 **! submodule ILBM
 **!
 **!	This submodule keep the ILBM encode/decode capabilities
@@ -14,7 +14,7 @@
 #include "global.h"
 
 #include "stralloc.h"
-RCSID("$Id: ilbm.c,v 1.16 2000/08/03 21:25:32 grubba Exp $");
+RCSID("$Id: ilbm.c,v 1.17 2000/08/06 13:53:31 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -95,7 +95,7 @@ static void image_ilbm___decode(INT32 args)
    struct pike_string *str;
    struct mapping *m;
    int n;
-   extern void parse_iff(char *, unsigned char *, INT32,
+   extern void parse_iff(char *, unsigned char *, ptrdiff_t,
 			 struct mapping *, char *);
 
    get_all_args("__decode", args, "%S", &str);
diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 7204cf11123fba0e3377ac3c60c7ec2bab7e96af..2e74bf9efb1c24cf02f42a314ca7bdebea78f82b 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.167 2000/08/05 11:07:30 grubba Exp $ */
+/* $Id: image.c,v 1.168 2000/08/06 13:53:31 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.167 2000/08/05 11:07:30 grubba Exp $
+**!	$Id: image.c,v 1.168 2000/08/06 13:53:31 grubba Exp $
 **! class Image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -98,7 +98,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.167 2000/08/05 11:07:30 grubba Exp $");
+RCSID("$Id: image.c,v 1.168 2000/08/06 13:53:31 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -450,9 +450,9 @@ j++;
 #ifdef MATRIX_DEBUG
 	 fprintf(stderr,"->%d,%d,%d\n",r/sumr,g/sumg,b/sumb);
 #endif
-	 r=default_rgb.r+(int)(r*qr+0.5); dp->r=testrange(r);
-	 g=default_rgb.g+(int)(g*qg+0.5); dp->g=testrange(g);
-	 b=default_rgb.b+(int)(b*qb+0.5); dp->b=testrange(b);
+	 r=default_rgb.r+DOUBLE_TO_INT(r*qr+0.5); dp->r=testrange(r);
+	 g=default_rgb.g+DOUBLE_TO_INT(g*qg+0.5); dp->g=testrange(g);
+	 b=default_rgb.b+DOUBLE_TO_INT(b*qb+0.5); dp->b=testrange(b);
 	 dp++;
       }
    }
@@ -2051,9 +2051,9 @@ static void image_gradients(INT32 args)
 
 	 z=1.0/z;
 
-	 d->r=(COLORTYPE)(r*z);
-	 d->g=(COLORTYPE)(g*z);
-	 d->b=(COLORTYPE)(b*z);
+	 d->r=DOUBLE_TO_COLORTYPE(r*z);
+	 d->g=DOUBLE_TO_COLORTYPE(g*z);
+	 d->b=DOUBLE_TO_COLORTYPE(b*z);
 	 d++;
       }
    }
@@ -2542,7 +2542,7 @@ void image_hsv_to_rgb(INT32 args)
    while (i--)
    {
      double h,sat,v;
-     float r,g,b;
+     double r,g,b;
      h = (s->r/255.0)*(360.0/60.0);
      sat = s->g/255.0;
      v = s->b/255.0;
@@ -2556,7 +2556,7 @@ void image_hsv_to_rgb(INT32 args)
 #define p (v * (1 - sat))
 #define q (v * (1 - (sat * f)))
 #define t (v * (1 - (sat * (1 -f))))
-	switch((int)i)
+	switch(DOUBLE_TO_INT(i))
 	{
 	   case 6: /* 360 degrees. Same as 0.. */
 	   case 0: r = v; g = t; b = p;	 break;
@@ -2575,7 +2575,7 @@ void image_hsv_to_rgb(INT32 args)
 #undef p
 #undef q
 #undef t
-#define FIX(X) ((X)<0.0?0:(X)>=1.0?255:(int)((X)*255.0))
+#define FIX(X) ((X)<0.0?0:(X)>=1.0?255:DOULE_TO_INT((X)*255.0))
      d->r = FIX(r);
      d->g = FIX(g);
      d->b = FIX(b);
@@ -2634,15 +2634,15 @@ void image_rgb_to_hsv(INT32 args)
       v = MAX3(r,g,b);
       delta = v - MIN3(r,g,b);
 
-      if(r==v)      h = (int)(((g-b)/(float)delta)*(255.0/6.0));
-      else if(g==v) h = (int)((2.0+(b-r)/(float)delta)*(255.0/6.0));
-      else h = (int)((4.0+(r-g)/(float)delta)*(255.0/6.0));
+      if(r==v)      h = DOUBLE_TO_INT(((g-b)/(float)delta)*(255.0/6.0));
+      else if(g==v) h = DOUBLE_TO_INT((2.0+(b-r)/(float)delta)*(255.0/6.0));
+      else h = DOUBLE_TO_INT((4.0+(r-g)/(float)delta)*(255.0/6.0));
       if(h<0) h+=255;
 
       /*     printf("hsv={ %d,%d,%d }\n", h, (int)((delta/(float)v)*255), v);*/
-      d->r = (int)h;
-      d->g=(int)((delta/(float)v)*255.0);
-      d->b=v;
+      d->r = DOUBLE_TO_INT(h);
+      d->g = DOUBLE_TO_INT((delta/(float)v)*255.0);
+      d->b = v;
       s++; d++;
    }
    THREADS_DISALLOW();
@@ -2966,8 +2966,8 @@ void image_bitscale( INT32 args )
       newx = oldx * sp[-1].u.integer;
       newy = oldy * sp[-1].u.integer;
     } else if( sp[-1].type == T_FLOAT ) {
-      newx = (int)(oldx * sp[-1].u.float_number);
-      newy = (int)(oldy * sp[-1].u.float_number);
+      newx = DOUBLE_TO_INT(oldx * sp[-1].u.float_number);
+      newy = DOUBLE_TO_INT(oldy * sp[-1].u.float_number);
     } else 
       error("The scale factor must be an integer less than 2^32, or a float\n");
   } else if( args == 2 ) {
@@ -2977,8 +2977,8 @@ void image_bitscale( INT32 args )
       (newx = sp[-2].u.integer),(newy = sp[-1].u.integer);
     else if( sp[-2].type  == T_FLOAT )
     {
-      newx = (int)(oldx*sp[-2].u.float_number);
-      newy = (int)(oldy*sp[-1].u.float_number);
+      newx = DOUBLE_TO_INT(oldx*sp[-2].u.float_number);
+      newy = DOUBLE_TO_INT(oldy*sp[-1].u.float_number);
 
     } else
       error( "Wrong type of arguments\n");
@@ -3854,7 +3854,7 @@ static void image_apply_curve( INT32 args )
 static void img_make_gammatable(COLORTYPE *d,double gamma)
 {
    static COLORTYPE last_gammatable[256];
-   static float last_gamma;
+   static double last_gamma;
    static int had_gamma=0;
 
    if (had_gamma && last_gamma==gamma)
@@ -3882,7 +3882,7 @@ void image_gamma(INT32 args)
    struct object *o;
    struct image *img;
    COLORTYPE _newg[256],_newb[256],*newg,*newb;
-   float gammar,gammab,gammag;
+   double gammar,gammab,gammag;
    COLORTYPE newr[256];
 
    if (!THIS->img) error("Called Image.Image object is not initialized\n");;
@@ -4052,7 +4052,8 @@ void image_select_colors(INT32 args)
 
 void image_write_lsb_rgb(INT32 args)
 {
-   int n,l,b;
+   int n,b;
+   ptrdiff_t l;
    rgb_group *d;
    char *s;
 
@@ -4122,7 +4123,8 @@ void image_read_lsb_rgb(INT32 args)
 
 void image_write_lsb_grey(INT32 args)
 {
-   int n,l,b;
+   int n,b;
+   ptrdiff_t l;
    rgb_group *d;
    char *s;