package graphics; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; public class Waterfall { private int[] _grad; private int _grad_max; private BufferedImage im1; private BufferedImage im2; private boolean _active_image = true; private int line1 = 399; private int line2 = 199; private int _imageHeight = 200; public Waterfall(BufferedImage gradient, int imageHeight) { _imageHeight = imageHeight; line1 = 2*imageHeight - 1; line2 = line1 - imageHeight; im1 = new BufferedImage(512,2*imageHeight,BufferedImage.TYPE_INT_RGB); im2 = new BufferedImage(512,2*imageHeight,BufferedImage.TYPE_INT_RGB); _grad = new int[gradient.getWidth()]; for (int i = 0; i < gradient.getWidth(); i++) { _grad[i] = gradient.getRGB(i,0); } _grad_max = gradient.getWidth(); } public Waterfall(int imageHeight) { _imageHeight = imageHeight; line1 = 2*imageHeight - 1; line2 = line1 - imageHeight; im1 = new BufferedImage(512,2*imageHeight,BufferedImage.TYPE_INT_RGB); im2 = new BufferedImage(512,2*imageHeight,BufferedImage.TYPE_INT_RGB); //_grad int[] g = {0x282828, 0x26292B, 0x232B2E, 0x1F2D31, 0x1C2F35, 0x17313A, 0x13343F, 0x0F3744, 0x0B3A4A, 0x073E50, 0x044256, 0x02475D, 0x004C65, 0x00526D, 0x005977, 0x006082, 0x00688C, 0x007197, 0x0079A2, 0x0081AD, 0x0088B7, 0x008FC0, 0x0095C7, 0x009ACD, 0x029CD1, 0x039FD4, 0x04A1D8, 0x05A3DC, 0x06A4E0, 0x07A6E4, 0x09A7E5, 0x0AA8E5, 0x0CA9E5, 0x0EAAE5, 0x11ABE5, 0x14ACE5, 0x17ADE5, 0x1BAEE5, 0x1FB0E5, 0x23B1E5, 0x29B2E5, 0x2FB4E5, 0x3AB7DF, 0x56BFC3, 0x79C89D, 0x9ED172, 0xC3D946, 0xE3DE20, 0xFBDE04, 0xFFDD00, 0xFFDB00, 0xFFD900, 0xFFD700, 0xFFD400, 0xFFD100, 0xFFCD00, 0xFFC900, 0xFFC500, 0xFFC100, 0xFFBC00, 0xFFB800, 0xFFB300, 0xFFAF00, 0xFFAA00, 0xFFA500, 0xFFA000, 0xFF9C00, 0xFF9700, 0xFF9300, 0xFF8F00, 0xFF8B00, 0xFF8800, 0xFF8204, 0xFF7C09, 0xFF760F, 0xFF7116, 0xFF6C1D, 0xFF6624, 0xFF612C, 0xFF5C33, 0xFF5739, 0xFF523E, 0xFF4C42, 0xFF4744, 0xFE4144, 0xFB3B41, 0xF6343D, 0xF12D37, 0xEC2630, 0xE71F28, 0xE1181F, 0xDB1217, 0xD60C0F, 0xD20709, 0xCE0303, 0xCC0000, 0xCC0000, 0xCC0000, 0xCC0000, 0xCC0000}; _grad = g; _grad_max = g.length; } public BufferedImage UpdateLine(double[] fftin, double f1, double f2, int sample_rate) { return UpdateLine( fftin,(int)(f1/sample_rate*512), (int)(f2/sample_rate*512)); } public BufferedImage UpdateLine(double[] fftin, int f1, int f2) { if (fftin.length != 512) return null; int currentpix; for (int i = 0; i < 512; i++) { currentpix = -40 + (10 * (int)(Math.log10(fftin[i]))); if (currentpix < 0) currentpix = 0; else if (currentpix >= _grad_max) currentpix = _grad_max -1; im1.setRGB(i, line1, _grad[currentpix]); im2.setRGB(i, line2, _grad[currentpix]); } BufferedImage output = new BufferedImage(512,200,BufferedImage.TYPE_INT_RGB); if (_active_image) //copySrcIntoDstAt(im2.getSubimage(0, line2, 512, 200),output,0,0); copySrcIntoDstAt(im2,output,0,line2); //output = ; else copySrcIntoDstAt(im1,output,0,line1); if (f1 < 0) f1 = 0; if (f1 >= output.getWidth()) f1 = output.getWidth()-1; if (f2 < 0) f2 = 0; if (f2 >= output.getWidth()) f2 = output.getWidth()-1; int w0,w1,w2,w3; w0 = f1-1; w1 = f1+1; w2 = f2-1; w3 = f2+1; if (w0 < 0) w0 = 0; if (w2 < 0) w2 = 0; if (w1 >= output.getWidth()) w1 = output.getWidth()-1; if (w3 >= output.getWidth()) w3 = output.getWidth()-1; for (int i = 0; i < _imageHeight; i++) { output.setRGB(w0, i, 0xFF000000); output.setRGB(w1, i, 0xFF000000); output.setRGB(w2, i, 0xFF000000); output.setRGB(w3, i, 0xFF000000); output.setRGB(f1, i, 0xFF22FF22); output.setRGB(f2, i, 0xFF22FF22); } line1--; line2--; if (_active_image) { if (line2 < 0) { line2 = 399; _active_image = false; } } else { if (line1 < 0) { line1 = 399; _active_image = true; } } return output; } private static void copySrcIntoDstAt(final BufferedImage src, final BufferedImage dst, final int dx, final int dy) { int[] srcbuf = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); int[] dstbuf = ((DataBufferInt) dst.getRaster().getDataBuffer()).getData(); int width = src.getWidth(); int height = dst.getHeight(); int dstoffs = 0; int srcoffs = dx + dy * dst.getWidth(); //System.arraycopy(srcbuf, 0 , dstbuf, 0, srcbuf.length); for (int y = 0 ; y < height ; y++ , dstoffs+= dst.getWidth(), srcoffs += width ) { System.arraycopy(srcbuf, srcoffs , dstbuf, dstoffs, width); } } }