package com.dronecontrol.perceptual.components; import com.google.common.collect.Sets; import com.dronecontrol.perceptual.PerceptualPipeline; import com.dronecontrol.perceptual.data.events.PictureData; import com.dronecontrol.perceptual.listeners.PictureListener; import java.awt.image.*; import java.util.Set; public class PictureComponent implements PerceptualQueryComponent { private final Set<PictureListener> pictureListeners; private boolean pictureAvailable; private int[] pictureDimensions; private int[] pictureBuffer; private short[] depth; public PictureComponent() { pictureListeners = Sets.newLinkedHashSet(); pictureDimensions = new int[2]; pictureBuffer = null; depth = new short[640 * 480]; } @Override public void queryFeatures(PerceptualPipeline pipeline) { if (!isPictureNeeded()) { return; } if (isSizeAvailable()) { queryPicture(pipeline); } else { querySize(pipeline); } } private void querySize(PerceptualPipeline pipeline) { pictureAvailable = pipeline.QueryRGBSize(pictureDimensions); } private void queryPicture(PerceptualPipeline pipeline) { pictureAvailable = pipeline.QueryRGB(pictureBuffer); } private boolean isPictureNeeded() { return pictureListeners.size() != 0; } private boolean isSizeAvailable() { return pictureBuffer != null; } @Override public void processFeatures() { if (!isPictureNeeded() || !pictureAvailable) { return; } if (!isSizeAvailable()) { determineSize(); } else { determinePicture(); } } private void determineSize() { pictureBuffer = new int[pictureDimensions[0] * pictureDimensions[1]]; } private void determinePicture() { BufferedImage image = getBufferedImage(pictureBuffer); invokePictureListeners(new PictureData(image)); } private BufferedImage getBufferedImage(int[] pictureBuffer) { WritableRaster raster = Raster.createPackedRaster(DataBuffer.TYPE_INT, pictureDimensions[0], pictureDimensions[1], 3, 8, null); raster.setDataElements(0, 0, pictureDimensions[0], pictureDimensions[1], pictureBuffer); BufferedImage img = new BufferedImage(pictureDimensions[0], pictureDimensions[1], BufferedImage.TYPE_INT_RGB); img.setData(raster); return img; } public void addPictureListener(PictureListener pictureListener) { if (!pictureListeners.contains(pictureListener)) { pictureListeners.add(pictureListener); } } public void removePictureListener(PictureListener pictureListener) { if (pictureListeners.contains(pictureListener)) { pictureListeners.remove(pictureListener); } } private void invokePictureListeners(PictureData data) { for (PictureListener listener : pictureListeners) { listener.onImage(data); } } }