import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;

public class Filter1 extends Applet implements Runnable
 {
  Image[] image;
  int brightness = -105;
  boolean b = false;
  Thread th;
  int i, index, sleep, speed;
  String next;
  Graphics gr;
  Dimension d = new Dimension();
  Image upd_image;
  MediaTracker tracker;

public void init()
{
 tracker = new MediaTracker(this);

 image = new Image[1000];
 
 for (i = 0; (next = getParameter("image" + i)) != null; i++)
 {
 image[i] = getImage(getDocumentBase(), next);
 tracker.addImage(image[i], i);
 showStatus("Loading images..." + i);
 try { tracker.waitForID(i); } catch (InterruptedException e) {}
 }

 sleep = Integer.parseInt(getParameter("sleep"));
 speed = Integer.parseInt(getParameter("speed"));

 d = size();
 upd_image = createImage(d.width, d.height);
 gr = upd_image.getGraphics();
}
  
public void update(Graphics g)
  {
    gr.drawImage(image[index], 0, 0, this);
    g.drawImage(upd_image, 0, 0, d.width, d.height, this);
  }

public boolean imageUpdate(Image image, int info, int x, 
          int y, int width, int height)
 {
  return true;
 }


public void start()
 {
  if (th == null) {
  th = new Thread(this);
  th.start(); }
 }

public void stop()
{
 th = null;
}

public void run() 
{
 Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
   
 while(true) 
   {
    Number();
    while ((next = getParameter("image" + index)) == null) index = 0; 
    image[index] = getImage(getDocumentBase(), next);
    showStatus(next);
   
    FilterImage();
    repaint();
    try { Thread.sleep(speed); } catch (InterruptedException e) {}
   }
}

public int Number()
{
 if (!b)
 {
  brightness = Math.min(brightness + 5, 0);
  
  if (brightness == 0) b = true;
 }

 else { brightness = Math.max(-105, brightness - 5);
 if (brightness == -105) 
 { 
  b = false;
  try { Thread.sleep(sleep); } catch (InterruptedException e) {}
  index++;  
 } 
      }
 return brightness;
}

public void FilterImage()
{
 image[index] = createImage(new FilteredImageSource(image[index].getSource(),
                   new BFilter(brightness)));
 repaint();
}
}

class BFilter extends RGBImageFilter
 {
  int brightness;

  public BFilter(int b)
  {
    brightness = b;
    canFilterIndexColorModel = true;
  }

  public int filterRGB(int x, int y, int rgb)
  {
    // Get the individual colors
    int r = (rgb >> 16) & 0xff;
    int g = (rgb >> 8) & 0xff;
    int b = (rgb >> 0) & 0xff;

    // Calculate the brightness
    r += (brightness * r) / 100;
    g += (brightness * g) / 100;
    b += (brightness * b) / 100;

    // Check the boundaries
    r = Math.min(Math.max(0, r), 255);
    g = Math.min(Math.max(0, g), 255);
    b = Math.min(Math.max(0, b), 255);

    // Return the result
    return (rgb & 0xff000000) | (r << 16) | (g << 8) | (b << 0);
  }
}
