--- 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)
].