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

public class Raster
{
  protected int width, height;
  public int pixel[];
  public int zbuf[];
  
  ///////////////////////// 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];
    zbuf = 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) {
    }
  }

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

    /**
     *  Returns the number of pixels in the Raster
     */
  public int size( ) {
    return pixel.length;
  }
    
  /**
     *  Access instance variables
     */
  public int getWidth() {
    return width;
  }
    
  public int getHeight() {
    return height;
  }
    
  public int [] getPixels() {
    return pixel;
  }

  /**
     *  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;
  }

  /**
     *  Converts Rasters to Images
     */
  public Image toImage() {
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Image img = toolkit.createImage(new MemoryImageSource(width, height, pixel, 0, width));
    return img;
  }

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

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

  /**
     *  Sets a pixel to a given value
     */
  public boolean setPixel(int pix, int x, int y, int z) {
    if(z < zbuf[y*width+x])
      {
	// For alpha blending, will have to put those calls in here
	pixel[y*width+x] = pix;
	zbuf[y*width+x] = z;
      }
    return true;
  }

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

    for(i=0;i<n;i++)
      zbuf[i] = 16777216;
  }
}
