package twiedow.videocam;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import twiedow.videocam.filter.ImagePanelFilter;
public class VideoCamPanel extends JPanel implements Runnable {
private int width;
private int height;
private VideoGrabber videoGrabber;
private int[] pixelData;
private BufferedImage image;
private boolean cameraActive = true;
private int taskingDelay = 10;
private Thread imageUpdater;
private List<ImagePanelFilter> filters;
public VideoCamPanel(int x, int y) throws Exception {
super();
width = VideoGrabber.CAMERA_WIDTH;
height = VideoGrabber.CAMERA_HEIGHT;
setBounds(x, y, width, height);
videoGrabber = VideoGrabber.instance();
image = getNewBufferedImage();
pixelData = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
filters = new ArrayList<ImagePanelFilter>();
}
public BufferedImage getNewBufferedImage() throws Exception {
int intsPerRow = videoGrabber.getIntsPerRow();
int size = intsPerRow * height;
int[] data = new int[size];
DataBuffer db = new DataBufferInt(data, size);
ColorModel colorModel = new DirectColorModel(32, 0x0000ff00, 0x00ff0000, 0xff000000);
int[] masks = { 0x0000ff00, 0x00ff0000, 0xff000000};
WritableRaster raster = Raster.createPackedRaster(db, width, height, intsPerRow, masks, null);
return new BufferedImage(colorModel, raster, false, null);
}
public void startCamera() throws Exception {
imageUpdater = new Thread(this);
imageUpdater.start();
}
public void run() {
try {
while (cameraActive) {
Thread.sleep(taskingDelay);
synchronized (videoGrabber.getSg()) {
videoGrabber.copyPixelDataToArray(pixelData);
if (filters.size() > 0) {
for (ImagePanelFilter filter : filters) {
filter.calculateFilter(image);
}
}
this.repaint();
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(image, 0, 0, this);
}
public synchronized BufferedImage getClonedCopyOfCurrentImage() throws Exception {
int w = image.getWidth();
int h = image.getHeight();
BufferedImage out = getNewBufferedImage();
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++)
out.setRGB(x, y, image.getRGB(x, y));
}
return out;
}
public void addFilter(ImagePanelFilter filter) {
filters.add(filter);
}
public void removeAllFilters() {
filters.clear();
}
}