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

class Sprite extends Raster {
  int x, y;           // current position of sprite on playfield
  /*  int width, height;  // size of a sprite's frame */
  //  SpriteObserver spr_obs;
  //  SpriteObserver bgnd_obs;
  //  ImageHolder img_hold;

  public Sprite() {}
  
  public Sprite(Image image) // initialize sprite with an image
    {
      super(image);
      /*  spr_obs = new SpriteObserver();
      bgnd_obs = new SpriteObserver();
      img_hold = new ImageHolder();*/
      x = 0;
      y = 0;
    }

  public Sprite(Image image, int x, int y)
    {
      super(image);
      /*      spr_obs = new SpriteObserver();
      bgnd_obs = new SpriteObserver();
      img_hold = new ImageHolder();*/
      
      this.x = x;
      this.y = y;
    }
  
  public void Draw(Raster bgnd)  // draws sprite on a Raster
    {
      /*  doesn't work
      Image new_image = img_hold.createImage(bgnd.width, bgnd.height);
      Graphics g = new_image.getGraphics();
      g.drawImage(bgnd.toImage(),0,0,bgnd_obs);
      g.drawImage(toImage(),x,y,spr_obs);

      bgnd.changeImage(new_image);
      */

      //  I'll assume that the sprite is smaller than the bgnd

      /* figure out the bounds */

      int x1 = x >= 0 ? x : 0;
      int x2 = x + width < bgnd.width ? x + width : bgnd.width;
      int y1 = y >= 0 ? y : 0;
      int y2 = y + height < bgnd.height ? y + height : bgnd.height;

      Color c, b_c;
      int pixel, alpha, red, green, blue;
      int b_pixel, b_alpha, b_red, b_green, b_blue;

     
      /*
      System.err.println(String.valueOf(x)+ " " +
			 String.valueOf(y)+" " +
			 String.valueOf(width)+" " +
			 String.valueOf(height) +" " 
			 +String.valueOf(bgnd.width) + " " +
			 String.valueOf(bgnd.height));
      System.err.println(String.valueOf(x1) + " " +
			 String.valueOf(x2) +" " +
			 String.valueOf(y1) +" " +
			 String.valueOf(y2));*/

      int i,j,u,v;
      for (j = y1, v = 0; j < y2; j++, v++) {
	for (i = x1, u = 0; i < x2; i++, u++) {

	  c = getColor(u,v);
      	  pixel = c.getRGB();
	  alpha = (pixel & 0xFF000000) >>> 24;
	  red =   (pixel & 0x00FF0000) >>> 16;
	  green = (pixel & 0x0000FF00) >>> 8;
	  blue =  pixel & 0x000000FF;

	  b_c = bgnd.getColor(i,j);
	  
      	  b_pixel = b_c.getRGB();
	  b_alpha = (b_pixel & 0xFF000000) >>> 24;
	  b_red =   (b_pixel & 0x00FF0000) >>> 16;
	  b_green = (b_pixel & 0x0000FF00) >>> 8;
	  b_blue =  b_pixel & 0x000000FF;

	  red = red*alpha + b_red*(255-alpha);
	  green = green*alpha + b_green*(255-alpha);
	  blue = blue * alpha + b_blue*(255-alpha);
	  alpha = alpha > b_alpha ? alpha : b_alpha;

	  alpha <<= 24;
	  red <<= 16;
	  green <<= 8;

	  pixel = alpha | red | green | blue;

	  bgnd.setPixel(pixel,i,j);
	  
	}
      }
	  
      
    }

  
};
/*
//class ImageHolder extends Component { };

class SpriteObserver implements ImageObserver
{

  public SpriteObserver() { };
  public boolean imageUpdate(Image img, int infoflags, int x, int y, int width,
			     int height)
    {
      if (((~infoflags) & ALLBITS) != 0) {
	return true;
      } else {
	  return false;
      }
    }

    //maybe write a done() function? 

};
*/
