
import java.awt.*;
import java.awt.image.*;

class Raster {
  static Toolkit toolkit = Toolkit.getDefaultToolkit();
  public int width, height;
  public int pixel[];
  private MemoryImageSource mis;
    ///////////////////////// Constructors //////////////////////

    /**
     *  This constructor, which takes no arguments,
     *  allows for future extension.
     */
    public Raster()
    {
    }

    /**
     *  This constructor creates an uninitialized
     *  Raster Object of a given size (w x h).
     */
    public Raster(int w, int h)
    {
        width = w;
        height = h;
        pixel = new int[w*h];
    }

    /**
     *  This constructor creates an Raster initialized
     *  with the contents of an image.
     */
    public Raster(Image img)
    {
        try {
            PixelGrabber grabber = new PixelGrabber(img, 0, 0, -1, -1, true);
            if (grabber.grabPixels()) {
                width = grabber.getWidth();
                height = grabber.getHeight();
                pixel = (int []) grabber.getPixels();
            }
        } catch (InterruptedException e) {
        }

	// NOTE:  I did a tad of optimizing here.  I re-used the same MemoryImageSource
	//        rather than creating a new one each time we draw the rasters.
	mis = new MemoryImageSource(width, height, pixel, 0, width);
    }

    ////////////////////////// Methods //////////////////////////

    /**
     *  Returns the number of pixels in the Raster
     */
    public final int size( )
    {
        return pixel.length;
    }

    /**
     *  Fills a Raster with a solid color
     */
    public final void fill(Color c)
    {
        int s = size();
        int rgb = c.getRGB();
        for (int i = 0; i < s; i++)
            pixel[i] = rgb;
    }

    /**
     *  Converts Rasters to Images
     */
  public Image toImage() {
   
    Image img = toolkit.createImage(mis);
    return img;
  }

    /**
     *  Gets a pixel from a Raster
     */
    public final int getPixel(int x, int y)
    {
        return pixel[y*width+x];
    }

    /**
     *  Gets a color from a Raster
     */
    public final Color getColor(int x, int y)
    {
        return new Color(pixel[y*width+x]);
    }

    /**
     *  Sets a pixel to a given value
     */
    public final boolean setPixel(int pix, int x, int y)
    {
        pixel[y*width+x] = pix;
        return true;
    }

    /**
     *  Sets a pixel to a given color
     */
    public final boolean setColor(Color c, int x, int y)
    {
        pixel[y*width+x] = c.getRGB();
        return true;
    }
}
