package ie.dcu.segment.painters; import ie.dcu.segment.*; import ie.dcu.swt.ObservableImage; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; /** * Shows the foreground region of the image. The background is greyed out. * * @author Kevin McGuinness */ public class ForegroundOnlyPainter implements SegmentationPainter { private ImageData maskData; private Image maskImage; public String getName() { return "Foreground Only"; } public String getDescription() { return "Shows the foreground region of the image."; } public ImageData getMaskData(SegmentationContext ctx) { return maskData; } public void paint(SegmentationContext ctx, ObservableImage im) { GC gc = im.beginPaint(); // Paint image gc.drawImage(ctx.getImage(), 0, 0); // Paint mask createVisibleMask(ctx.getMask()); gc.drawImage(maskImage, 0, 0); // Commit changes im.endPaint(); } private void createVisibleMask(SegmentationMask mask) { dispose(); if (isNewMaskDataRequired(mask.getBounds())) { maskData = createMaskData(mask.getBounds()); } // Blit in pixels byte[] buff = new byte[maskData.width]; for (int y = 0, i = 0; y < mask.height; y++) { for (int x = 0; x < mask.width; x++) { switch (mask.values[i++]) { case SegmentationMask.BACKGROUND: // black buff[x] = 1; break; default: // transparent buff[x] = 0; } } maskData.setPixels(0, y, buff.length, buff, 0); } // Create new mask maskImage = new Image(Display.getCurrent(), maskData); } private boolean isNewMaskDataRequired(Rectangle bounds) { if (maskData == null) { return true; } else { return maskData.width != bounds.width || maskData.height != bounds.height; } } private static ImageData createMaskData(Rectangle bounds) { RGB[] colors = new RGB[] { new RGB(255,255,255), new RGB(128,128,128) }; // Create binary indexed palette PaletteData palette = new PaletteData(colors); // Create 1 bit indexed image ImageData data = new ImageData( bounds.width, bounds.height, 1, palette); // Set transparent pixel data.transparentPixel = 0; // Create and return the image return data; } public void dispose() { // Dispose mask if (maskImage != null) { if (!maskImage.isDisposed()) { maskImage.dispose(); } maskImage = null; } } }