//File: BlinkApplet.java

/* This is a simple flip-book based drawing of a head
   with one eye shifting side-to-side and the other
   winking.
   
   H. J. Bernstein, 2 December 2001
   
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.Applet;
import FlipBook;

public class BlinkApplet extends Applet
{
// Global data
    FlipBook fb = null;

// Initialization
  public void init() {
  	setBackground(Color.white);
  }


// paint method to do the actual drawing
  public void paint (Graphics g_real) {
    
    // declare variables
    Graphics g;       // a graphics object
    Dimension size    // dimensions of the window
        = getSize();
    int frame;        // the current frame
    int frames;       // the total number of frames
    int cx = size.width,
        cy = size.height,
        diameter = (int)(.8*Math.min(cx, cy));

    // If we have a 300 pixel image, we wil have 24 frames
    // At 90000 pixels per frame, this means 2,160,000
    // pixels.
     
    frames = diameter/10;
    
    // If the flip-book exists and is the right size
    // use the pages we already created.
    
    if (fb == null 
       || fb.curFrames != frames 
       || fb.curWidth != cx 
       || fb.curHeight != cy ) {
       
    fb = new FlipBook(g_real,cx,cy, this, frames);

    
    for (frame = 0; frame < frames; frame++) {

      g = fb.g[frame];

	  // Draw hair
	  g.setColor(Color.red);
	  g.fillOval(cx/2-diameter/3,(cy-diameter)/2-diameter/12,
	            2*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, 60, 60);
      g.drawArc((cx-3*diameter/4)/2,(cy-3*diameter/4)/2,
                 3*diameter/4,3*diameter/4, -50, -80);

	  // Now draw two eyes
	  { int shift;
	  
	    shift = frame - frames/4;
	    if (shift > frames/2) shift = 3*frames/4 - frame;
	    
	    g.setColor(Color.blue);
	    
	    // left side eye (actually the right eye of the head)
	    // this eye will shift
	    
        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+shift,
                 (cy-diameter/10)/2,
                 diameter/10,diameter/10);
                 
        // right side eye
        // this eye will blink
       
        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);

        if (shift > -frames/6 && shift < frames/6) {
          // go to half closed
          g.setColor(Color.yellow);
          g.fillArc((cx+3*diameter/8-diameter/5)/2-1,
                 (cy-diameter/10)/2-1,
                 diameter/5+2,diameter/10+2, 0, 180);
          g.setColor(Color.blue);
          if (shift > -frames/8 && shift < frames/8 ) {
            // go to fully closed
            g.setColor(Color.yellow);
            g.fillArc((cx+3*diameter/8-diameter/5)/2-1,
                 (cy-diameter/10)/2,
                 diameter/5+2,diameter/10-1, 0, -180);
            g.setColor(Color.blue);
            g.drawArc((cx+3*diameter/8-diameter/5)/2-1,
                 (cy-diameter/10)/2,
                 diameter/5+2,diameter/10-1, 0, -180);
          } else {
            g.drawLine((cx+3*diameter/8-diameter/5)/2,cy/2,
                 (cx+3*diameter/8+diameter/5)/2,cy/2);
          }
        }
        
      }
    }
    }
    
    // display the entire flip-book
    for (frame = 0; frame < frames; frame++) {

      g = fb.g[frame];
 
      fb.ShowPage(this,frame);
      try {
        Thread.sleep(50);               // sleep for 50 msec
      } catch (InterruptedException t){}
    }
   try {
      Thread.sleep(1000);              // sleep or 1 sec
    } catch (InterruptedException t) {}
    repaint();
  }

}
