//File:  BufferedHead.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.*;

public class BufferedHead extends Applet {
  //Surprise with an exploding balloon
  // Author: rachel McDermott, September 27, 1996
  //Modified to be a head
  //Modified to use an off-screen buffer
  //  H. J. Bernstein, 11 November 2001

  public void init() {
  	setBackground(Color.white);
  }

  public void paint (Graphics g_real) {
    Image image_g;
    Graphics g;
    Dimension size = getSize();
    int diameter = 0,
        cx = size.width,
        cy = size.height,
        cmin = (int)(.8*Math.min(cx, cy));
        // note:  we adjust the size of the
        // head to leave room for the ears

    image_g = createImage(cx,cy);
    g = image_g.getGraphics();
    
    while (diameter < cmin) {


	  // Draw hair
	  g.setColor(Color.red);
	  g.fillOval(cx/2-diameter/6,(cy-diameter)/2-diameter/6,
	            diameter/3, diameter/3);
	            
      // Draw the head itself

      g.setColor(Color.yellow);
      g.fillOval((cx-diameter)/2, (cy-diameter)/2,
                diameter, diameter);

      // Draw two ears

      g.fillOval((cx-diameter)/2-diameter/10,cy/2-diameter/8,
                diameter/5,diameter/4);
      g.fillOval((cx+diameter)/2-diameter/10,cy/2-diameter/8,
                diameter/5,diameter/4);

      // Draw brow line and smile

      g.setColor(Color.blue);
      g.drawArc((cx-3*diameter/4)/2,(cy-3*diameter/4)/2,
                 3*diameter/4,3*diameter/4, 50, 80);
      g.drawArc((cx-3*diameter/4)/2,(cy-3*diameter/4)/2,
                 3*diameter/4,3*diameter/4, -50, -80);

	  // Now draw two eyes
	  g.setColor(Color.blue);
      g.drawOval((cx-3*diameter/8-diameter/5)/2,(cy-diameter/10)/2,
                 diameter/5,diameter/10);
      g.fillOval((cx-3*diameter/8-diameter/10)/2,(cy-diameter/10)/2,
                 diameter/10,diameter/10);
      g.drawOval((cx+3*diameter/8-diameter/5)/2,(cy-diameter/10)/2,
                 diameter/5,diameter/10);
      g.fillOval((cx+3*diameter/8-diameter/10)/2,(cy-diameter/10)/2,
                 diameter/10,diameter/10);
      g_real.drawImage(image_g,0,0,this);
      diameter++;
      try {
        Thread.sleep(20);               // sleep for 20 msec
      } catch (InterruptedException t){}
    }

  	    	Font current = getFont();
    		FontMetrics metrics = getFontMetrics (current);
                int ws = metrics.stringWidth("Surprise!");
                int hf = metrics.getHeight();
                    		
    		g.setColor(Color.red);
    		g.drawString("Surprise!", (cx-ws)/2, (cy+hf)/2);
      		g_real.drawImage(image_g,0,0,this);
   try {
      Thread.sleep(1000);              // sleep or 1 sec
    } catch (InterruptedException t) {}
    repaint();
  }
}
