diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index f29de4c2b90dfe967e9803bb30de6da9bc374cec..5336ab22a8ddee5cbccddcbc39c2543f7d3701e3 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,4 +1,4 @@
-/* $Id: image.c,v 1.12 1997/03/20 02:23:58 mirar Exp $ */
+/* $Id: image.c,v 1.13 1997/03/20 03:26:06 mirar Exp $ */
 
 #include "global.h"
 
@@ -7,7 +7,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.12 1997/03/20 02:23:58 mirar Exp $");
+RCSID("$Id: image.c,v 1.13 1997/03/20 03:26:06 mirar Exp $");
 #include "types.h"
 #include "pike_macros.h"
 #include "object.h"
@@ -1792,7 +1792,7 @@ void image_to8bit_rgbcube(INT32 args)
   unsigned char *d;
   unsigned char *map=NULL;
 
-  int red,green,blue,redgreen,redgreenblue;
+  int red,green,blue,redgreen,redgreenblue,hred,hgreen,hblue;
   
   if(!res) error("Out of memory\n");
 
@@ -1807,13 +1807,13 @@ void image_to8bit_rgbcube(INT32 args)
       || sp[2-args].type!=T_INT) 
      error("Illegal argument(s) to image->to8bit_rgbcube()\n");
 
-  red=sp[-args].u.integer; 
-  green=sp[1-args].u.integer;
-  blue=sp[2-args].u.integer; 
+  red=sp[-args].u.integer; 	hred=red/2;
+  green=sp[1-args].u.integer;	hgreen=green/2;
+  blue=sp[2-args].u.integer; 	hblue=blue/2;
   redgreen=red*green;
   redgreenblue=red*green*blue;
 
-  if (args==3)
+  if (args>3)
      if (sp[3-args].type!=T_STRING)
 	error("Illegal argument 4 to image->to8bit_rgbcube()"
 	      " (expected string or no argument)\n");
@@ -1830,19 +1830,31 @@ void image_to8bit_rgbcube(INT32 args)
   if (!map)
      while (i--)
      {
+// 	fprintf(stderr,"%02x%02x%02x -> %x,%x,%x -> %d,%d,%d -> %d\n",
+// 		s->r,s->g,s->b,
+// 		s->r*red+hred,
+// 		s->g*green+hgreen,
+// 		s->b*blue+hblue,
+// 		((s->r*red+hred)>>8),
+// 		((s->g*green+hgreen)>>8),
+// 		((s->b*blue+hblue)>>8),
+// 		((s->r*red+hred)>>8)+
+// 		((s->g*green+hgreen)>>8)*red+
+// 		((s->b*blue+hblue)>>8)*redgreen);
+		
 	*(d++)=
-	   (unsigned char)((s->r*red+
-			    s->g*redgreen+
-			    s->b*redgreenblue)>>8);
+	   (unsigned char)( ((s->r*red+hred)>>8)+
+			    ((s->g*green+hgreen)>>8)*red+
+			    ((s->b*blue+hblue)>>8)*redgreen );
 	s++;
      }
   else
      while (i--)
      {
 	*(d++)=
-	   map[(s->r*red+
-		s->g*redgreen+
-		s->b*redgreenblue)>>8];
+	   map[ ((s->r*red+hred)>>8)+
+	        ((s->g*green+hgreen)>>8)*red+
+	        ((s->b*blue+hblue)>>8)*redgreen ];
 	s++;
      }
   THREADS_DISALLOW();