import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;

public class RainbowFilter2 extends Applet
{
 Image image, img;
 MediaTracker tracker; 

 public void init()
 {
  tracker = new MediaTracker(this);
  
  image = getImage(getDocumentBase(), getParameter("imagename"));
  tracker.addImage(image, 0);
 
  img = createImage(new FilteredImageSource(image.getSource(), new RFilter()));
  tracker.addImage(img, 1);

  try { tracker.waitForAll(); } catch (InterruptedException e) {}

  
 }

 public void paint(Graphics g)
 {
  g.drawImage(img, 0, 0, this);
 }

 public void update(Graphics g)
 {
  paint(g);
 }
}

class RFilter extends RGBImageFilter
{
  int width, height;
  float[] hsb = new float[3];
    
  public void setDimensions(int w, int h) 
  {
   super.setDimensions(w, h);
    width = w;
    height = h;
        
  
  }

  public void filterRGBPixels(int x, int y, int w, int h,
                                int pixels[], int offset, int scansize) 
  {
        int i = offset;

        for (int cy = 0; cy < w; cy++)
        {
         hsb [1] += 0.5f - (float) x / width;

         for (int cx = 0; cx < h; cx++)
         {  
          Color c = new Color(pixels[i]);
          Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), hsb);

          hsb [0] += 0.5f - (float) y / height;
          hsb [2] = Math.max(0.0f, Math.min(1.0f, hsb[2]));

          pixels[i] = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);                   
	  i++;			
    
                    
          }
         i += scansize - w;
        }
        consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(),
                           pixels, offset, scansize);
    }
    
    public int filterRGB(int x, int y, int pixel) { return 0; }
}


