--- a/PNGReader.st Thu Mar 24 18:31:08 2016 +0100
+++ b/PNGReader.st Thu Mar 24 18:37:54 2016 +0100
@@ -462,7 +462,28 @@
|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 = __delta; __i < __count; __i++) {
+ __thisScanline[__i] = __thisScanline[__i] + __thisScanline[__i-__delta];
+ }
+ RETURN(self);
+ }
+%}.
+
+ delta := depth // 8 max:1.
delta+1 to:count do:[:i|
thisScanline at:i put:(((thisScanline at:i)+ (thisScanline at:i-delta)) bitAnd:255)
]
@@ -552,6 +573,25 @@
filterVertical:count
"Use the pixel above as a predictor"
+%{
+ if (__isByteArray(__INST(thisScanline))
+ && __isByteArray(__INST(prevScanline))
+ && __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 __i;
+
+ for (__i=0; __i<__count; __i++) {
+ unsigned int __pix = __thisScanline[__i] + __prevScanline[__i];
+ __thisScanline[__i] = __pix;
+ }
+ RETURN(self);
+ }
+%}.
+
1 to:count do:[:i |
thisScanline
at:i