/*
 * Images.java
 * Created on Apr 11, 2005
 */
package kernel;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.PixelGrabber;
import java.net.URL;

import javax.vecmath.GVector;

/**
 * Utility class for dealing with images.
 */
public final class Images {
    
    private static Toolkit TOOLKIT = Toolkit.getDefaultToolkit();

    private Images() {}
    
    public static Image fromFile(String filename) {
        return TOOLKIT.getImage(filename);
    }
    
    public static Image fromURL(URL url) {
        return TOOLKIT.getImage(url);
    }
    
    /**
     * Returns a vector of the data in the given image.
     */
    public static GVector asVector(Image image, int width, int height) {
        int[] pixels = new int[width * height];
        PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height, pixels, 0, width);
        try { pg.grabPixels(); }
        catch(InterruptedException e) { throw new RuntimeException(e); }
        
        GVector data = new GVector(3 * pixels.length);
        for(int i = 0; i < pixels.length; i++) {
            int red   = (pixels[i] >> 16) & 0xff;
            int green = (pixels[i] >>  8) & 0xff;
            int blue  = (pixels[i]      ) & 0xff;
            data.setElement(3 * i    , red);
            data.setElement(3 * i + 1, green);
            data.setElement(3 * i + 2, blue);
        }
        
        return data;
    }
    
    /**
     * An image observer that waits until data all bits are known about
     * an image.
     */
    /*private static final class WaitImageObserver implements ImageObserver {
        
        private boolean imageReady;
        private Waiter waiter = new Waiter();
        
        public boolean imageUpdate(Image image, int infoflags, int x, int y,
                int width, int height) {
            imageReady = TOOLKIT.prepareImage(image, -1, -1, waiter);
            if (!imageReady) {
                synchronized(this) {
                    try { while(!imageReady) wait(); }
                    catch (InterruptedException e) {}
                }
            }
            return false;
        }
        
        private class Waiter implements ImageObserver {
            public boolean imageUpdate(Image image, int infoflags, int x, int y,
                    int width, int height) {
                if ((infoflags & ImageObserver.ALLBITS) == ImageObserver.ALLBITS) {
                    synchronized(WaitImageObserver.this) {
                        imageReady = true;
                        WaitImageObserver.this.notify();
                    }
                    return false;
                }
                return true;
            }
        }
        
    }*/

}
