FULL PRODUCT VERSION : java version "1.5.0_03" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_03-b07) Java HotSpot(TM) Client VM (build 1.5.0_03-b07, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows XP [Version 5.1.2600] A DESCRIPTION OF THE PROBLEM : An attempt to create a WritableRaster via Raster.createWritableRaster(SampleModel sm, DataBuffer db, Point location) using a custom DataBuffer causes an erroneous RasterFormatException. Apparently the reason for this bug is that IntegerComponentRaster insists on beeing passed an instance of DataBufferInt rather than just a DataBuffer with a DataType of TYPE_INT. This is quite annoying since DataBufferInt is declared final and thus cannot be extended. Also note that none of the specified reasons for a RasterFormatException apply: width and height are within bounds and my DataBuffer has only one bank. ERROR MESSAGES/STACK TRACES THAT OCCUR : java.awt.image.RasterFormatException: IntegerComponentRasters must haveinteger DataBuffers at sun.awt.image.IntegerComponentRaster.<init>(IntegerComponentRaster.java:155) at sun.awt.image.IntegerInterleavedRaster.<init>(IntegerInterleavedRaster.java:111) at sun.awt.image.IntegerInterleavedRaster.<init>(IntegerInterleavedRaster.java:78) at java.awt.image.Raster.createWritableRaster(Raster.java:994) at RasterBug.<init>(RasterBug.java:17) at RasterBug.main(RasterBug.java:69) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.awt.image.*; import java.awt.*; public class RasterBug { public RasterBug() { int w = 100, h = 100; ColorModel cm = new DirectColorModel(24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x0); SampleModel sm = cm.createCompatibleSampleModel(w,h); System.out.println(sm+", WIDTH="+sm.getWidth()+", HEIGHT="+sm.getHeight()); DataBuffer db = new MyDataBufferInt(w * h); System.out.println(db+", BANKS="+db.getNumBanks()); try { WritableRaster wr = Raster.createWritableRaster(sm, db, new Point(0,0)); BufferedImage bim = new BufferedImage(cm, wr, true, null); System.out.println(bim); } catch(Exception ex) { ex.printStackTrace(); } try { //workaround WritableRaster wr = new MyWritableRaster(sm, db, new Point(0,0)); BufferedImage bim = new BufferedImage(cm, wr, true, null); System.out.println(bim); } catch(Exception ex) { ex.printStackTrace(); } } // copied from DataBufferInt private final class MyDataBufferInt extends DataBuffer { int data[]; int bankdata[][]; public MyDataBufferInt(int size) { super(TYPE_INT,size); data = new int[size]; bankdata = new int[1][]; bankdata[0] = data; } public int getElem(int i) { return data[i+offset]; } public int getElem(int bank, int i) { return bankdata[bank][i+offsets[bank]]; } public void setElem(int i, int val) { data[i+offset] = val; } public void setElem(int bank, int i, int val) { bankdata[bank][i+offsets[bank]] = (int)val; } } private final class MyWritableRaster extends WritableRaster { public MyWritableRaster(SampleModel sampleModel, DataBuffer dataBuffer, Point origin) { super(sampleModel, dataBuffer, origin); } } public static void main(String[] args) { RasterBug bimbug = new RasterBug(); } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Using WritableRaster does work, requires extending the WritableRaster class though because the constuctor methods are protected.
|