PNGReader.st
changeset 3608 ffd67647a98b
parent 3607 a1b3d6654923
child 3609 1619ea562333
--- 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