import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class test1 extends Applet { GridBagLayout total; GridBagConstraints c; PixCanvas B; ControlCanvas C; public void init() { total=new GridBagLayout(); c=new GridBagConstraints(); c.ipadx=50; c.ipady=0; setLayout(total); c.gridheight=GridBagConstraints.REMAINDER; B=new PixCanvas(); B.resize(512,512); B.setBackground(Color.black); C=new ControlCanvas(); B=B.addControl(C); C=C.addControl(B); C.resize(40,512); C.setBackground(Color.black); total.setConstraints(B,c); total.setConstraints(C,c); this.add(B); this.add(C); } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0,0,1000,1000); } } class DBCanvas extends Canvas { public void update(Graphics g) { Graphics g2; Image offscreen = null; offscreen = createImage(size().width, size().height); g2 = offscreen.getGraphics(); paint(g2); g.drawImage(offscreen, 0, 0, this); offscreen.flush(); } } class PixCanvas extends DBCanvas implements MouseListener, MouseMotionListener { Canvas pix; int l; ListenSquare[] T=new ListenSquare[10000]; Color[] COL=new Color[100]; ControlCanvas control; int length; int style; PixCanvas() { addMouseListener(this); addMouseMotionListener(this); int i; pix=new Canvas(); this.pix=pix; this.l=0; T[0]=new ListenSquare(); T[0]=T[0].Square0(); length=0; } public void paint(Graphics g) { int i; for(i=0;i<=length;++i) { if(T[i].dead==0) T[i].render(this.control.style,g); } } PixCanvas addControl(ControlCanvas X) { PixCanvas C=this; C.control=X; return(C); } public void mousePressed(MouseEvent e) { Point y=new Point(); int i; int val; e.consume(); y.x=e.getX(); y.y=e.getY(); val=T[0].locate(y,T,length); T[val].C=this.control.C[4]; if((val>=0)&&this.control.option==1) { T=T[0].sub(T,val,length); length=length+4; T[val].dead=1; } repaint(T[val].minx(),T[val].miny(),T[val].widx(),T[val].widy()); } public void mouseReleased(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } class ColorSet { int i,j,k,val1,val2,on; Color col; ColorSet(int i,int j,int k,int val1,int val2,int on,Color col) { this.i=i; this.j=j; this.k=k; this.val1=val1; this.val2=val2; this.col=col; this.on=on; } int inside(Point p) { int val; val=1; if(p.xthis.i+this.k) val=0; if(p.ythis.j+this.k) val=0; return(val); } void render(Graphics g) { g.setColor(this.col); g.fillRect(this.i,this.j,this.k,this.k); if(this.on==1) { g.setColor(Color.white); g.drawRect(this.i,this.j,this.k,this.k); } } } class ControlCanvas extends DBCanvas implements MouseListener, MouseMotionListener { Canvas Control; int[] on=new int[20]; Color[] C=new Color[10]; ColorSet[][] CS=new ColorSet[4][20]; int style,option; PixCanvas control; ControlCanvas() { Control=new Canvas(); Control=Control; addMouseListener(this); addMouseMotionListener(this); int i,j; on[1]=15; on[2]=0; on[3]=0; C[1]=Color.red; C[2]=new Color(0,180,0); C[3]=Color.blue; C[4]=Color.red; style=2; for(i=1;i<=3;++i) { for(j=0;j<=15;++j) { CS[i][j]=new ColorSet(15*i,15*j,12,i,j,0,C[i]); } } CS[1][15].on=1; CS[2][0].on=1; CS[3][0].on=1; option=1; } public void paint(Graphics g) { int i,j,k; for(i=1;i<=3;++i) { for(j=0;j<=15;++j) { CS[i][j].render(g); } for(k=1;k<=3;++k) { on[3+k]=15*on[k]+16; if(on[k]==0) on[3+k]=0; } g.setColor(C[4]); g.fillRect(60,0,15,235); g.setColor(Color.white); g.drawRect(60,0,15,235); } /*buttons*/ g.setColor(Color.blue); g.fillRect(10,370,60,20); g.fillRect(10,400,60,20); g.fillRect(10,430,60,20); g.setFont(new Font("Helvetica",Font.PLAIN,15)); g.setColor(Color.white); g.drawString("outline?",18,386); g.drawString("sub",18,414); g.drawString("no sub",18,444); g.setColor(Color.white); if(style==2) g.drawRect(10,370,60,20); if(option==1) g.drawRect(10,400,60,20); if(option==2) g.drawRect(10,430,60,20); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("click on the",12,255); g.drawString("little boxes",12,270); g.drawString("to select a",12,285); g.drawString("color. Then",12,300); g.drawString("click on the",12,315); g.drawString("big squares",12,330); g.drawString("to paint or",12,345); g.drawString("subdivide.",12,360); g.setFont(new Font("Helvetica",Font.PLAIN,20)); g.drawString("Rich:",10,480); g.drawString("App 16",10,505); } ControlCanvas addControl(PixCanvas X) { ControlCanvas C=this; C.control=X; return(C); } public void mousePressed(MouseEvent e) { Point y=new Point(); int i,j,k; int val; e.consume(); y.x=e.getX(); y.y=e.getY(); val=0; for(i=1;i<=3;++i) { for(j=0;j<=15;++j) { if(CS[i][j].inside(y)==1) val=i; } } if(val>0) { for(j=0;j<=15;++j) { CS[val][j].on=0; if(CS[val][j].inside(y)==1) { on[val]=j; CS[val][j].on=1; } } } for(k=1;k<=3;++k) { on[3+k]=16*on[k]+15; if(on[k]==0) on[3+k]=0; } C[4]=new Color(on[4],on[5],on[6]); if((y.x>10)&&(y.x<70)&&(y.y>370)&&(y.y<390)) { style=3-style; this.control.repaint(); } if((y.x>10)&&(y.x<70)&&(y.y>400)&&(y.y<420)) option=1; if((y.x>10)&&(y.x<70)&&(y.y>430)&&(y.y<450)) option=2; repaint(); } public void mouseReleased(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } class ListenSquare { double x1,x2; double y1,y2; int dead; Color C; ListenSquare() { this.x1=x1; this.x2=x2; this.y1=y1; this.y2=y2; this.C=C; this.dead=dead; } int inside(Point p) { int val; val=1; if(p.xthis.x2) val=0; if(p.ythis.y2) val=0; return(val); } void render(int j,Graphics g) { g.setColor(this.C); int xx1,yy1,xx2,yy2; xx1=(int)(this.x1); yy1=(int)(this.y1); xx2=(int)(this.x2)-(int)(this.x1); yy2=(int)(this.y2)-(int)(this.y1); g.fillRect(xx1,yy1,xx2,yy2); if(j==2) g.setColor(Color.black); g.drawRect(xx1,yy1,xx2,yy2); } ListenSquare Square0() { ListenSquare L=new ListenSquare(); L.x1=0.0; L.x2=512.0; L.y1=0.0; L.y2=512.0; L.C=Color.white; L.dead=0; return(L); } ListenSquare sub1(ListenSquare L, Color C) { ListenSquare M=new ListenSquare(); M.x1=L.x1; M.y1=L.y1; M.x2=.5*L.x1+.5*L.x2; M.y2=.5*L.y1+.5*L.y2; M.C=C; M.dead=0; return(M); } ListenSquare sub2(ListenSquare L, Color C) { ListenSquare M=new ListenSquare(); M.x1=L.x1; M.y1=.5*L.y1+.5*L.y2; M.x2=.5*L.x1+.5*L.x2; M.y2=L.y2; M.C=C; M.dead=0; return(M); } ListenSquare sub3(ListenSquare L, Color C) { ListenSquare M=new ListenSquare(); M.x1=.5*L.x1+.5*L.x2; M.y1=L.y1; M.x2=L.x2; M.y2=.5*L.y1+.5*L.y2; M.C=C; M.dead=0; return(M); } ListenSquare sub4(ListenSquare L, Color C) { ListenSquare M=new ListenSquare(); M.x1=.5*L.x1+.5*L.x2; M.y1=.5*L.y1+.5*L.y2; M.x2=L.x2; M.y2=L.y2; M.C=C; M.dead=0; return(M); } int locate(Point p,ListenSquare T[],int n) { int i,val,test; val=-1; for(i=0;i<=n;++i) { test=T[i].inside(p); if((test==1)&&(T[i].dead==0)) val=i; } return(val); } ListenSquare[] sub(ListenSquare[] T,int val,int n) { ListenSquare S[]; int i,nn; S=T; S[n+1]=T[val].sub1(T[val],T[val].C); S[n+2]=T[val].sub2(T[val],T[val].C); S[n+3]=T[val].sub3(T[val],T[val].C); S[n+4]=T[val].sub4(T[val],T[val].C); return(S); } int minx() { double x=1000.0; if(x>this.x1) x=this.x1; if(x>this.x2) x=this.x2; return((int)(x)); } int miny() { double y=1000.0; if(y>this.y1) y=this.y1; if(y>this.y2) y=this.y2; return((int)(y)); } int maxx() { double x=-1000.0; if(x