import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import java.net.*;
import jass.generators.*;
import jass.render.*;
import jass.engine.*;
public class DemoMousePictureExplore extends Thread implements MouseMotionListener, MouseListener, SegmentDataProvider {
/** component over which mouse events are gathered */
Component component;
/** mouse position */
int current_x, current_y,old_x,old_y;
private double oldTime=0;
private double oldTimeEvent=0;
Image myImage = null;
String myImageName = "tmp.jpg";
// URL myImageName;
Dimension myImageSize = new Dimension();
int [] imagePixels; // pixel map
double pixelsPerCm;
// JASS stuff
SourcePlayer sourcePlayer;
GrabSegment grabSegment;
GrabSegmentScrape grabSegmentScrape;
int buffersize = 64;
int nBuffersRtAudio = 512/buffersize;
int jsBuffersize = 10*1024;
float srate = 44100;
boolean nativeSound = false;
boolean scrapeMode = true;
boolean useControlPanel = false;
DemoMousePictureExplore(String[] args) {
// try {1
// myImageName = new URL(args[0]);
//} catch(Exception e) {
// System.out.println("Error loading URL "+e);
//}
myImageName = args[0];
pixelsPerCm = Double.parseDouble(args[1]);
int nrt = Integer.parseInt(args[3]);
if(nrt == -1) {
nativeSound = false;
} else {
// nativeSound = true;
nativeSound = false;
nBuffersRtAudio = nrt/buffersize;
}
Frame frame = new Frame () {
public void paint(Graphics g) {
g.drawImage(myImage,0,0,component);
}
};
this.component = frame;
myImage = Toolkit.getDefaultToolkit().getImage(myImageName);
getPixels();
frame.setSize(myImageSize);
frame.setResizable(false);
//frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("Close handler called");
sourcePlayer.stopPlaying();
try{
sleep(500);
} catch(Exception e3) {
}
System.exit(0);
}
});
component.addMouseMotionListener(this);
component.addMouseListener(this);
initAudio(args);
}
public static void main (String[] args) {
if(args.length != 4) {
System.out.println("Usage: java DemoMousePictureExplore image.jpg pix_per_cm ../data/stick.sy rtbuffersize (-1 for javasound)");
return;
}
new DemoMousePictureExplore(args);
}
private void initAudio(String[] args) {
if(!nativeSound) {
sourcePlayer = new SourcePlayer(buffersize,jsBuffersize,srate);
sourcePlayer.setUseNativeSound(false);
} else {
sourcePlayer = new SourcePlayer(buffersize,nBuffersRtAudio,srate);
sourcePlayer.setUseNativeSound(true);
sourcePlayer.setNumRtAudioBuffersNative(nBuffersRtAudio);
}
grabSegmentScrape = new GrabSegmentScrape(buffersize,srate,this,args[2],(float)pixelsPerCm);
try {
sourcePlayer.addSource(grabSegmentScrape);
} catch(Exception e) {}
addControlPanel();
sourcePlayer.AGCOff();
sourcePlayer.start();
}
private void addControlPanel() {
// Add control panel
String[] sliderNames = {"vmax ", "mouseF ", "loglevel "};
final double[] sliderValues = {.05, 2, 3};
double[] minSliderValues = {.005, .3, 2};
double[] maxSliderValues = {.1, 20, 10};
int nbuttons = 4;
Controller a_controlPanel = new Controller(new java.awt.Frame ("TestColorSonificator"),false,sliderValues.length,nbuttons) {
public void onButton(int k) {
switch(k) {
case 0:
sourcePlayer.resetAGC();
break;
case 1: {
FileDialog fd = new FileDialog(new Frame(),"Save");
fd.setMode(FileDialog.SAVE);
fd.setVisible(true);
saveToFile(fd.getFile());
}
break;
case 2: {
FileDialog fd = new FileDialog(new Frame(),"Load");
fd.setMode(FileDialog.LOAD);
fd.setVisible(true);
loadFromFile(fd.getFile());
break;
}
case 3:
System.out.println("maxsignal = "+sourcePlayer.getAGC());
break;
}
}
public void onSlider(int k) {
sliderValues[k]=this.val[k];
switch(k) {
case 0:
grabSegmentScrape.setUnitScrapeVelocity((float)sliderValues[k]);
break;
case 1:
grabSegmentScrape.setLowPassMouseMotionFilterFrequencyCutoff((float)sliderValues[k]);
break;
case 2:
float level = (float)Math.pow(10,sliderValues[k]);
sourcePlayer.setAGC(level);
break;
}
}
};
a_controlPanel.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.out.println("Close handler called");
sourcePlayer.stopPlaying();
try{
sleep(500);
} catch(Exception e3) {
}
System.exit(0);
}
});
a_controlPanel.setSliders(sliderValues,minSliderValues,maxSliderValues,sliderNames);
a_controlPanel.setButtonNames (new String[] {"Reset","Save","Load","Show Level"});
if(useControlPanel) {
a_controlPanel.setVisible(true);
}
for(int i=0;i<sliderNames.length;i++) {
a_controlPanel.onSlider(i);
}
}
// implement SegmentDataProvider
private int[] pos = {0,0};
private boolean mouseButtonIsDown = false;
/**
@return int[] array of image pixels
*/
public int[] getImagePixels() {
return imagePixels;
}
/**
@return if mouse button is down
*/
public boolean isMousePressed() {
return mouseButtonIsDown;
}
/**
@return Dimension of image in pixels
*/
public Dimension getImageDimension() {
return myImageSize;
}
public int[] getMousePosition() {
pos[0] = this.current_x;
pos[1] = this.current_y;
return pos;
}
///implement MouseMotionListener
public void mouseMoved(MouseEvent e) {
current_x = e.getX();
current_y = e.getY();
}
// implement MouseListener
public void mouseClicked(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {
current_x = e.getX();
current_y = e.getY();
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
mouseButtonIsDown = true;
}
public void mouseReleased(MouseEvent e) {
mouseButtonIsDown = false;
}
private void getPixels() {
do {
myImageSize.width = myImage.getWidth(this.component);
myImageSize.height = myImage.getHeight(this.component);
try {
sleep(100);
} catch(Exception e){}
} while(myImageSize.width<0 || myImageSize.height<0);
System.out.println("imagesize= "+myImageSize);
imagePixels = new int[myImageSize.width * myImageSize.height];
PixelGrabber pg = new PixelGrabber(myImage, 0, 0, myImageSize.width, myImageSize.height, imagePixels, 0, myImageSize.width);
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.out.println("interrupted waiting for pixels!");
}
}
}