import java.awt.*;
import java.awt.image.*;

class Raster {
	protected int width, height;
	protected int pixel[];

	///////////////////////// 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) {
		}
	}
	/**
	 *  Fills a Raster with a solid color
	 */
	public void fill(Color c) {
		int s = size();
		int rgb = c.getRGB();
		for (int i = 0; i < s; i++)
			pixel[i] = rgb;
	}
	/**
	 *  Gets a color from a Raster
	 */
	public Color getColor(int x, int y) {
		return new Color(pixel[y*width+x]);
	}
	public int getHeight() {
		return height;
	}
	/**
	 *  Gets a pixel from a Raster
	 */
	public int getPixel(int x, int y) {
		return pixel[y*width+x];
	}
	public int [] getPixels() {
		return pixel;
	}
	/**
	 *  Access instance variables
	 */
	public int getWidth() {
		return width;
	}
	/**
	 *  Sets a pixel to a given color
	 */
	public boolean setColor(Color c, int x, int y) {
		pixel[y*width+x] = c.getRGB();
		return true;
	}
	/**
	 *  Sets a pixel to a given value
	 */
	public boolean setPixel(int pix, int x, int y) {
		pixel[y*width+x] = pix;
		return true;
	}
	////////////////////////// Methods //////////////////////////

	/**
	 *  Returns the number of pixels in the Raster
	 */
	public int size( ) {
		return pixel.length;
	}
	/**
	 *  Converts Rasters to Images
	 */
	public Image toImage() {
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image img = toolkit.createImage(new MemoryImageSource(width, height, pixel, 0, width));
		return img;
	}
}