//---------------------------------------------------------------- // Sinuz Applet -> Old AMIGA demos are comin' back... // // (C) El Viscido 1998 //---------------------------------------------------------------- import java.applet.*; import java.awt.*; import java.awt.image.PixelGrabber; import java.awt.image.MemoryImageSource; public class Sinlogo extends Applet implements Runnable { private String stepit; private Thread m_Sinlogo = null; boolean asodreadisegna = false; boolean userfun = false; boolean firsttime = true; double inc_factor = 0.0; double base_factor = 0.0; int extent_x = 0; int extent_y = 0; int appl_ext_x = 0; int appl_ext_y = 0; double RAD = 3.1415926535 / 180; double ang_x = 0.0; double angolo_x = 0.0; private int screenPixel[], screenimagepix[]; private int pos_x[], pos_y[]; private MemoryImageSource screenMem; private Image screenScr; private Graphics m_g; private Image globalimagedata; private Image TMPscreenScr; private int maxinteract = 0; public void init() { asodreadisegna = true; //Angle Add Parameter base_factor = Double.valueOf(getParameter("angle_add")).doubleValue(); inc_factor = base_factor; //End // Loads picture MediaTracker tracker = new MediaTracker(this); globalimagedata = getImage( getDocumentBase(), getParameter("image_logo") ); tracker.addImage(globalimagedata, 0); try { tracker.waitForID(0); } catch(Exception e) {}; extent_x = globalimagedata.getWidth(this); extent_y = globalimagedata.getHeight(this); // extent_x++; extent_y++; appl_ext_x = extent_x; appl_ext_y = extent_y; screenPixel = new int[ extent_x * extent_y ]; pos_x = new int[ extent_x * extent_y ]; pos_y = new int[ extent_x * extent_y ]; screenimagepix = new int[ appl_ext_x * appl_ext_y ]; // Load the pixels loadPix(); movePix(); screenScr = createImage( appl_ext_x , appl_ext_y ); m_g = screenScr.getGraphics(); m_g.setColor(new Color(Integer.parseInt(getParameter("bg_red")), Integer.parseInt(getParameter("bg_green")), Integer.parseInt(getParameter("bg_blue")))); asodreadisegna = false; } public void update(Graphics g) { if (!asodreadisegna) { if ( firsttime ) { m_g.fillRect(0,0,extent_x,extent_y); firsttime = false; } m_g.drawImage(TMPscreenScr, 0 , 0, this); paint(g); } } public void paint(Graphics g) { if ( screenScr != null) { g.drawImage(screenScr, 0, 0, this); } else { g.drawString("Now: ..." ,10,10); } } public void start() { if (m_Sinlogo == null) { m_Sinlogo = new Thread(this); m_Sinlogo.start(); } } public void stop() { if (m_Sinlogo != null) { m_Sinlogo.stop(); m_Sinlogo = null; } } public void run() { while (true) { try { //Do new things only if i've finished //to render the Sinlogo ;-) if (!asodreadisegna) { movePix(); repaint(); Thread.sleep(50); } if (maxinteract++>120) { System.gc(); maxinteract = 0; } } catch (InterruptedException e) { stop(); } } } private void loadPix() { int punto = 0; asodreadisegna = true; PixelGrabber grabber = new PixelGrabber( globalimagedata, 0, 0, extent_x, extent_y, screenPixel, 0, extent_x); boolean done = false; do { try { done = grabber.grabPixels( 500 ); } catch ( InterruptedException e ) {} } while( !done ); for(int loopx = 0; loopx < extent_x - 1; loopx++) { for(int loopy = 0; loopy < extent_y - 1; loopy++) { punto = ((extent_x * loopy) + loopx); pos_x[punto] = loopx + 5; pos_y[punto] = loopy + 5; } } } public void movePix() { asodreadisegna = true; int punto = 0; double CX, SX; //TMPscreenScr = null; int yadd = 0; for(int loopx = 0; loopx < extent_x - 1; loopx++) { if (!userfun && inc_factor > base_factor) inc_factor -= 0.005; if (inc_factor < base_factor) inc_factor = base_factor; angolo_x += inc_factor; if (angolo_x > 360) angolo_x = 0; //Calculate the offset of the pixel columns ang_x = angolo_x * 2; CX = Math.cos(ang_x * RAD); SX = Math.sin(ang_x * RAD); punto = extent_x + loopx; yadd = (int)(pos_y[punto] * CX); for(int loopy = 0; loopy < extent_y - 1; loopy++) { punto = ((extent_x * loopy) + loopx); // This to avoid coords going out of array bound // AAARRRGGHHH! if ( ((appl_ext_x * (loopy + yadd)) + loopx) >= 0 && ((appl_ext_x * (loopy + yadd)) + loopx) <= ((appl_ext_x * (appl_ext_y-1)) + (appl_ext_x-1)) ) screenimagepix[(appl_ext_x * (loopy + yadd)) + loopx] = screenPixel[(extent_x * loopy) + loopx]; } } //Done it! Let's place the image! //TMPscreenScr = createImage(screenMem); <---This one doesn't work // with Netscape!!! TMPscreenScr = createImage(new MemoryImageSource(extent_x, extent_y, screenimagepix, 0, extent_x)); asodreadisegna = false; } //Let the user have some fun draggin' mouse.... public boolean mouseDrag(Event evt, int x, int y) { userfun = true; if (inc_factor < base_factor * 10) inc_factor += 0.1; return true; } public boolean mouseExit(Event evt, int x, int y) { userfun = false; return true; } }