#TUNING by cg
authorClaus Gittinger <cg@exept.de>
Wed, 31 Aug 2016 11:26:51 +0200
changeset 7528 c48cbbe547e6
parent 7527 388a8f3f5c84
child 7529 5f77a718b7bd
#TUNING by cg class: Depth24Image changed: #valuesFromX:y:toX:y:do:
Depth24Image.st
--- a/Depth24Image.st	Wed Aug 31 10:57:46 2016 +0200
+++ b/Depth24Image.st	Wed Aug 31 11:26:51 2016 +0200
@@ -2712,6 +2712,50 @@
     srcIndex := (width * 3 * y1) + (x1 * 3) + 1 .
     bytesPerRow := self bytesPerRow.
     bytes := self bits.
+%{
+    OBJFUNC codeVal;
+
+    if (__bothSmallInteger(x1, x2)
+     && __bothSmallInteger(y1, y2)
+     && __bothSmallInteger(srcIndex, bytesPerRow)
+     && __isByteArrayLike(bytes)
+     && __isBlockLike(aBlock)
+     && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(3))
+     && ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
+    ) {
+        int _x1 = __intVal(x1)-1;
+        int _x2 = __intVal(x2)-1;
+        int _y1 = __intVal(y1)-1;
+        int _y2 = __intVal(y2)-1;
+        int _w = __intVal(__INST(width));
+        int _h = __intVal(__INST(height));
+        int _srcIndex = __intVal(srcIndex);
+        int _bytesPerRow = __intVal(bytesPerRow);
+        int _y, _x;
+        OBJ rHome;
+
+        rHome = __BlockInstPtr(aBlock)->b_home;
+        if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE)) {
+            if ((((unsigned)_y1) < _h)
+             && (((unsigned)_y2) < _h)
+             && (((unsigned)_x1) < _w)
+             && (((unsigned)_x1) < _w)) {
+                for (_y=_y1; _y<=_y2; _y++) {
+                    int _srcNext = _srcIndex + _bytesPerRow;
+                    for (_x=_x1; _x<=_x2; _x++) {
+                        int _value = __ByteArrayInstPtr(bytes)->ba_element[_srcIndex];    
+                        _value = (_value<<8) | __ByteArrayInstPtr(bytes)->ba_element[_srcIndex+1];    
+                        _value = (_value<<8) | __ByteArrayInstPtr(bytes)->ba_element[_srcIndex+2];
+                        (*codeVal)(rHome, __mkSmallInteger(_x), __mkSmallInteger(_y), __mkSmallInteger(_value));
+                        _srcIndex = _srcIndex + 3;
+                    }
+                    _srcIndex = _srcNext;
+                }
+            }
+            RETURN(self);
+        }
+    }
+%}.
 
     y1 to:y2 do:[:y |
         srcNext := srcIndex + bytesPerRow.