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