import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.image.*;

public class BannerText4 extends Applet implements Runnable {
	
String text = new String();
String[] lines;           
int[] linewidths;
int i, y, x, a, sleep, speed;
int x1, y1, w, h; //CropImageFilter coords.
int lineascent, numlines;          
FontMetrics fm;
Graphics gr, g;
Dimension d = new Dimension();
Image upd_image;
Thread th;
int fontsize1, fontsize2, fontstyle;
String fontname;
Font font1, font2;
Color filtercolor, fontcolor1, fontcolor2;
Image image, img, filter;
MediaTracker tracker;
int[] ints;
int color1, r1, g1, b1, red1, green1, blue1; //font_color_1
int color2, r2, g2, b2, red2, green2, blue2; //font_color_2
boolean boolean1 = false, boolean2 = false;
int step1, step2;
	
public void init()
{
 img = getImage(getDocumentBase(), getParameter("image"));

  tracker = new MediaTracker(this);
  ints = parseInt(getParameter("filter_color"), ",");
  filtercolor = new Color(ints[0], ints[1], ints[2]);

  StringTokenizer c1 = new StringTokenizer
  (getParameter("font_color_1"), ",");
  r1 = Integer.parseInt(c1.nextToken());
  g1 = Integer.parseInt(c1.nextToken());
  b1 = Integer.parseInt(c1.nextToken());  

  StringTokenizer c2 = new StringTokenizer
  (getParameter("font_color_2"), ",");
  r2 = Integer.parseInt(c2.nextToken());
  g2 = Integer.parseInt(c2.nextToken());
  b2 = Integer.parseInt(c2.nextToken());  

  StringTokenizer crop = new StringTokenizer(getParameter("crop"), ",");
  x1 = Integer.parseInt(crop.nextToken());
  y1 = Integer.parseInt(crop.nextToken());
  w = Integer.parseInt(crop.nextToken());
  h = Integer.parseInt(crop.nextToken());

  image = createImage(new FilteredImageSource(img.getSource(),
  new CropImageFilter(x1, y1, w, h)));

  filter = createImage(new FilteredImageSource(image.getSource(),
      new CFilter(filtercolor)));
  
  tracker.addImage(filter, 1);
  tracker.addImage(img, 1);

  speed = Integer.parseInt(getParameter("speed"));
  sleep = Integer.parseInt(getParameter("sleep"));

  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);

  step1 = step2 = Integer.parseInt(getParameter("step"));

  d = size();
  upd_image = createImage(d.width, d.height);
  gr = upd_image.getGraphics();
  g = getGraphics();

  fm = this.getToolkit().getFontMetrics(this.getFont());
  lineascent = fm.getAscent();
  
  try { tracker.waitForID(1); }
  catch (InterruptedException e) {}

}

int[] parseInt(String s, String sep) 
    {
	StringTokenizer st = new StringTokenizer(s, sep);
        int[] result = new int[st.countTokens()];

	for (int i=0; i<result.length; i++) {
            result[i] = Integer.parseInt(st.nextToken());
	}
        return result;
    }

public void start()
 {
  if (th == null) {
  th = new Thread(this);
  th.start(); }
 }

 public void run()
  {
   
   while (true)
   {
   Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
   
   while ((text = getParameter("text" + a)) == null) a = 0;     
   repaint();
            
   try {				// speed
     th.sleep(speed); }
     catch (InterruptedException e) {}
     
     }
   }

public void stop()
  {
   th = null;
   }
		
	
public void update(Graphics g)
{
gr.setColor(getBackground());          //tyhjä kuva
gr.fillRect(0, 0, d.width, d.height);

gr.drawImage(img, 0, 0, this);

gr.drawImage(filter, x1, y1, w, h, this);

StringTokenizer t = new StringTokenizer(text, "|");
numlines = t.countTokens();
lines = new String[numlines]; 
linewidths = new int[numlines];

for(i = 0; i < numlines; i++) lines[i] = t.nextToken();
 
 y = (int)(y1 + ((h - numlines * fontsize2+12)/1.8));

 FontColor1();
 gr.setColor(new Color(color1));

 for(i = 0; i < numlines; i++, y += fontsize2)
 {
 gr.setFont(font1);
 linewidths[i] = getFontMetrics(font1).stringWidth(lines[i]);
 x = x1+(w-linewidths[i])/2;
  
 if (i > 0) { 
 
 gr.setFont(font2);
 
 linewidths[i] = getFontMetrics(font2).stringWidth(lines[i]);
 x = x1+(w-linewidths[i])/2;
 }
  gr.drawString(lines[i], x, y);

  FontColor2();
  gr.setColor(new Color(color2));
  
  if (boolean1 == true & boolean2 == true) 
  { 
   boolean1 = boolean2 = false; 
   red1 = green1 = blue1 = 0;
   red2 = green2 = blue2 = 0;
   a++;
  try {	th.sleep(sleep); } catch (InterruptedException e) {}
  }
  
 }
 
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 int FontColor1()
{
 if (!boolean1) 
 {
 red1+=step1; green1+=step1; blue1+=step1;
 if (red1 >= r1) red1 = r1;
 if (green1 >= g1) green1 = g1;
 if (blue1 >= b1) blue1 = b1;
 color1 = (red1 << 16)|(green1 << 8)|blue1;
 if (red1 >= r1 & green1 >= g1 & blue1 >= b1)
   { 
  boolean1 = true;
   }
 } 
 return color1; 
}

public int FontColor2()
{
 if (!boolean2)
 {
 red2+=step2; green2+=step2; blue2+=step2;
 if (red2 >= r2) red2 = r2;
 if (green2 >= g2) green2 = g2;
 if (blue2 >= b2) blue2 = b2;
 color2 = (red2 << 16)|(green2 << 8)|blue2;
 if (red2 >= r2 & green2 >= g2 & blue2 >= b2)
  { 
  boolean2 = true;
  }
 } 
 return color2; 
}

}

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 ;
	}
}
