If I do this to get the pixels from an image for later rendering in a
MemoryImageSource my applet runs fine.

        width = image.getWidth(canvas);
        height = image.getHeight(canvas);
        pixels = new int [width * height ];
        int cnt = 0;
        pg = new PixelGrabber(image,0,0,width,height,pixels,0,width);
        try
        {
           while (pg.grabPixels(0) != true)
           {
                Thread.yield();
           }
           if ((pg.getStatus() & ImageObserver.ABORT) != 0)
           {
              System.err.println("Image fetch aborted or errored...");
           }
        }

If I do this -- then the applet becomes sluggish to the point
of not being usable.
        int [] pixels = null;
        try
        {
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(imageBuffer));
            Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
            ImageReader reader = (ImageReader)readers.next();
            ImageReadParam param = reader.getDefaultReadParam();
            bi = new BufferedImage(1024,1024,BufferedImage.TYPE_INT_RGB);
            param.setDestination(bi);
            reader.setInput(iis, true);
            bi = reader.read(0,param);
            width = bi.getWidth();
            height = bi.getHeight();
            pixels = 
((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
        }


Does this have something to do with the way integer arrays
are stored?  Is there indirection involved somewhere.

I've attached my entire class file for your inspection.

===========================================================================
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".
package pantile;

import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.color.ColorSpace;
import java.awt.image.DataBufferInt;
import java.awt.image.PixelGrabber;
import java.awt.image.ImageObserver;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.image.BufferedImage;

public class PanTileImageFetch implements Runnable
{
    
    private URL imageURL = null;
    private PanTileCanvas canvas = null;
    private PanTileProjector projector = null;
    private PanTileApplet applet = null;
    private final int CHUNKSIZE = 1024;
    public byte[] imageBuffer = null;
    public InputStream in = null;
    public int numRead = 0;
    public int size = 0;
    public boolean cache = true;
    private int [] pixels = null;
    private PixelGrabber pg = null;
    private Image image = null;
    
    public PanTileImageFetch(PanTileApplet a)
    {
        applet = a;
    }
    public void setImageURL(URL u)
    {
        imageURL = u;
    }

    public void setCanvas(PanTileCanvas c)
    {
        canvas = c;
    }

    public void setProjector(PanTileProjector p)
    {
        projector = p;
    }
    public boolean FIRSTIMAGELOADED = false;
    public boolean READKILL = false;
    public boolean getImageBytes()
    {
        int numRead = 0;
        int offset = 0;       
        if(PanTileApplet.DEBUG) System.err.println("getImageBytes()...");
        try
        {
            URLConnection urlConnection = imageURL.openConnection();
            //urlConnection.setConnectTimeout(8000);
//            if(canvas != null)
//            {
//                canvas.paintCachingIndicator("Loading.", FIRSTIMAGELOADED);
//            }
//            if(cache)
//                urlConnection.setUseCaches(true);
//            else
//                urlConnection.setUseCaches(false);
            //urlConnection.setReadTimeout(8000);
            size = urlConnection.getContentLength();
            if(size <= 0)
            {
                if(canvas != null)
                {
                    canvas.KILLCACHINGINDICATOR = true;
                    canvas.paintMsgScreen("Image zero length...",false);
                }
                return false;   
            }
            

            imageBuffer = new byte[size];
            in = urlConnection.getInputStream();
            if(PanTileApplet.DEBUG) System.err.println("Starting Read...");
            while((numRead = in.read(imageBuffer,offset,imageBuffer.length - offset)) != -1)
            {
                //if(PanTileApplet.DEBUG) System.err.println("Bytes Read = " + numRead);
                if(READKILL) return false;
                offset += numRead;
                if(offset >= imageBuffer.length)
                {
                    byte[] temp = new byte[imageBuffer.length + CHUNKSIZE];
                    System.arraycopy(imageBuffer, 0, temp, 0, offset);
                    imageBuffer = temp;
                }
                Thread.yield();
            }
//            if(canvas != null)
//            {        
//                if(PanTileApplet.DEBUG)System.err.println("canvas != null");
//                canvas.KILLCACHINGINDICATOR = true;
//                canvas.paintMsgScreen("Loaded " + canvas.sizeFormater(size) + " Mb...",FIRSTIMAGELOADED);
//            }

            if(PanTileApplet.DEBUG) System.err.println("**** Total Read = " + offset);
            in.close();
        }
        catch(OutOfMemoryError oome)
        {
            if(PanTileApplet.DEBUG) System.err.println("getImageBytes() -- out of memory error...");
            return false;
        }
        catch(SocketTimeoutException ste)
        {
            if(PanTileApplet.DEBUG) System.err.println("URL Read Timeout Exception...");
            return false;
        }
        catch(IOException ioe)
        {
            if(PanTileApplet.DEBUG) System.err.println("Unable to load: " + imageURL + "\n");
            return false;
        }
        return true;
    }

    private boolean makeImageFromToolkit()
    {
        int id = (int)System.currentTimeMillis();
        if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit()...");
        try
        {
            //flushImage();
            MediaTracker imageTracker = new MediaTracker(applet);
            Toolkit tk = Toolkit.getDefaultToolkit();
            
            image = tk.createImage(imageBuffer,0,size);
            imageTracker.addImage(image,id);
            //if(PanTileApplet.DEBUG) System.err.println("ID = " + id);
            while(imageTracker.checkID(id,true) == false)
            {
                //if(PanTileApplet.DEBUG) System.err.println(".");
                Thread.yield();
                Thread.sleep(5);
            }
            if(imageTracker.isErrorID(id) == true)
            {
                //failed to load image--print out debugging stuff.
                int imageStatus = imageTracker.statusID(id,false);
                if((imageStatus & MediaTracker.ABORTED) != 0)
                    if(PanTileApplet.DEBUG) System.err.println("\n" + imageURL + " ABORTED\n");
                if((imageStatus & MediaTracker.ERRORED) != 0)
                    if(PanTileApplet.DEBUG) System.err.println("\n" + imageURL + " ERRORED\n");
                imageTracker.removeImage(image,id);
                flushImage();
                return false;
            }
            else  //sucess in loading image
            {
                imageTracker.removeImage(image,id);
                return true;
//                if(!splashImage)
//                    getImageParametersAndPixels();
            }
        }
        catch(OutOfMemoryError oome)
        {
            if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit(): Out of memory error...");
            return false;
        }
        catch(InterruptedException ie)
        //catch(OutOfMemoryError oome)
        {
            if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit() -- out of memory error...");
            return false;
        }
//        catch(Exception e)
//        {
//            canvas.paintErrorScreen("Image corrupted - load aborted...");
//            return false;
//        }
    }
    public void freeMemory() {
        Runtime rt = Runtime.getRuntime();
//        System.err.println("Memory = " + (rt.freeMemory() + rt.maxMemory() - rt.totalMemory()));
        System.err.println("Total Memory = " + rt.totalMemory());
        System.err.println("Max Memory = " + rt.maxMemory());
        System.err.println("Free Memory = " + (rt.freeMemory() / (1024 * 1024)));
        rt.gc();
        rt.runFinalization();
//        System.err.println("Memory After gc = " + (rt.freeMemory() + rt.maxMemory() - rt.totalMemory()));
    }
    private void flushImage()
    {
//        System.err.println("flushImage()...");
        System.gc();
//        freeMemory();
        if(image != null)
        {
            image.flush();
            image = null;           
        }
        if(bi != null)
        {
            bi.flush();
            bi = null;
        }
        pg = null;
        imageBuffer = null;
        System.runFinalization();
        System.gc();
//        freeMemory();
    }
    private BufferedImage bi = null;
    
    private boolean makeBufferedImage()
    {
        boolean status = true;
        try
        {
            ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(imageBuffer));
            Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
            ImageReader reader = (ImageReader)readers.next();
            ImageReadParam param = reader.getDefaultReadParam();
            bi = new BufferedImage(1024,1024,BufferedImage.TYPE_INT_RGB);
            param.setDestination(bi);
            if(PanTileApplet.DEBUG) 
                System.err.println("Got a reader -- " + reader.getFormatName());          
            /*
             * String [] formatNames = ImageIO.getReaderFormatNames();
            for( int i = 0; i < formatNames.length; i++ )
            {
                System.out.println(formatNames[i]);
            }*/
                
            reader.setInput(iis, true);
            bi = reader.read(0,param);
//            int data[] = ((DataBufferInt)(_bimg.getRaster().getDataBuffer())).getData();
            width = bi.getWidth();
            height = bi.getHeight();
            pixels = ((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
//            int l = ((DataBufferInt)(bi.getRaster().getDataBuffer())).getData().length;
//            int q [] = (int [])((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
//            pixels = new int[width*height];
////            System.arraycopy(q,0,pixels,0,l);
//            for(int i = 0; i < l; i++)
//            {
//                pixels[i] = q[i];
//            }
        }
        catch (IllegalArgumentException iae)
        {
            if(PanTileApplet.DEBUG) System.err.println("Illegal Arguement Exception...");
            status = false;
        }   
        
        catch (IOException ioe)
        {
            if(PanTileApplet.DEBUG) System.err.println("IO Exception...");
            status = false;
        }        
        catch (Throwable oome)
        {
//            if(PanTileApplet.DEBUG) 
                System.err.println("Throwable: makeBufferedImage()...");
            oome.printStackTrace();
        } 
        return status;
    }
    private int width = 0;
    private int height = 0;
    public boolean KILLPGTHREAD = false;
    private boolean getImageParametersAndPixels()
    {
        if(PanTileApplet.DEBUG) System.err.println("getImageParametersAndPixels()...");
        KILLPGTHREAD = false;
//        pixels = null;
//        System.gc();
//        Thread currentThread = null;
        width = image.getWidth(canvas);         
        height = image.getHeight(canvas);
        pixels = new int [width * height ];
        int cnt = 0;
        pg = new PixelGrabber(image,0,0,width,height,pixels,0,width);
        //pg = new PixelGrabber(image,0,0,width,height,true);
//        Runnable pgLoopCheck = new Runnable()
//        {
//            public void run()
//            {
                try
                {
                    
                    while (pg.grabPixels(0) != true)
                    {
                        //if(PanTileApplet.DEBUG) System.err.println("Grabbing()...");
                        Thread.yield();
//                        Thread.sleep(4);
//                        System.err.println(cnt++);
                        //pixelObject = pg.getPixels();
                    }
                    
                    if ((pg.getStatus() & ImageObserver.ABORT) != 0) 
                    {
                        if(PanTileApplet.DEBUG) System.err.println("Image fetch aborted or errored...");
                    }
                    
                } 
                catch (OutOfMemoryError oome)
                {
                    if(PanTileApplet.DEBUG) System.err.println("(2)OutOfMemoryError: getImageParametersAndPixels()...");
                    
                }     
                catch(InterruptedException ie)
                {
                    if(PanTileApplet.DEBUG) System.err.println("(2)InterruptedException: getImageParametersAndPixels()...");
                    
                }
                catch (Throwable oome)
                {
                    if(PanTileApplet.DEBUG) System.err.println("(2)Throwable: getImageParametersAndPixels()...");
                    //oome.printStackTrace();
                } 
                Thread.yield();
//            }
//        };
//        Thread pgThread = new Thread(pgLoopCheck);
//        pgThread.start();
//        int status = 0;
//        Thread.State ts = null;
//        try
//        {
//            while((pgThread.isAlive()) && (!KILLPGTHREAD))
//            {
//                if(PanTileApplet.DEBUG) System.err.println("pgThread alive...");
//                status = pg.getStatus();
//                if(PanTileApplet.DEBUG) System.err.println("pixel grabber status = " + status);
//                ts = pgThread.getState();
//                if(PanTileApplet.DEBUG) System.err.println("thread state = " + ts.toString());
//                if ((status & ImageObserver.ABORT) != 0) 
//                {
//                    if(PanTileApplet.DEBUG) System.err.println("isAlive: image fetch aborted or errored");
//                    pg.notify();
//                    pgThread.notify();
//                }
//                if(pgThread.isInterrupted())
//                {
//                    if(PanTileApplet.DEBUG) System.err.println("pgThread is interrupted...");
//                    return false;
//                }
//                Thread.yield();
//                Thread.sleep(100);
//            }
//            if(PanTileApplet.DEBUG) System.err.println("Exiting isAlive() loop...");
////            while (pg.grabPixels(1000) != true);
////            {
////                if(PanTileApplet.DEBUG) System.err.println("Grabbing()...");
////                Thread.yield();
////                //pixelObject = pg.getPixels();
////            }
////            if ((pg.getStatus() & ImageObserver.ABORT) != 0) 
////            {
////                if(PanTileApplet.DEBUG) System.err.println("image fetch aborted or errored");
////                return false;
////            }
//            
//        }
//        catch (OutOfMemoryError oome)
//        {
//            if(PanTileApplet.DEBUG) System.err.println("(1)Throwable: getImageParametersAndPixels()...");
//            return false;
//        }     
//        catch(InterruptedException ie)
//        {
//            if(PanTileApplet.DEBUG) System.err.println("(1)InterruptedException: getImageParametersAndPixels()...");
//            return false;
//        }
//        catch (Throwable oome)
//        {
//            if(PanTileApplet.DEBUG) System.err.println("(1)Throwable: getImageParametersAndPixels()...");
//            //oome.printStackTrace();
//            return false;
//        }     
        //pixels = (int [])pixelObject;
        return true;
    }
    public Image getSplashImage(URL u)
    {
        
        try
        {
            imageURL = u;
            if(!getImageBytes())
            {
                if(PanTileApplet.DEBUG) System.err.println("(1)Splash Image not found -- " + imageURL.getPath());
                flushImage();
                return image;
            }
            makeImageFromToolkit();          
        }
        catch (Exception e)
        {
            if(PanTileApplet.DEBUG) System.err.println("(2)Splash Image not found --" + imageURL.getPath());
            return null;
        }     
        return image;
    }
    private URL documentBase = null;
    public void setDocumentBase(URL db)
    {
        documentBase = db;
    }
    public void run()
    {
        Thread.yield();
        projector.setImageParameters(4096,2048);
        if(PanTileApplet.DEBUG) System.err.println("PanCyl Image Fetch run()...");
        try
        {
            int suffix = 1;
            for(int tiley = 0; tiley < 2048; tiley += 1024)
            {
                for(int tilex = 0; tilex < 4096; tilex += 1024)
                {
//                    System.err.println("suffix = " + suffix);
                    imageURL = new URL(documentBase,("images/tile" + suffix + ".jpg"));
                    if(!getImageBytes())
                    {
                        canvas.paintMsgScreen("Problem loading " + imageURL.getPath(),false);
                        flushImage();
        //                canvas.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
                        canvas.setCursor(applet.getStopCursor());
                        return;
                    }
                    long pt0 = System.currentTimeMillis();
                    if(!makeBufferedImage())
                    {
                        canvas.paintMsgScreen("Image Creation Failed...",false);
                        flushImage();
                        applet.NOEVENTS = false;
                        return;
                    }
                 
//                  if(!makeImageFromToolkit())
//                    {
//                        canvas.paintMsgScreen("Image Creation Failed...",false);
//                        flushImage();
//                        applet.NOEVENTS = false;
//                        return;
//                    }
//                    if(!getImageParametersAndPixels())
//                    {
//                        canvas.paintMsgScreen("Possible Out Of Memory Error...",false);
//                        pixels = null;
//                        flushImage();
//                        if(PanTileApplet.DEBUG) System.err.println("Grabbing Pixels Failed...");
//                        return;
//                    }                  
                    else
                    {
                        System.err.println((System.currentTimeMillis() - pt0));
                        if(PanTileApplet.DEBUG) System.err.println("Setting pixels...");
    //                    projector.setImageParametersAndPixels(width, height, pixels);  
                        projector.setTile(tilex, tiley, width, height, pixels);
                        flushImage();
                    }
                    suffix++;
                }
            }
        }
        catch(Throwable oome)
        {
            pixels = null;
            pg = null;
            System.gc();
            flushImage();
            if(PanTileApplet.DEBUG) System.err.println("run() -- out of memory error...");
            applet.handleOutOfMemoryError();
        }
//        catch(Exception ex)
//        {
//            canvas.paintErrorScreen(imageURL.getPath());
//            applet.NOEVENTS = false;
//            //if(PanTileApplet.DEBUG) System.err.println("Exception in PanCylAppletImageFetch.run()..." + ex.toString());
//        }
        applet.NOEVENTS = false;
        //return new Point(image.getWidth(previewArea),image.getHeight(previewArea));
    }
}

Reply via email to