import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.lang.Math;
import java.applet.*;

class sierpgenerator extends Thread
{
    int pix[] = new int[256*256]; // used to store the sierp

// used to store my colors
    byte redv[] = new byte[256];
    byte greenv[] = new byte[256];
    byte bluev[] = new byte[256];
    IndexColorModel cm;         // Palette for my image
    Image img;
    
    Sierp j3 = null;
    
    sierpgenerator (Sierp j)
    {
	j3 = j;
	
	// build the palette 
	buildpalette ();

	// create colormap and image
	cm = new IndexColorModel(8, 256, redv, greenv, bluev);
	img = j3.createImage(new MemoryImageSource(256, 256, cm, pix, 0, 256));
    }
    
    void
    buildpalette()
    {
	int i;
	
	for (i = 0; i < 256; i++) {
	    redv[i] = (byte)((9 * i) % 256);
	    greenv[i] = (byte)((11 * i) % 256);
	    bluev[i] = (byte)((13 * i) % 256);
	}
	return;
    }

    public 
    void run() {
	for (int y = 0; y < 256; y++){
	    for (int x = 0; x < 256; x++){
		pix [x + (y << 8)] = ((x & y) + (x ^ y))%256;
	    }
	}
	img = j3.createImage(new MemoryImageSource(256, 256, cm, pix, 0, 256));
	j3.setImage (img);
    }
}

public class Sierp extends java.applet.Applet {
    sierpgenerator sierp = null;
    boolean sierpsuspended = false;
    Image img = null;

    public 
    void init() {
	resize(256,256);              // Set sierp window size
	sierp = new sierpgenerator (this);
	sierp.start ();
    }
    public 
    void start() {
	if(sierp == null)
	{
	    sierp = new sierpgenerator (this);
	    sierp.start();	
	}
    }
    public 
    void stop() {
	sierp.stop();
	sierp = null;
    }    
    public 
    void update(Graphics g) {
	paint (g);
    } 
    public 
    void paint(Graphics g) {
	if (img != null)
	    g.drawImage(img,0,0,Color.black,this);
    }
    public 
    void setImage (Image img) {
	this.img = img;
	repaint ();
    }
    public
    boolean mouseDown (Event e, int x, int y){
	if (sierpsuspended){
	    sierp.resume();
	}	
	else {
	    sierp.suspend();
	}
	sierpsuspended = !sierpsuspended;
	return true;
    }
}



