package edu.mbl.jif.imaging.stream;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageProducer;
import java.awt.image.IndexColorModel;
import java.awt.image.MemoryImageSource;
import java.util.ArrayList;
import javax.swing.SwingUtilities;
public class StreamSource {
StreamGenerator generator;
public MemoryImageSource mis;
public byte[] imageArrayByte = null;
int w = 0;
int h = 0;
int frames = 0;
byte startIntensity = 10;
private ArrayList consumers = new ArrayList();
long last = System.nanoTime();
StreamMonitor mon;
public StreamSource(int w, int h, StreamGenerator generator) {
this.generator = generator;
this.w = w;
this.h = h;
initializeStream();
}
void initializeStream() {
// create a ColorModel with a gray scale palette:
byte[] gray = new byte[256];
for (int i = 0; i < 256; i++) {
gray[i] = (byte) i;
}
IndexColorModel cm = new IndexColorModel(8, 256, gray, gray, gray);
// create imageArray to be passed to JNI with LuCamInterface.setDisplayArray8A()
imageArrayByte = new byte[h * w];
for (int i = 0; i < imageArrayByte.length; i++) {
imageArrayByte[i] = startIntensity;
}
// construct a MemoryImageSource that can be used to create the image
mis = new MemoryImageSource(w, h, cm, imageArrayByte, 0, w);
mis.setAnimated(true);
mis.setFullBufferUpdates(true);
}
public int getWidth() {
return w;
}
public int getHeight() {
return h;
}
public void attachToStream(ImageConsumer consumer) {
if (mis == null) {
initializeStream();
}
consumers.add(consumer);
mis.addConsumer(consumer);
}
public void detachFromStream(ImageConsumer consumer) {
// @todo What if in opposite order?
if (consumers.contains(consumer)) {
consumers.remove(consumer);
mis.removeConsumer(consumer);
}
if (consumers.isEmpty()) {
// stop streaming from device
generator.stopStream();
generator.closeStreamSource();
//mis = null;
}
}
public void startProduction(ImageConsumer consumer) {
mis.startProduction(consumer);
}
public ImageProducer getImageProducer() {
return mis;
}
public void attachMonitor(StreamMonitor mon) {
this.mon = mon;
}
public void detachMonitor() {
this.mon = null;
}
// Callback
// this is called from the streaming mode callback function of the camera
public void callBack() {
//long dur = (System.nanoTime() - last); // nanoseconds per frame
//double fps = 1000000000.0 / dur;
frames++;
// if(cameraModel!=null) {
// cameraModel.setCurrentFPS(fps);
// }
//System.out.println("calledback.");
//if ((frames % 3) == 0) {
if (true) {
dispatchToEDT(new Runnable() {
public void run() {
if (mis != null) {
mis.newPixels();
if (mon != null) {
mon.update(frames);
}
}
}
});
}
//last = System.nanoTime();
}
static void dispatchToEDT(Runnable runnable) {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(runnable);
} else {
runnable.run();
}
}
}