Hi,
This patch fixes sample clipping in the ConvolveOp and RescaleOp; it
should now work for packed sample models as well.
Regards,
Francis
2006-09-13 Francis Kung <[EMAIL PROTECTED]>
* java/awt/image/ConvolveOp.java (filter(Raster, WritableRaster)):
Removed hard-coded max sample value.
* java/awt/image/RescaleOp.java (filter(Raster, WritableRaster)):
Fixed finding of max sample value.
Index: java/awt/image/ConvolveOp.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/image/ConvolveOp.java,v
retrieving revision 1.10
diff -u -r1.10 ConvolveOp.java
--- java/awt/image/ConvolveOp.java 1 Sep 2006 20:25:51 -0000 1.10
+++ java/awt/image/ConvolveOp.java 13 Sep 2006 15:32:04 -0000
@@ -249,6 +249,11 @@
int top = kernel.getYOrigin();
int bottom = Math.max(kHeight - top - 1, 0);
+ // Calculate max sample values for clipping
+ int[] maxValue = src.getSampleModel().getSampleSize();
+ for (int i = 0; i < maxValue.length; i++)
+ maxValue[i] = (int)Math.pow(2, maxValue[i]) - 1;
+
// process the region that is reachable...
int regionW = src.width - left - right;
int regionH = src.height - top - bottom;
@@ -270,12 +275,10 @@
// the samples array to make the tests pass. I haven't worked
// out why this is necessary.
- // This clipping is pretty strange, and seems to be hard-coded
- // at 255 (regardless of the raster's datatype or transfertype).
- // But it's what the reference does.
- if (v > 255)
- v = 255;
- if (v < 0)
+ // This clipping is is undocumented, but determined by testing.
+ if (v > maxValue[b])
+ v = maxValue[b];
+ else if (v < 0)
v = 0;
dest.setSample(x + kernel.getXOrigin(), y + kernel.getYOrigin(),
Index: java/awt/image/RescaleOp.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/image/RescaleOp.java,v
retrieving revision 1.7
diff -u -r1.7 RescaleOp.java
--- java/awt/image/RescaleOp.java 6 Sep 2006 16:12:50 -0000 1.7
+++ java/awt/image/RescaleOp.java 13 Sep 2006 15:32:05 -0000
@@ -287,10 +287,9 @@
float scaleFactor, offset;
// Find max sample value, to be used for clipping later
- int maxValue = (int)Math.pow(2,
- DataBuffer.getDataTypeSize(src.getDataBuffer()
- .getDataType()))
- - 1;
+ int[] maxValue = src.getSampleModel().getSampleSize();
+ for (int i = 0; i < maxValue.length; i++)
+ maxValue[i] = (int)Math.pow(2, maxValue[i]) - 1;
// TODO: can this be optimized further?
// Filter all samples of all requested bands
@@ -318,8 +317,8 @@
// Clip if needed
if (values[i] < 0)
values[i] = 0;
- if (values[i] > maxValue)
- values[i] = maxValue;
+ if (values[i] > maxValue[band])
+ values[i] = maxValue[band];
}
dest.setSamples(dest.getMinX(), dest.getMinY(), dest.getWidth(),