/////////////////////
// Sidney Chang    //
// 6.837 Project 1 //
// TA: Jacob F11   //
// 9/28/98         //
/////////////////////

import java.awt.*;
import java.awt.image.*;
             
class Raster {
  
  // Variables
  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 int size( ) {
    return pixel.length;
  }
  
  /**
   *  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) {
    pixel[y*width+x] = pix;
    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;
  }
}


