From e6879e23cf342b5fdde04fa13516220a4ee4e9ca Mon Sep 17 00:00:00 2001
From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org>
Date: Wed, 11 Feb 1998 01:58:05 +0100
Subject: [PATCH] bugfix in bitshuffling and bitswapping added

Rev: src/modules/Image/encodings/x.c:1.10
---
 src/modules/Image/encodings/x.c | 34 ++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/modules/Image/encodings/x.c b/src/modules/Image/encodings/x.c
index 76cd7291b4..de2d01ec09 100644
--- a/src/modules/Image/encodings/x.c
+++ b/src/modules/Image/encodings/x.c
@@ -1,9 +1,9 @@
-/* $Id: x.c,v 1.9 1998/02/10 23:52:02 mirar Exp $ */
+/* $Id: x.c,v 1.10 1998/02/11 00:58:05 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: x.c,v 1.9 1998/02/10 23:52:02 mirar Exp $
+**!	$Id: x.c,v 1.10 1998/02/11 00:58:05 mirar Exp $
 **! submodule X
 **!
 **!	This submodule handles encoding and decoding of
@@ -29,7 +29,7 @@
 #include <winsock.h>
 #endif
 
-RCSID("$Id: x.c,v 1.9 1998/02/10 23:52:02 mirar Exp $");
+RCSID("$Id: x.c,v 1.10 1998/02/11 00:58:05 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -97,10 +97,31 @@ extern struct program *image_program;
 **! arg object ct
 **!	colortable object (for dithering, or whatever)
 **! arg int swapbytes
-**!	swap bytes (for change of byteorder between client and server)
+**!	swap bytes for bpp==16,24,32,
+**!	swaps bits in the bytes if bpp==1,
+**!	for change of byte/bitorder between client and server.
 **! 
 */
 
+static unsigned char swap_bits[256] = 
+{ 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,
+  240,8,136,72,200,40,168,104,232,24,152,88,216,56,184,
+  120,248,4,132,68,196,36,164,100,228,20,148,84,212,52,
+  180,116,244,12,140,76,204,44,172,108,236,28,156,92,220,
+  60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,
+  210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,
+  90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,
+  150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,
+  30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,
+  225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,
+  105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,
+  165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,
+  45,173,109,237,29,157,93,221,61,189,125,253,3,131,67,
+  195,35,163,99,227,19,147,83,211,51,179,115,243,11,139,
+  75,203,43,171,107,235,27,155,91,219,59,187,123,251,7,
+  135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,
+  15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255};
+
 static void x_encode_truecolor(INT32 args)
 {
    struct image *img;
@@ -283,7 +304,7 @@ THREADS_ALLOW();
 	       bp-=8-bit;
 	       *(++d)=0; bit=0;
 	    }
-	    *d|=b>>24; 
+	    *d|=b>>(24+bit); 
 	    bit+=bp;
 	    if (bit==8) *(++d)=0,bit=0;
 	    s++;
@@ -327,6 +348,9 @@ THREADS_ALLOW();
 	       x-=3;
 	    }
 	    break;
+         case 1:
+	    while (x--) *(d++)=swap_bits[*d];
+	    break;
       }
    }
 
-- 
GitLab