diff -r ffd67647a98b -r 1619ea562333 PNGReader.st --- 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) ].