import java.applet.*;
import java.awt.*;
import java.util.*;
import java.net.*;
import java.awt.image.*;
import java.awt.event.*;

public class FilterImageMap2 extends Applet implements MouseMotionListener,
MouseListener
{
 int i = 1, u = 1;
 int x1, y1, x2, y2; //click_rect
 int r1, r2, w, h;   //filter_rect
 int X, Y;
 int px1, py1, px2, py2; //line points
 MediaTracker tracker;
 Vector areas, r_filters, text_colors_1, text_colors_2, texts, sta;
 Vector filter_colors, filters, r_filters_color;
 Vector dline, lines_color;
 String imagename, nextarea, text, status;
 Image image, img, filter;
 StringTokenizer st_rect, st_text;
 Graphics g, gr;
 Rectangle r_rect, r_filter, rl, r_line;
 Color filter_color, text_color_1, text_color_2, r_filter_color, line_color;
 int R, B, G, R1, G1, B1, R2, G2, B2, R0, G0, B0, R3, G3, B3;
 Dimension d = new Dimension();
 Image upd_image;

 String fontname;
 int fontsize1, fontsize2, fontstyle;
 Font font1, font2;
 int numlines;
 int[] linewidths;
 String[] lines;

public void init()
{
 String copyrightParam = getParameter("copyright");
 if ((copyrightParam == null) || !copyrightParam.equals(copyright))
               throw new SecurityException("Invalid Copyright");

 tracker = new MediaTracker(this);
 areas = new Vector(); r_filters = new Vector();
 text_colors_1 = new Vector(); text_colors_2 = new Vector();
 texts = new Vector(); sta = new Vector();
 filter_colors = new Vector(); filters = new Vector();
 r_filters_color = new Vector();
 dline = new Vector(); lines_color = new Vector();
  
 d = getSize();
 upd_image = createImage(d.width, d.height);
 gr = upd_image.getGraphics();

 fontsize1 = Integer.parseInt(getParameter("font_size_1"));
 fontsize2 = Integer.parseInt(getParameter("font_size_2"));
 fontstyle = Integer.parseInt(getParameter("font_style"));
 fontname = getParameter("font_name");
 font1 = new Font(fontname, fontstyle, fontsize1);
 font2 = new Font(fontname, fontstyle, fontsize2);

 imagename = getParameter("imagename");

 image = getImage(getDocumentBase(), imagename);
 tracker.addImage(image, 0);
 
 while ((nextarea = getParameter("area" + i++)) != null)
{
  st_rect = new StringTokenizer(nextarea, ",|");

  px1 = Integer.parseInt(st_rect.nextToken()); //drawLine
  py1 = Integer.parseInt(st_rect.nextToken());
  px2 = Integer.parseInt(st_rect.nextToken());
  py2 = Integer.parseInt(st_rect.nextToken());
  r_line = new Rectangle(px1, py1, px2, py2);
  dline.addElement(r_line);

  R3 = Integer.parseInt(st_rect.nextToken()); // line_color
  G3 = Integer.parseInt(st_rect.nextToken());
  B3 = Integer.parseInt(st_rect.nextToken());
  line_color = new Color(R3,G3,B3);
  lines_color.addElement(line_color);
    
  x1 = Integer.parseInt(st_rect.nextToken()); //move_circle
  y1 = Integer.parseInt(st_rect.nextToken());
  x2 = Integer.parseInt(st_rect.nextToken());
  y2 = Integer.parseInt(st_rect.nextToken());
  r_rect = new Rectangle(x1, y1, x2, y2);
  areas.addElement(r_rect);

  R0 = Integer.parseInt(st_rect.nextToken()); //move_circle_color
  G0 = Integer.parseInt(st_rect.nextToken());
  B0 = Integer.parseInt(st_rect.nextToken());
  r_filter_color = new Color(R0, G0, B0);
  r_filters_color.addElement(r_filter_color);

  r1 = Integer.parseInt(st_rect.nextToken()); //filter_rect
  r2 = Integer.parseInt(st_rect.nextToken());
  w = Integer.parseInt(st_rect.nextToken());  //text_width
  h = Integer.parseInt(st_rect.nextToken());  //text_height
  r_filter = new Rectangle(r1, r2, w, h);
  r_filters.addElement(r_filter);

  img = createImage(new FilteredImageSource(image.getSource(),
  new CropImageFilter(r1, r2, w, h)));

  R = Integer.parseInt(st_rect.nextToken());
  G = Integer.parseInt(st_rect.nextToken());
  B = Integer.parseInt(st_rect.nextToken());
  filter_color = new Color(R, G, B);
  filter_colors.addElement(filter_color);

  
  filter = createImage(new FilteredImageSource(img.getSource(),
      new CFilter(filter_color)));
  filters.addElement(filter);

  R1 = Integer.parseInt(st_rect.nextToken());
  G1 = Integer.parseInt(st_rect.nextToken());
  B1 = Integer.parseInt(st_rect.nextToken());
  text_color_1 = new Color(R1,G1,B1);
  text_colors_1.addElement(text_color_1);

  R2 = Integer.parseInt(st_rect.nextToken());
  G2 = Integer.parseInt(st_rect.nextToken());
  B2 = Integer.parseInt(st_rect.nextToken());
  text_color_2 = new Color(R2,G2,B2);
  text_colors_2.addElement(text_color_2);

  status = new String(st_rect.nextToken());
  sta.addElement(status);

  text = getParameter("text" + u++);
  texts.addElement(text);

}
try { tracker.waitForID(0);}
catch (InterruptedException e) {}

addMouseListener(this);
addMouseMotionListener(this);

}

public void paint(Graphics g)
{ 
  gr.drawImage(image, 0, 0, this);
  update(g);
}

public void update(Graphics g)
{
  
  g.drawImage(upd_image, 0, 0, this);
}

 public String copyright = 
          "Copyright (c) 1998 by Rain Ausmaa - All Rights Reserved";

public void mouseMoved(MouseEvent me)
{
  int x = me.getX(), y = me.getY();
  Rectangle newRect = findRectangle(x, y);
  if(newRect != null)
  {
  r_rect = (Rectangle) areas.elementAt(areas.indexOf(newRect));
  r_line = (Rectangle) dline.elementAt(areas.indexOf(newRect));
  line_color = (Color) lines_color.elementAt(areas.indexOf(newRect));
  r_filter = (Rectangle) r_filters.elementAt(areas.indexOf(newRect));
  filter = (Image) filters.elementAt(areas.indexOf(newRect));

  text_color_1 = (Color) text_colors_1.elementAt(areas.indexOf(newRect));
  text_color_2 = (Color) text_colors_2.elementAt(areas.indexOf(newRect));
  r_filter_color = (Color) r_filters_color.elementAt(areas.indexOf(newRect));
  text = (String) texts.elementAt(areas.indexOf(newRect));

  status = (String) sta.elementAt(areas.indexOf(newRect));
  gr.setColor(r_filter_color);
  
  gr.drawOval(r_rect.x , r_rect.y, r_rect.width, r_rect.height); //oval

  gr.setColor(line_color);

  gr.drawLine(r_line.x, r_line.y, r_line.width, r_line.height);

  tracker.addImage(filter, 1);
  try { tracker.waitForID(1); 
  gr.drawImage(filter, r_filter.x, r_filter.y, this);}
  catch (InterruptedException e) {}
  
  Text();
     
  showStatus(status);
  
  }
  else {
  showStatus(""); gr.drawImage(image, 0, 0, this);
  
       } 
repaint();
 
}


public void mouseExited(MouseEvent me)
{
 gr.drawImage(image, 0, 0, this);
 showStatus(""); 
 
 repaint();  
 
}

public void mouseReleased(MouseEvent me) {}
public void mouseClicked(MouseEvent me) {}
public void mouseDragged(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}

public void Text()
{
 st_text = new StringTokenizer(text, "|");
 numlines = st_text.countTokens();
 lines = new String[numlines]; 
 linewidths = new int[numlines];

 for(i = 0; i < numlines; i++) lines[i] = st_text.nextToken();
 
 Y = (int)(r_filter.y+((r_filter.height-numlines * fontsize2+fontsize1)/1.6));

 gr.setColor(text_color_1);

 for(i = 0; i < numlines; i++, Y += fontsize2)
 {
 gr.setFont(font1);
 linewidths[i] = getFontMetrics(font1).stringWidth(lines[i]);
 X = (int)(r_filter.x+(r_filter.width-linewidths[i])/2); 
  
 if (i > 0) { 
 
 gr.setFont(font2);
 
 linewidths[i] = getFontMetrics(font2).stringWidth(lines[i]);
 X = (int)(r_filter.x+(r_filter.width-linewidths[i])/2); 
 }
  gr.drawString(lines[i], X, Y);

  gr.setColor(text_color_2);
  
}
 
}

Rectangle findRectangle(int x, int y)
{
 Enumeration e = areas.elements();
 Rectangle p = null;
 
 while(e.hasMoreElements())
 {
  p = (Rectangle)e.nextElement();
  if(p.contains(x, y)) return p;
 }
 return null;
}

}

class CFilter extends RGBImageFilter {
	Color color;

     public CFilter(Color mask) {
		color = mask;
		canFilterIndexColorModel = true;
	}
	public int filterRGB(int x, int y, int pixel) {

return 255 << 24 |
       (((pixel & 0xff0000) >> 16) * color.getRed()/255) << 16 |
       (((pixel & 0xff00) >> 8) * color.getGreen()/255) << 8 |
       (pixel & 0xff) * color.getBlue()/255 ;
	}
}
