// maya3.java - from bodytag.org's maya3 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.image.DirectColorModel; import java.awt.image.MemoryImageSource; import java.io.PrintStream; public class maya3 extends Applet implements Runnable, MouseListener, MouseMotionListener { DirectColorModel _dcm; MemoryImageSource _mis; Image _img; int _pxl [], _pxl0 [], _tX [], _tY [], _tPos; boolean _drawn; Thread _thr; int _w, _h, _wh, _bg; line _ln []; private void modPxl (int p, int c, int c2) { if (p >= _wh || p <= 0) {return;} int r = _pxl [p] & 0xFF0000; int g = _pxl [p] & 0xFF00; int b = _pxl [p] & 0xFF; int r1 = c & 0xFF0000; int g1 = c & 0xFF00; int b1 = c & 0xFF; int r2 = (c2 * (r - r1) >> 8) + r1 & 0xFF0000; int g2 = (c2 * (g - g1) >> 8) + g1 & 0xFF00; int b2 = (c2 * (b - b1) >> 8) + b1 & 0xFF; _pxl [p] = r2 | g2 | b2; } public void drawLn (int x1, int y1, int x2, int y2, int c, int c2) { int yD = y2 - y1; int xD = x2 - x1; int i; byte b; if (yD < 0) {yD = -yD; i = -_w;} else {i = _w;} if (xD < 0) {xD = -xD; b = -1;} else {b = 1;} yD <<= 1; xD <<= 1; y1 *= _w; y2 *= _w; if (xD > yD) { int j = yD - (xD >> 1); while (x1 != x2) { if (j >= 0) {y1 += i; j -= xD;} x1 += b; j += yD; modPxl (x1 + y1, c, c2); } } else { int k = xD - (yD >> 1); while (y1 != y2) { if (k >= 0) {x1 += b; k -= yD;} y1 += i; k += xD; modPxl (x1 + y1, c, c2); } } } public void endLn () { int c [] = new int [_tPos]; for (int i = 0; i < _tPos; i++) {c [i] = 0;} // black for (int d = 0; d < 360; d++) { int x [] = new int [_tPos]; int y [] = new int [_tPos]; for (int t = 0; t < _tPos; t++) { x [t] = _tX [0] + (int)(Math.cos (d) * (double)(_tX [0] - _tX [t]) - Math.sin (d) * (double)(_tY [0] - _tY [t])); y [t] = _tY [0] + (int)(Math.sin (d) * (double)(_tX [0] - _tX [t]) + Math.cos (d) * (double)(_tY [0] - _tY [t])); } _ln [d] = new line (x, y, c); } _drawn = true; _tX = new int [2000]; _tY = new int [2000]; _tPos = 0; } // thread biz public void run () {while (_thr != null) repaint ();} public void start () { if (_thr == null) {_thr = new Thread (); _thr.start ();} } public void stop () {_thr = null;} // mouse biz public void mouseDragged (MouseEvent ev) { _tX [_tPos] = ev.getX (); _tY [_tPos] = ev.getY (); _tPos++; if (_tPos == 2000) endLn (); } public void mouseReleased (MouseEvent mouseevent) {endLn ();} public void mouseClicked (MouseEvent mouseevent) {} public void mouseEntered (MouseEvent mouseevent) {} public void mouseExited (MouseEvent mouseevent) {} public void mousePressed (MouseEvent mouseevent) {} public void mouseMoved (MouseEvent mouseevent) {} // applet biz public void update (Graphics g) { for (int i = 1; i < _wh; i++) { char c = '\346'; int r0 = _pxl [i] & 0xFF0000; int g0 = _pxl [i] & 0xFF00; int b0 = _pxl [i] & 0xFF; int r1 = _pxl0 [i] & 0xFF0000; int g1 = _pxl0 [i] & 0xFF00; int b1 = _pxl0 [i] & 0xFF; int r2 = (c * (r0 - r1) >> 8) + r1 & 0xFF0000; int g2 = (c * (g0 - g1) >> 8) + g1 & 0xFF00; int b2 = (c * (b0 - b1) >> 8) + b1 & 0xFF; _pxl [i] = r2 | g2 | b2; } if (_drawn) { for (int j = 0; j < 360; j++) { for (int j1 = 0; j1 < _ln [j].x.length; j1++) if (j1 > 1) drawLn (_ln [j].x [j1-1], _ln [j].y [j1-1], _ln [j].x [j1], _ln [j].y [j1], _ln [j].col [j1], 0xF4); } } for (int k = 0; k < _tPos; k++) if (k > 1) drawLn (_tX [k], _tY [k], _tX [k-1], _tY [k-1], 0xFF0000, 0); _mis.newPixels (); g.drawImage (_img, 0, 0, this); } public void paint (Graphics g) {update (g);} public void init () { _w = Integer.parseInt (getParameter ("width")); _h = Integer.parseInt (getParameter ("height")); _wh = _w * _h; _pxl = new int [_wh]; _pxl0 = new int [_wh]; _ln = new line [360]; _tX = new int [2000]; _tY = new int [2000]; // bits, rmask, gmask, bmask _dcm = new DirectColorModel (24, 0xFF0000, 0xFF00, 0xFF); _mis = new MemoryImageSource (_w, _h, _dcm, _pxl, 0, _w); _mis.setAnimated (true); _mis.setFullBufferUpdates (true); _img = createImage (_mis); _bg = 0xFFFFFF; // white for (int j = 0; j < _wh; j++) {_pxl [j] = _bg; _pxl0 [j] = _bg;} addMouseListener (this); addMouseMotionListener (this); } // class biz public maya3 () {_tPos = 0; _drawn = false; _thr = null;} }