In jdk1.4, I'm gearing up to write an imageio reader, so I am learning how
BufferedImage works. I am trying to make a minimal implementation of
DataBuffer, SampleModel and ColorModel:
SampleModel model = new FakeSampleModel( DataBuffer.TYPE_INT, 100, 100);
DataBuffer data = model.createDataBuffer();
WritableRaster raster = Raster.createWritableRaster( model, data, null);
ColorModel colorModel = new FakeColorModel();
image = new BufferedImage( colorModel, raster, true, null);
(see full code below)
and when I draw the image I get the error:
getAlpha = image.TestImage$FakeDataBuffer
java.lang.ClassCastException: image.TestImage$FakeDataBuffer
at java.awt.image.ColorModel.getAlpha(ColorModel.java:827)
at image.TestImage$FakeColorModel.getAlpha(TestImage.java:165)
at java.awt.image.ColorModel.getRGB(ColorModel.java:862)
at sun.java2d.loops.OpaqueCopyAnyToArgb.Blit(CustomComponent.java:94)
at
sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:285)
at sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:176)
at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:140)
at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:629)
at sun.java2d.pipe.DrawImage.renderSurfaceData(DrawImage.java:357)
at
sun.java2d.pipe.DrawImage.clipAndRenderSurfaceData(DrawImage.java:335)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:51)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:717)
at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:150)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2785)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2775)
at image.TestImage$ImagePanel.paintComponent(TestImage.java:79)
at javax.swing.JComponent.paint(JComponent.java:798)
...
which indicate that sun.java2d.loops.OpaqueCopyAnyToArgb.Blit calls
ColorModel.getAlpha(Object inData) with inData having class FakeDataBuffer,
when it should be int[] !!??
Im sure Im doing something simple wrong, but have a hard time finding it
since I dont have source to sun.java2d.loops. If anyone can easily see it I
would appreciate it. (PS an example "minimal" code as I am writing might
also be very useful in a tutorial, I will be happy to post when i get it
working)
thanks!
******
package image;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.EventListenerList;
public class TestImage {
TestImage() {
JFrame frame = new JFrame("Test PrefPanel");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// old way of getting image
Image im =
Toolkit.getDefaultToolkit().createImage("E:/dev/image/test.jpg");
MediaTracker tracker = new MediaTracker( frame);
tracker.addImage( im, 0);
try {
tracker.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println( "image error = "+ tracker.isErrorAny());
ImagePanel imp1 = new ImagePanel( "test", im);
frame.getContentPane().add(imp1);
frame.getContentPane().setLayout(new FlowLayout());
// new jdk1.4 way using imageio
File f = new File("E:/dev/image/MiniBush.jpg");
BufferedImage bi = null;
try {
bi = javax.imageio.ImageIO.read(f);
} catch (Exception e) {
e.printStackTrace();
}
ImagePanel imp2 = new ImagePanel( "mini", bi);
frame.getContentPane().add(imp2);
// fake image
Image im3 = new FakeImage().getImage();
ImagePanel imp3 = new ImagePanel( "fake", im3);
frame.getContentPane().add(imp3);
frame.pack();
frame.setVisible(true);
frame.setBounds(new Rectangle(50, 50, 500, 500));
} // constructor
private class ImagePanel extends JPanel {
int w, h;
Image im;
String name;
ImagePanel(String name, Image im) {
this.name = name;
this.im = im;
w = im.getWidth( new myObs());
h = im.getHeight( new myObs());
}
public Dimension getPreferredSize() {
return new Dimension(w,h);
}
/** System-triggered redraw. */
public void paintComponent(Graphics g) {
System.out.println( name+" "+"paintComponent clip= "+
g.getClipBounds());
((Graphics2D)g).setBackground(Color.white);
//Rectangle bounds = getBounds();
//g.clearRect(0, 0, bounds.width, bounds.height);
g.drawImage( im, 0, 0, new java.awt.image.ImageObserver() {
public boolean imageUpdate(Image img, int infoflags, int x, int y,
int width, int height) {
return false;
}
});
}
}
// necessary for g.drawImage()
private class myObs implements java.awt.image.ImageObserver {
public boolean imageUpdate(Image image, int flags, int x, int y, int
width, int height) {
return true;
}
}
class FakeImage {
private BufferedImage image;
FakeImage() {
SampleModel model = new FakeSampleModel( DataBuffer.TYPE_INT, 100,
100);
DataBuffer data = model.createDataBuffer();
WritableRaster raster = Raster.createWritableRaster( model, data,
null);
ColorModel colorModel = new FakeColorModel();
image = new BufferedImage( colorModel, raster, true, null);
}
Image getImage() { return image; }
}
class FakeSampleModel extends java.awt.image.SampleModel {
FakeSampleModel(int type, int w, int h) {
super(type, w, h, 1);
}
public int getNumDataElements() { return 1; }
public Object getDataElements(int x, int y, Object obj, DataBuffer data)
{
int[] idata;
if (obj == null)
idata = new int[1];
else
idata = (int[])obj;
idata[0] = data.getElem( x * y);
return data;
}
public void setDataElements(int x, int y, Object obj, DataBuffer data)
{ }
public int getSample(int x, int y, int b, DataBuffer data) {
return data.getElem( x * y);
}
public void setSample(int x, int y, int b, int s, DataBuffer data) { }
public SampleModel createCompatibleSampleModel(int w, int h) {
return new FakeSampleModel(getDataType(), w, h);
}
public SampleModel createSubsetSampleModel(int bands[]) {
return new FakeSampleModel(getDataType(), getWidth(), getHeight());
}
public DataBuffer createDataBuffer() {
return new FakeDataBuffer(getDataType(), getWidth() * getHeight());
}
public int[] getSampleSize() {
int[] s = new int[1];
s[0] = 32;
return s;
}
public int getSampleSize(int band) {
return 32;
}
}
class FakeDataBuffer extends java.awt.image.DataBuffer {
FakeDataBuffer(int type, int size) { super( type, size); }
public int getElem(int bank, int i) { return (i > 5000) ? 0 : 1; }
public void setElem(int bank, int i, int val) { }
}
class FakeColorModel extends java.awt.image.ColorModel {
FakeColorModel() { super(32); }
public int getRed(int pixel) { return pixel; }
public int getGreen(int pixel) { return pixel; }
public int getBlue(int pixel) { return pixel; }
public int getAlpha(Object inData) {
System.out.println( "getAlpha = "+inData.getClass().getName());
return super.getAlpha( inData);
}
public int getAlpha(int pixel) { return 1; }
public boolean isCompatibleRaster(Raster raster) {
return raster.getSampleModel() instanceof FakeSampleModel;
}
public ColorModel coerceData (WritableRaster raster, boolean isap) {
return this; }
}
/** test */
public static void main(String args[]) {
new TestImage();
} // main
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".