ByteArray.st
changeset 15274 58d5c0f8d906
parent 14382 dcbff20f0a14
child 15280 96826a417ba5
--- a/ByteArray.st	Mon May 27 10:08:41 2013 +0200
+++ b/ByteArray.st	Mon May 27 10:10:49 2013 +0200
@@ -162,6 +162,9 @@
 ! !
 
 
+
+
+
 !ByteArray class methodsFor:'queries'!
 
 elementByteSize
@@ -179,6 +182,8 @@
     "Modified: 23.4.1996 / 15:56:25 / cg"
 ! !
 
+
+
 !ByteArray methodsFor:'Compatibility-Squeak'!
 
 bitXor:aByteArray
@@ -2381,7 +2386,9 @@
 
 swapBytes
     "swap bytes inplace -
-     written as a primitive for speed on image grabbing (if display order is different)"
+     Expects that the receiver has an even number of bytes; 
+     if not, only the pairs excluding the last byte are swapped.
+     written as a primitive for speed on image grabbing (if display order is different)."
 
 %{  /* NOCONTEXT */
 
@@ -2390,32 +2397,40 @@
     REGISTER unsigned t;
 
     if (__qClass(self) == @global(ByteArray)) {
-	cnt = __byteArraySize(self);
-	cnt = cnt & ~1; /* make it even */
-	p = __ByteArrayInstPtr(self)->ba_element;
-	while (cnt > 0) {
-#ifdef OLD
-	    t = p[0];
-	    p[0] = p[1];
-	    p[1] = t;
+        cnt = __byteArraySize(self);
+        cnt = cnt & ~1; /* make it even */
+        p = __ByteArrayInstPtr(self)->ba_element;
+
+        while (cnt >= sizeof(INT)) {
+            unsigned INT i = ((unsigned INT *)p)[0];
+
+#if __POINTER_SIZE__ == 8
+            i = ((i>>8) & 0x00FF00FF00FF00FF) | ((i & 0x00FF00FF00FF00FF) << 8);
 #else
-	    unsigned short s;
-
-	    s = ((unsigned short *)p)[0];
-	    s = (s >> 8) | (s << 8);
-	    ((unsigned short *)p)[0] = s;
-#endif
-	    p += 2;
-	    cnt -= 2;
-	}
-	RETURN ( self );
+            i = ((i>>8) & 0x00FF00FF) | ((i & 0x00FF00FF) << 8);
+#endif /* __POINTER_SIZE__ */
+            ((unsigned INT *)p)[0] = i;
+            p += sizeof(INT);
+            cnt -= sizeof(INT);
+        }
+        while (cnt > 0) {
+            unsigned short s;
+
+            s = ((unsigned short *)p)[0];
+            s = (s >> 8) | (s << 8);
+            ((unsigned short *)p)[0] = s;
+            p += 2;
+            cnt -= 2;
+        }
+        RETURN ( self );
     }
 %}.
     ^ super swapBytes "/ rubbish - there is no one currenly
 
     "
-     #[1 2 3 4 5 6 7 8 9 10] copy swapBytes
-     #[1 2 3 4 5 6 7 8 9 10 11] copy swapBytes
+     #[1 2 3 4 5 6 7 8 9 10] copy swapBytes     -> #[2 1 4 3 6 5 8 7 10 9]
+     #[1 2 3 4 5 6 7 8 9 10 11] copy swapBytes  -> #[2 1 4 3 6 5 8 7 10 9 11]
+     #[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] copy swapBytes   
     "
 !
 
@@ -2908,6 +2923,7 @@
     "
 ! !
 
+
 !ByteArray methodsFor:'searching'!
 
 indexOf:aByte startingAt:start
@@ -2973,6 +2989,7 @@
     "
 ! !
 
+
 !ByteArray methodsFor:'testing'!
 
 isByteArray
@@ -3000,9 +3017,10 @@
 !ByteArray class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/ByteArray.st,v 1.208 2012-10-10 17:00:30 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ByteArray.st,v 1.209 2013-05-27 08:10:49 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/ByteArray.st,v 1.208 2012-10-10 17:00:30 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ByteArray.st,v 1.209 2013-05-27 08:10:49 cg Exp $'
 ! !
+