//Brad Culberson 04.23.98
//Checkerboard with a twist.

import java.awt.*;
import java.applet.Applet;

public class MyApplet12 extends Applet implements Runnable
   {int frameNumber = 0;            
    int fps = 5;                     
    int delay;                       
    Thread animatorThread;           
    boolean frozen = true;
    Font font=new Font("TimesRoman",Font.BOLD,24);
    String framestr;
    int squareSize = 20;                
    boolean createTopSquareNextFrame = false; 
    Dimension preImageDim;           
    Image preImage;                   
    Graphics preImageGraphics;          
    Color dkpink = new Color(255,0,128);  
    
    public void init()
       {setBackground(dkpink);
	String str1, str2;                     
        str1 = getParameter("fps");      
        try                          
         {if (str1 != null)
           {fps = Integer.parseInt(str1);} 
          }                               
        catch (Exception e) {}             
        str2 = getParameter("squareSize"); 
        try                              
	 {if (str2 != null) 
	   {squareSize = Integer.parseInt(str2);} 
	  }                                   
        catch (Exception e) {}          
	}

    public boolean mouseDown(Event e, int x, int y)
       {if (frozen)
         {frozen = false;
          start();}
        else
         {frozen = true;
          animatorThread = null;        
	  }                           
        return true;                   
        }                                

    public void start()
       {if (frozen) { }                   
        else                               
         {if (animatorThread == null)  
           {animatorThread = new Thread(this);} 
          animatorThread.start();                
          }                                   
        }

    public void run()
       {Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        long startTime = System.currentTimeMillis();             
	int delayLong = (fps > 0) ? (10000/fps): 1000;   
	int delayShort = (fps > 0) ? (1000/fps): 100;    
	
        while (Thread.currentThread() == animatorThread) 
           {frameNumber++;                              
            squareSize = size().width % frameNumber;
	    if (squareSize == 0) squareSize = 1;
	    framestr = "";              		 
            repaint();                                  
	    if (frameNumber != 0)                      
	     {delay = delayShort;}                     
	    else                                        
	     {delay = delayLong;}                         
            try                                       
             {startTime += delay;
              Thread.sleep(Math.max(0,
                                    startTime-System.currentTimeMillis()));
              }
            catch (InterruptedException e) {break;}    
            }                                            
        }                                            
    
    public void paint(Graphics g)        
     {if (!frozen) update(g);}           
					
    public void update(Graphics g)        
     {Dimension d = size();                  
      boolean createTopSquare;
      boolean fillSquare;
      int frameShift;
      int squareWidth, squareHeight;
      int x = 0, y = 0;
      int extendRow = 0;
           
      if ((preImageGraphics == null) ||              
	  (d.width != preImageDim.width) ||          
	  (d.height != preImageDim.height))          
	   {preImageDim = d;                           
	    preImage = createImage(d.width,d.height); 
	    preImageGraphics = preImage.getGraphics();
	    }                                
      preImageGraphics.setColor(getBackground());      
      preImageGraphics.fillRect(0,0,d.width,d.height); 
      preImageGraphics.setFont(font);                
      preImageGraphics.setColor(Color.black);          
      preImageGraphics.drawString(framestr,155,39);   
      
      createTopSquare = createTopSquareNextFrame;
      frameShift = frameNumber % squareSize; 
        				    
      if (frameShift == 0)                   
       {squareWidth = squareSize;          
	createTopSquareNextFrame = !createTopSquare; 
        }                                           
      else                                          
       {squareWidth = frameShift;                  
	createTopSquareNextFrame = createTopSquare; 
        }                                            
						  			    
      fillSquare = createTopSquare;       	    				  
      
      while (x < d.width)                   
       {int extendColumn = 0;              
	while (y < d.height)              
	 {extendColumn += squareSize;   
	  if (extendColumn <= d.height)      
	   {squareHeight = squareSize;}
	  else                              
	   {squareHeight = d.height - y;}    
	  if (fillSquare)                   
	   {preImageGraphics.fillRect(x, y, squareWidth, squareHeight);
	    fillSquare = false;
	    } 
	  else 
	   {fillSquare = true;}
	  y += squareHeight;                
	  }                                 
	x += squareWidth;                                      
	y = 0;                                    
	extendRow += squareWidth;                 
	if (extendRow <= d.width)             
	 {squareWidth = squareSize;}
	else                                   
	 {squareWidth = d.width - x;}             
	createTopSquare = !createTopSquare;        
	fillSquare = createTopSquare;             
	}                                                 
						                                                                                     
       g.drawImage(preImage,0,0,this);	          
       }
       
    public void stop()
     {animatorThread = null;   
      preImageGraphics = null;  
      preImage = null;
      }	
    }