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 current segmentation mask * * @author Kevin McGuinness */ public class MaskPainter implements SegmentationPainter { public static final String NAME = "Mask"; private ImageData maskData; private Image maskImage; public String getDescription() { return "Shows the current segmentation mask"; } public String getName() { return NAME; } public ImageData getMaskData(SegmentationContext ctx) { return maskData; } public void paint(SegmentationContext ctx, ObservableImage im) { GC gc = im.beginPaint(); // Paint mask createVisibleMask(ctx.getMask()); gc.drawImage(maskImage, 0, 0); // Commit changes im.endPaint(); } private void createVisibleMask(SegmentationMask mask) { dispose(); // Check if we have a compatible buffer if (isNewMaskDataRequired(mask.getBounds())) { maskData = createMaskData(mask.getBounds()); } // Blit in pixels for (int y = 0; y < mask.height; y++) { int maskOffset = y * mask.width; int dataOffset = y * maskData.bytesPerLine; System.arraycopy(mask.values, maskOffset, maskData.data, dataOffset, mask.width); } // 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(128,128,128), new RGB(255,255,255), new RGB(0, 0, 0) }; // Create 3 color indexed palette PaletteData palette = new PaletteData(colors); // Create 8 bit indexed image ImageData data = new ImageData(bounds.width, bounds.height, 8, palette); // Create and return the image return data; } public void dispose() { /// Dispose mask if (maskImage != null) { if (!maskImage.isDisposed()) { maskImage.dispose(); } maskImage = null; } } }