/*  JitterText    revised by W.Giel 2 Mar 96    Revised init(), revised paint(),added update() w/buffered image,    added color and speed params, added code to optimize font height.    based on NervousText Applet    by  Daniel Wyszynski         Center for Applied Large-Scale Computing (CALC)         04-12-95            revised by kwalrath 5-9-95     Parameters: TEXTCOLOR - string - Hex RGB triplet - default: #000000 (black)                BGCOLOR   - string - Hex RGB triplet - default: #C0C0C0 (light gray)                TEXT      - string - message - degault: "Java Power!"                SPEED     - int    - delay in millisecond - default: 200 */import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Image;public class JitterText extends java.applet.Applet implements Runnable {	char separated[];	String s = null;	Thread killme = null;	int i;	String num;	int counter = 0;	boolean threadSuspended = false; // added by kwalrath	// //////////////////	// Added by W.Giel	// //////////////////	int fontHeight;	Color textColor = null;	Color bgColor;	int speed = 200;	FontMetrics fm;	int baseline;	Image offScrImage;	Graphics offScrGC;	boolean normal = false;	Font font;	// ///////////////////	// Revised by W.Giel	// ///////////////////	public void init() {		String param;		Graphics g = getGraphics();		fontHeight = getHeight() - 10;		offScrImage = createImage(getWidth(), getHeight());		offScrGC = offScrImage.getGraphics();		s = getParameter("text");		if (s == null)			s = "Java Power!";		int maxlen = getWidth() - (s.length() + 1) * 5 - 10;		do {			g.setFont(new Font("TimesRoman", Font.BOLD, fontHeight));			fm = g.getFontMetrics();			if (fm.stringWidth(s) > maxlen)				fontHeight--;		} while (fm.stringWidth(s) > maxlen);		baseline = getHeight() - fm.getMaxDescent();		font = new Font("TimesRoman", Font.BOLD, fontHeight);		if (null == (param = getParameter("TEXTCOLOR")))			textColor = Color.black;		else			textColor = parseColorString(param);		if (null == (param = getParameter("BGCOLOR")))			bgColor = Color.lightGray;		else			bgColor = parseColorString(param);		setBackground(bgColor);		if (null != (param = getParameter("SPEED")))			speed = Integer.valueOf(param).intValue();		if (0 == speed)			speed = 200;		separated = new char[s.length()];		s.getChars(0, s.length(), separated, 0);		killme = new Thread(this);	}	public void start() {		if (null != killme)			killme.start();	}	public void stop() {		if (null != killme)			killme.stop();		killme = null;	}	public void run() {		while (killme != null) {			try {				Thread.sleep(200);			} catch (InterruptedException e) {			}			repaint();		}		System.exit(0);	}	public boolean mouseDown(java.awt.Event evt, int x, int y) {		if (threadSuspended) {			killme.resume();			normal = false;		} else {			normal = true;			repaint();			killme.suspend();		}		threadSuspended = !threadSuspended;		return true;	}	// /////////////////	// Added by W.Giel	// /////////////////	public void paint(Graphics g) {		if (normal) {			g.setColor(bgColor);			g.fillRect(0, 0, getWidth(), getHeight());			g.setColor(textColor);			g.setFont(font);			g.drawString(s, (getWidth() - fm.stringWidth(s)) / 2, baseline);		}	}	public void update(Graphics g) {		offScrGC.setColor(bgColor);		offScrGC.fillRect(0, 0, getWidth(), getHeight());		offScrGC.setColor(textColor);		offScrGC.setFont(font);		if (!normal) {			int x_coord = 0;			for (i = 0; i < s.length(); i++) {				x_coord += (int) (Math.random() * 10);				int y_coord = baseline - (int) (Math.random() * 10);				String substr = s.substring(i, i + 1);				offScrGC.drawString(substr, x_coord, y_coord);				x_coord += fm.stringWidth(substr);			}		} else			offScrGC.drawString(s, (getWidth() - fm.stringWidth(s)) / 2,					baseline);		g.drawImage(offScrImage, 0, 0, this);	}	private Color parseColorString(String colorString) {		if (colorString.length() == 6) {			int R = Integer.valueOf(colorString.substring(0, 2), 16).intValue();			int G = Integer.valueOf(colorString.substring(2, 4), 16).intValue();			int B = Integer.valueOf(colorString.substring(4, 6), 16).intValue();			return new Color(R, G, B);		} else			return Color.lightGray;	}}
