#FEATURE by cg
class: Depth24Image
changed: #valuesFromX:y:toX:y:do:
oops - off by one error inindex computation.
--- a/Depth24Image.st Tue Sep 06 18:07:04 2016 +0200
+++ b/Depth24Image.st Wed Sep 07 17:17:27 2016 +0200
@@ -2722,59 +2722,59 @@
&& (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(3))
&& ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
) {
- int c_x1 = __intVal(x1);
- int c_x2 = __intVal(x2);
- int c_y1 = __intVal(y1);
- int c_y2 = __intVal(y2);
- int c_w = __intVal(__INST(width));
- int c_h = __intVal(__INST(height));
- int c_srcIndex = __intVal(srcIndex);
- int c_bytesPerRow = __intVal(bytesPerRow);
- int c_y, c_x;
- OBJ c_rHome;
-
- c_rHome = __BlockInstPtr(aBlock)->b_home;
- if ((c_rHome == nil) || (__qSpace(c_rHome) >= STACKSPACE)) {
- if ((((unsigned)c_y1) < c_h)
- && (((unsigned)c_y2) < c_h)
- && (((unsigned)c_x1) < c_w)
- && (((unsigned)c_x2) < c_w)) {
- unsigned char *c_bytes = (unsigned char*)__ByteArrayInstPtr(bytes)->ba_element;
-
- if ((c_srcIndex + (c_bytesPerRow * (c_y2-c_y1))) < __byteArraySize(bytes)) {
- c_bytes += c_srcIndex;
- for (c_y=c_y1; c_y<=c_y2; c_y++) {
- unsigned char *c_next = c_bytes + c_bytesPerRow;
-
- for (c_x=c_x1; c_x<=c_x2; c_x++) {
- int c_value;
-
- c_value = c_bytes[0];
- c_value = (c_value<<8) | c_bytes[1];
- c_value = (c_value<<8) | c_bytes[2];
- (*(__BlockInstPtr(aBlock)->b_code))(c_rHome, __mkSmallInteger(c_x), __mkSmallInteger(c_y), __mkSmallInteger(c_value));
- c_bytes += 3;
- }
- c_bytes = c_next;
- }
- RETURN(self);
- }
- }
- }
+ int c_x1 = __intVal(x1);
+ int c_x2 = __intVal(x2);
+ int c_y1 = __intVal(y1);
+ int c_y2 = __intVal(y2);
+ int c_w = __intVal(__INST(width));
+ int c_h = __intVal(__INST(height));
+ int c_srcIndex = __intVal(srcIndex)-1;
+ int c_bytesPerRow = __intVal(bytesPerRow);
+ int c_y, c_x;
+ OBJ c_rHome;
+
+ c_rHome = __BlockInstPtr(aBlock)->b_home;
+ if ((c_rHome == nil) || (__qSpace(c_rHome) >= STACKSPACE)) {
+ if ((((unsigned)c_y1) < c_h)
+ && (((unsigned)c_y2) < c_h)
+ && (((unsigned)c_x1) < c_w)
+ && (((unsigned)c_x2) < c_w)) {
+ unsigned char *c_bytes = (unsigned char*)__ByteArrayInstPtr(bytes)->ba_element;
+
+ if ((c_srcIndex + (c_bytesPerRow * (c_y2-c_y1))) < __byteArraySize(bytes)) {
+ c_bytes += c_srcIndex;
+ for (c_y=c_y1; c_y<=c_y2; c_y++) {
+ unsigned char *c_next = c_bytes + c_bytesPerRow;
+
+ for (c_x=c_x1; c_x<=c_x2; c_x++) {
+ int c_value;
+
+ c_value = c_bytes[0];
+ c_value = (c_value<<8) | c_bytes[1];
+ c_value = (c_value<<8) | c_bytes[2];
+ (*(__BlockInstPtr(aBlock)->b_code))(c_rHome, __mkSmallInteger(c_x), __mkSmallInteger(c_y), __mkSmallInteger(c_value));
+ c_bytes += 3;
+ }
+ c_bytes = c_next;
+ }
+ RETURN(self);
+ }
+ }
+ }
}
%}.
y1 to:y2 do:[:y |
- srcNext := srcIndex + bytesPerRow.
- x1 to:x2 do:[:x |
- value := bytes at:srcIndex.
- value := (value bitShift:8) + (bytes at:srcIndex+1).
- value := (value bitShift:8) + (bytes at:srcIndex+2).
- srcIndex := srcIndex + 3.
-
- aBlock value:x value:y value:value
- ].
- srcIndex := srcNext.
+ srcNext := srcIndex + bytesPerRow.
+ x1 to:x2 do:[:x |
+ value := bytes at:srcIndex.
+ value := (value bitShift:8) + (bytes at:srcIndex+1).
+ value := (value bitShift:8) + (bytes at:srcIndex+2).
+ srcIndex := srcIndex + 3.
+
+ aBlock value:x value:y value:value
+ ].
+ srcIndex := srcNext.
].
"Modified: 11.7.1996 / 20:06:47 / cg"
@@ -3418,3 +3418,4 @@
version_CVS
^ '$Header$'
! !
+