diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index a2c31735acc6987d20d5ffe831fad3b01da742c6..7204cf11123fba0e3377ac3c60c7ec2bab7e96af 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.166 2000/07/28 07:12:44 hubbe Exp $ */
+/* $Id: image.c,v 1.167 2000/08/05 11:07:30 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.166 2000/07/28 07:12:44 hubbe Exp $
+**!	$Id: image.c,v 1.167 2000/08/05 11:07:30 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.166 2000/07/28 07:12:44 hubbe Exp $");
+RCSID("$Id: image.c,v 1.167 2000/08/05 11:07:30 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -133,7 +133,7 @@ extern struct program *image_colortable_program;
 #define THIS ((struct image *)(Pike_fp->current_storage))
 #define THISOBJ (Pike_fp->current_object)
 
-#define testrange(x) ((COLORTYPE)MAXIMUM(MINIMUM(((int)x),255),0))
+#define testrange(x) ((COLORTYPE)MAXIMUM(MINIMUM(DOUBLE_TO_INT(x),255),0))
 
 #define sq(x) ((x)*(x))
 
diff --git a/src/modules/Image/image.h b/src/modules/Image/image.h
index f29d6e5384f073618ef6808d925ceb9115611afb..2ea90038d865a52625e641c3970e403e7f5bc752 100644
--- a/src/modules/Image/image.h
+++ b/src/modules/Image/image.h
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: image.h,v 1.36 2000/06/02 05:02:29 per Exp $
+**!	$Id: image.h,v 1.37 2000/08/05 11:07:31 grubba Exp $
 */
 
 #ifdef PIKE_IMAGE_IMAGE_H
@@ -40,6 +40,21 @@ extern int image_cpuid;
 #define RGB_TO_RGBL(RGBL,RGB) (((RGBL).r=COLOR_TO_COLORL((RGB).r)),((RGBL).g=COLOR_TO_COLORL((RGB).g)),((RGBL).b=COLOR_TO_COLORL((RGB).b)))
 #define RGBL_TO_RGB(RGB,RGBL) (((RGB).r=COLORL_TO_COLOR((RGBL).r)),((RGB).g=COLORL_TO_COLOR((RGBL).g)),((RGB).b=COLORL_TO_COLOR((RGBL).b)))
 
+/* Some marcos to avoid loss of precision warnings. */
+#ifdef __ECL
+static inline int DOUBLE_TO_INT(double d)
+{
+  return (int)d;
+}
+static inline char DOUBLE_TO_CHAR(double d)
+{
+  return (char)d;
+}
+#else /* !__ECL */
+#define DOUBLE_TO_INT(D)	((int)(D))
+#define DOUBLE_TO_CHAR(D)	((char)(D))
+#endif /* __ECL */
+
 
 #define FS_SCALE 1024
 
diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c
index 789f15673d61d81888c7d8e2ee7a75a1d9fe7e55..b37ac76f8b1b657476786c5b8661a32222215688 100644
--- a/src/modules/Image/layers.c
+++ b/src/modules/Image/layers.c
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: layers.c,v 1.45 2000/07/28 07:12:44 hubbe Exp $
+**!	$Id: layers.c,v 1.46 2000/08/05 11:07:31 grubba Exp $
 **! class Layer
 **! see also: layers
 **!
@@ -215,7 +215,7 @@
 
 #include <math.h> /* floor */
 
-RCSID("$Id: layers.c,v 1.45 2000/07/28 07:12:44 hubbe Exp $");
+RCSID("$Id: layers.c,v 1.46 2000/08/05 11:07:31 grubba Exp $");
 
 #include "image_machine.h"
 
@@ -536,11 +536,11 @@ struct layer_mode_desc
 
 #endif
 
-#define COMBINE(P,A) CCUT(((int)(P))*(A))
+#define COMBINE(P,A) CCUT((DOUBLE_TO_INT(P))*(A))
 #define COMBINE_A(P,A) ((COLORTYPE)((P)*(A)))
 #define COMBINE_V(P,V,A) CCUT((V)*(P)*(A))
 
-#define F2C(Z) ((COLORTYPE)(COLORMAX*(Z)))
+#define F2C(Z) ((COLORTYPE)DOUBLE_TO_INT(COLORMAX*(Z)))
 
 #define ALPHA_ADD(S,L,D,SA,LA,DA,C)					 \
 	    if (!(LA)->C) (D)->C=(S)->C,(DA)->C=(SA)->C;		 \
@@ -636,7 +636,7 @@ static INLINE void hsv_to_rgb(double h,double s,double v,rgb_group *colorp)
 #define q F2C(v * (1 - (s * f)))
 #define t F2C(v * (1 - (s * (1 -f))))
 #define V F2C(v)
-   switch((int)i)
+   switch(DOUBLE_TO_INT(i))
    {
       case 6:
       case 0: 	colorp->r = V;	colorp->g = t;	colorp->b = p;	 break;
@@ -1381,7 +1381,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_add
 #define L_TRUNC(X) MINIMUM(255,(X))
-#define L_OPER(A,B) ((A)+(int)(B))
+#define L_OPER(A,B) ((A)+DOUBLE_TO_INT(B))
 #define L_MMX_OPER(A,MMXR) paddusb_m2r(A,MMXR)
 #include "layer_oper.h"
 #undef L_MMX_OPER
@@ -1391,7 +1391,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_subtract
 #define L_TRUNC(X) MAXIMUM(0,(X))
-#define L_OPER(A,B) ((A)-(int)(B))
+#define L_OPER(A,B) ((A)-DOUBLE_TO_INT(B))
 #define L_MMX_OPER(A,MMXR) psubusb_m2r(A,MMXR)
 #include "layer_oper.h"
 #undef L_MMX_OPER
@@ -1401,7 +1401,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_multiply
 #define L_TRUNC(X) (X)
-#define L_OPER(A,B) CCUT((A)*(int)(B))
+#define L_OPER(A,B) CCUT((A)*DOUBLE_TO_INT(B))
 #include "layer_oper.h"
 #undef LM_FUNC
 #undef L_TRUNC
@@ -1409,7 +1409,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_divide
 #define L_TRUNC(X) MINIMUM(255,(X))
-#define L_OPER(A,B) ((A)/C2F(1+(int)(B)))
+#define L_OPER(A,B) ((A)/C2F(1+DOUBLE_TO_INT(B)))
 #include "layer_oper.h"
 #undef LM_FUNC
 #undef L_TRUNC
@@ -1427,7 +1427,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_invsubtract
 #define L_TRUNC(X) MAXIMUM(0,(X))
-#define L_OPER(A,B) ((B)-(int)(A))
+#define L_OPER(A,B) ((B)-DOUBLE_TO_INT(A))
 #include "layer_oper.h"
 #undef LM_FUNC
 #undef L_TRUNC
@@ -1435,7 +1435,7 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_invdivide
 #define L_TRUNC(X) MINIMUM(255,(X))
-#define L_OPER(A,B) ((B)/C2F(1+(int)(A)))
+#define L_OPER(A,B) ((B)/C2F(1+DOUBLE_TO_INT(A)))
 #include "layer_oper.h"
 #undef LM_FUNC
 #undef L_TRUNC