/* Code originated on 6.837 website: */
/* http://graphics.lcs.mit.edu/classes/6.837/F98/Lecture2/Raster.java */


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

class Raster {
  public int width, height;
  public 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) {
    }
  }
  
  ////////////////////////// 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 final Image toImage(Component root)
  {
    return root.createImage(new MemoryImageSource(width, height, pixel, 0, width));
  }
  
  /**
   *  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;
  }
}
