/*
   FilterImage.java
   Burton Rosenberg
   Wed Jul 23 17:40:51 EDT 1997

   And example of the Image Filters

*/


import java.applet.* ;
import java.awt.* ;
import java.awt.image.* ; // IMPORTANT!

public class FilterImage
extends Applet {

 
/*
                                       FilerImageSource
                                             is-a
   Image --------> ImageProducer -----> ImageProducer ----------> Image
         getSource                             ^      createImage
                                               |
                MyImageFilter is-a             |
            RGBImageFilter is-a ImageFilter ---+
*/

   Image origImg ;
   Image filteredImg ;
   final static int DEFAULT_MASK = 0xffff0000 ;


   final static int [] maskValues = 
      { 0xffff0000, 0xff00ff00, 0xff0000ff,
        0xffff0000, 0xff00ff00, 0xff0000ff,
        0xff000000, 0xff808080, 0xffc0c0c0,
        0xffe0e0e0, 0xfff0f0f0, 0xff0f0f0f } ;
   final static String [] maskNames =
      { "red", "green", "blue", "R", "G", "B",
        "alpha", "1bit", "2bit", "3bit", "4bit",
        "mod16" } ;
  final static String [][] pInfo ={
        {"image", "filename", "image name in documentBase url"},
        {"mask", "red, blue, green, R, G, B, alpha, 1bit, 2bit, 3bit, 4bit," +
                 "mod16", "color mask" }
      } ;
   final static String aInfo = "FilterImage by Burton Rosenberg Jul 24 1997" ;

   public void init() {

      origImg = getImage( getCodeBase(), getParameter("image") ) ;
      String maskByName = getParameter("mask") ;

      int mask = DEFAULT_MASK ;
      if (maskByName!=null) 
         for ( int i=0; i<maskNames.length; i++ ) {
            if ( maskNames[i].equals(maskByName) ) {
               mask = maskValues[i] ;
               break ;
            }

         }

      MyImageFilter myImageFilter = new MyImageFilter(mask) ;
    
      filteredImg = createImage( 
         new FilteredImageSource( origImg.getSource(), myImageFilter )  ) ;
    
   }
 
   public void paint(Graphics gc) {
      System.out.println("Drawing: " + filteredImg) ;
      gc.drawImage(filteredImg, 0, 0, this ) ;
   }
  
   public String[][] getParameterInfo() {
      return pInfo ;
   }

   public String getAppletInfo() {
      return aInfo ;
   }

}

class MyImageFilter
extends RGBImageFilter {

   int mask ;

   MyImageFilter (int mask) {
      this.mask = mask ;
      canFilterIndexColorModel = true ;
   }

   public int filterRGB( int x, int y, int pixel ) {
      return mask & pixel ;
   }

}
