/* So what we do is when user draws with components, the screen sees off cpts; so does imgOff; imgOn gets the same thing, but with some of the LEDs lit (i.e. images come from the lit palette?; imgOnZ gets the appropriate LEDs lit and the appropriate polcaps zorched, and imgOffZ gets no lit LEDs but appropriate polcaps zorched. Then when user turns on voltage: if nfwdled > 0, we sub in fadings from imgOff to imgOn -- speed fn of caps (else imgOff=imgOn) then, if nrevpol>0, we sub in fadings from imgOn to imgOnZ -- slowly (steps 0 to 3). (else imgOn=imgOnZ) When user turns off voltage: imgOff becomes= imgOffZ. if nfwdled>0, we sub in fadings from imgOnZ to imgOff (Their zorchinesses should be the same, so if nfwdled=0, never mind.) Enable further drawing (and clearing), adding cpts normally to imgOff, lit to imgOn, z/l to imgOnZ, z/off to imgOffZ. KLUDGES: skip checking whether there's really anything to redraw -- nled,npol instead of nfwdled>0 or nrevpol>0. if an LED is reversed or a POL is forward, its partner in other is itself. Then how do you know whether any smoking's gonna happen? Oh, well. So that'll be a boring delay. */ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class Hosed extends Applet { public colorChip[] palette; int nled=0, nres=0, ncap=0, npol=0, nNewPol=0; public static final int NONE=0; public static final int LED=1; public static final int RES=2; public static final int CAP=3; public static final int POL=4; Panel chipcol; // colors hCanvas vcol,gcol; //+5V and GND hCanvas cvs; cCanvas[] chips; Image switchOpen, switchClosed, ground; MediaTracker powerMt; Image imgOff, imgOn, imgOnZ, imgOffZ, interpImg; //offscreen buffers; LEDs unlit, lit. pols zorched, unz int[] offArr, onArr, onZArr, interpArr; MemoryImageSource mis; int[] whiteArr; MemoryImageSource whiteMis; Image whiteImg; int last_x, last_y; int currentColor = 0; boolean power=false; boolean running=false; int scatter = 0; int rate = 0; Applet thisApplet=this; class hCanvas extends Canvas { Image img=null; hCanvas() { super(); } public void update(Graphics g) { paint(g); } public void paint() { paint(this.getGraphics()); } public void paint(Graphics g) { if (img!= null) g.drawImage(img,0,0,this); else { g.setColor(Color.lightGray); g.fillRect(0,0, getSize().width, getSize().height); } } } class cCanvas extends Canvas { Image img1, img2; boolean me; cCanvas() { super(); me=false; } cCanvas(Image img1, Image img2, boolean me) { super(); this.img1 = img1; this.img2 = img2; this.me = me; } public void update(Graphics g) { paint(g); } public void paint() { paint(this.getGraphics()); } public void paint(Graphics g) { if ((img1!= null)&&(img2!=null)) { g.setColor(me?Color.white:Color.lightGray); g.fillRect(0,0, getSize().width,getSize().height); g.drawImage(img1, getSize().width/3-img1.getWidth(this)/2, getSize().height/3-img1.getHeight(this)/2, this); g.drawImage(img2, (2*getSize().width)/3-img2.getWidth(this)/2, (2*getSize().height)/3-img2.getHeight(this)/2, this); } } } class colorChip { int type1,type2, numType1, numType2; Image[] imgs, other; int[] w; int[] h; String name; MediaTracker mt; // so imgs in imgs/colornumber.gif with a lit/zorched counterpart // (all pols and .5 leds -- ack -- so LEDs should all have a lit // ctpt but for the revd ones and res/cap/none it'll look the // same, ick, whatever) are going to have it in // other/colornumber.gif colorChip(int numImgs, int type, String colorName, String prefix, String suffix) { type1 = type; type2 = type; numType1 = numImgs; numType2 = 0; imgs = new Image[numImgs]; other = new Image[numImgs]; w = new int[numImgs]; h = new int[numImgs]; name = colorName; mt = new MediaTracker(thisApplet); for (int i=0; i1?1:0]: palette[i].imgs[palette[i-1].imgs.length], i==0?true:false); // Was that obscure enough? It means if it's even (roygbv), // draw the same image twice -- or the first and second if // there's more than one -- and if it's odd (ro oy yg gb bv // vr), draw the first one of each color. Yikes! chips[i].setSize(40,400/12); chipcol.add(chips[i]); } validate(); } void listeners() { chips[0].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 0; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[1].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 1; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[2].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 2; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[3].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 3; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[4].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 4; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[5].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 5; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[6].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 6; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[7].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 7; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[8].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 8; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[9].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 9; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[10].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 10; chips[currentColor].me = true; chips[currentColor].paint(); } } ); chips[11].addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { chips[currentColor].me = false; chips[currentColor].paint(); currentColor = 11; chips[currentColor].me = true; chips[currentColor].paint(); } } ); cvs.addMouseListener (new MouseAdapter() { public void mouseEntered(MouseEvent e) { cvs.requestFocus(); } public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); } } ); cvs.addMouseMotionListener (new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { int i, j, xx, yy; if (power) return; int x = e.getX(), y = e.getY(); for (j=0; j=10) scatter -=10; if (rate>=1) rate -=1; } else if ((e.getKeyCode() == KeyEvent.VK_UP) || (e.getKeyCode() == KeyEvent.VK_RIGHT)) { scatter += 10; rate += 1; } } } ); vcol.addMouseListener (new MouseAdapter() { public void mousePressed(MouseEvent e) { int roff, goff, boff, ron, gon, bon, ronz, gonz, bonz, rinterp, ginterp, binterp; if (running) return; running = true; power = !power; if(power) { vcol.img = switchClosed; vcol.paint(); //light right LEDs if ((ncap+npol==0)||(nled==0)) //quick decay { cvs.img = imgOn; cvs.paint(); } else { PixelGrabber pgOff = new PixelGrabber (imgOff, 0,0, 400,400, offArr, 0,400); try{ pgOff.grabPixels(); } catch (InterruptedException ie) { ; } PixelGrabber pgOn = new PixelGrabber (imgOn, 0,0, 400,400, onArr, 0,400); try{ pgOn.grabPixels(); } catch (InterruptedException ie) { ; } for(int l=0; l<=(ncap+npol); l++) { for (int i=0; i<400*400; i++) { // GOING FROM OFF TO ON ron= (onArr[i]&0xFF0000)>>16; gon= (onArr[i]&0x00FF00)>>8; bon= (onArr[i]&0x0000FF); roff= (offArr[i]&0xFF0000)>>16; goff= (offArr[i]&0x00FF00)>>8; boff= (offArr[i]&0x0000FF); rinterp= (l*ron + (ncap+npol-l)*roff)/(ncap+npol); ginterp= (l*gon + (ncap+npol-l)*goff)/(ncap+npol); binterp= (l*bon + (ncap+npol-l)*boff)/(ncap+npol); interpArr[i]= 0xFF000000 | rinterp <<16 | ginterp <<8 | binterp; } mis.newPixels(0,0,400,400); cvs.img=interpImg; cvs.paint(); } } // zorch reversed pols if (nNewPol==0) { running=false; return; } nNewPol=0; PixelGrabber pgOnZ = new PixelGrabber (imgOnZ, 0,0, 400,400, onZArr, 0,400); try{ pgOnZ.grabPixels(); } catch (InterruptedException ie) { ; } for(int l=0; l<=3; l++) { for (int i=0; i<400*400; i++) { // GOING FROM ON TO ONZ ron= (onArr[i]&0xFF0000)>>16; gon= (onArr[i]&0x00FF00)>>8; bon= (onArr[i]&0x0000FF); ronz= (onZArr[i]&0xFF0000)>>16; gonz= (onZArr[i]&0x00FF00)>>8; bonz= (onZArr[i]&0x0000FF); rinterp= (l*ronz + (3-l)*ron)/(3); ginterp= (l*gonz + (3-l)*gon)/(3); binterp= (l*bonz + (3-l)*bon)/(3); interpArr[i]= 0xFF000000 | rinterp <<16 | ginterp <<8 | binterp; } mis.newPixels(0,0,400,400); cvs.img=interpImg; cvs.paint(); } // imgOff = imgOffZ; // imgOn = imgOnZ; // or is that imgOff.getGraphics().drawImage(imgOffZ, 0,0,thisApplet); imgOn.getGraphics().drawImage(imgOnZ, 0,0,thisApplet); } else //!power { vcol.img = switchOpen; vcol.paint(); // unlight LEDs. don't unzorch pols. // any way we could remove them from the cap count? if ((ncap+npol==0)||(nled==0)) //quick decay { cvs.img = imgOff; cvs.paint(); } else { //(imgOff has already been set to imgOffZ) //pgOnZ should be same as before, though. PixelGrabber pgOnZ = new PixelGrabber (imgOnZ, 0,0, 400,400, onZArr, 0,400); try{ pgOnZ.grabPixels(); } catch (InterruptedException ie) { ; } PixelGrabber pgOff = new PixelGrabber (imgOff, 0,0, 400,400, offArr, 0,400); try{ pgOff.grabPixels(); } catch (InterruptedException ie) { ; } for(int l=0; l<=(ncap+npol); l++) { for (int i=0; i<400*400; i++) { // GOING FROM ONZ TO OFF roff= (offArr[i]&0xFF0000)>>16; goff= (offArr[i]&0x00FF00)>>8; boff= (offArr[i]&0x0000FF); ronz= (onZArr[i]&0xFF0000)>>16; gonz= (onZArr[i]&0x00FF00)>>8; bonz= (onZArr[i]&0x0000FF); rinterp= (l*roff + (ncap+npol-l)*ronz)/(ncap+npol); ginterp= (l*goff + (ncap+npol-l)*gonz)/(ncap+npol); binterp= (l*boff + (ncap+npol-l)*bonz)/(ncap+npol); interpArr[i]= 0xFF000000 | rinterp <<16 | ginterp <<8 | binterp; } mis.newPixels(0,0,400,400); cvs.img=interpImg; cvs.paint(); } } } running=false; } } ); } public void show() { int i,j; // wait until all images have loaded for (i = 0; i < palette.length; i+=2) // evens only for (j = 0; j < 2*palette[i].imgs.length; j++) { this.showStatus ("Loading " + palette[i].name + " chip " + Integer.toString(1+j) + " of " + Integer.toString(2*palette[i].imgs.length,10)); try { palette[i].mt.waitForID(j); } catch (InterruptedException e) { ; } // how did it go? if (palette[i].mt.isErrorID(j)) { this.showStatus("Barfed on chip " + palette[i].name + " image " + j + "; quitting."); return; } } for (i=0;i<3;i++) { this.showStatus ("Loading power hookup image " + Integer.toString(1+i) + " of 3"); try { powerMt.waitForID(i); } catch (InterruptedException e) { ; } // how did it go? if (powerMt.isErrorID(i)) { this.showStatus("Barfed on power image " + i + "; quitting."); return; } } this.showStatus("Images loaded."); for (i = 0; i < palette.length; i++) for (j = 0; j < palette[i].imgs.length; j++) { palette[i].w[j] = palette[i].imgs[j].getWidth(thisApplet); palette[i].h[j] = palette[i].imgs[j].getHeight(thisApplet); } imgOff = this.createImage(400,400); imgOn = this.createImage(400,400); imgOnZ = this.createImage(400,400); imgOffZ = this.createImage(400,400); imgOff.getGraphics().drawImage(whiteImg, 0,0, thisApplet); imgOn.getGraphics().drawImage(whiteImg, 0,0, thisApplet); imgOnZ.getGraphics().drawImage(whiteImg, 0,0, thisApplet); imgOffZ.getGraphics().drawImage(whiteImg, 0,0, thisApplet); cvs.img = imgOff; cvs.paint(); for(i=0; i<12; i++) chips[i].paint(); vcol.img = switchOpen; gcol.img = ground; super.show(); } public void destroy() { for (int i=0; i