PNGReader.st
changeset 3609 1619ea562333
parent 3608 ffd67647a98b
child 3611 310db973356e
--- a/PNGReader.st	Thu Mar 24 18:37:54 2016 +0100
+++ b/PNGReader.st	Thu Mar 24 18:43:58 2016 +0100
@@ -446,7 +446,31 @@
     
     |delta|
 
-    delta := self bitsPerPixel // 8 max:1.
+%{
+    if (__isByteArray(__INST(thisScanline))
+     && __isByteArray(__INST(prevScanline))
+     && __isSmallInteger(__INST(depth))
+     && __isSmallInteger(count)) {
+        unsigned char *__thisScanline = __byteArrayVal(__INST(thisScanline));
+        unsigned int __sz_this = __byteArraySize(__INST(thisScanline));
+        unsigned char *__prevScanline = __byteArrayVal(__INST(prevScanline));
+        unsigned int __sz_prev = __byteArraySize(__INST(prevScanline));
+        INT __count = __intVal(count);
+        INT __delta = __intVal(__INST(depth)) / 8;
+        int __i;
+
+        if (__delta < 1) __delta = 1;
+        for (__i=0; __i<__delta; __i++) {
+            __thisScanline[__i] += (__prevScanline[__i] >> 1);
+        }
+        for (; __i < __count; __i++) {
+            __thisScanline[__i] += ((__prevScanline[__i] + __thisScanline[__i-__delta]) >> 1);
+        }
+        RETURN(self);
+    }
+%}.
+
+    delta := depth // 8 max:1.
     1 to:delta do:[:i | 
         thisScanline at:i put:((thisScanline at:i) + ((prevScanline at:i) // 2) bitAnd:255)
     ].