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

Reply via email to