Hello!

To see the file structure, click on "tree".

Note that updates take place every 10 minutes, commits may not be seen immediately.
Combined label is changed to Segmented Sucessfuly.
authorpatapanp <patapanp@localhost>
Mon, 3 Feb 2014 20:24:17 +0000 (20:24 +0000)
committerpatapanp <patapanp@localhost>
Mon, 3 Feb 2014 20:24:17 +0000 (20:24 +0000)
svn path=/; revision=525

Annotation/resources/doc/help.html
Annotation/src/ie/dcu/apps/ist/AppWindow.java
Annotation/src/ie/dcu/apps/ist/Main.java
Annotation/src/ie/dcu/apps/ist/PainterRegistry.java
Annotation/src/ie/dcu/apps/ist/views/SegmentationView.java
Annotation/src/ie/dcu/apps/ist/widgets/AnnotatedImageControl.java
Annotation/src/ie/dcu/segment/SegmentationContext.java
Annotation/src/ie/dcu/segment/SegmentationMask.java
Annotation/src/ie/dcu/segment/painters/CombinedPainter.java [deleted file]
Annotation/src/ie/dcu/segment/painters/SegmentPainter.java [new file with mode: 0644]

index 5e8a4658a75fffd2c1d99779e2a9726f563505d3..956bc2375c8ff23e7853e9bc8db63bdb352f66cc 100644 (file)
@@ -125,12 +125,12 @@ visible or to quickly mark up more pixels.<br>
 <br>
 <span class="section">Views</span><br>
 It is sometimes useful to view the segmentation results in different
-ways. The default selected view is the "Combined" view; it shows the
+ways. The default selected view is the "Segmented" view; it shows the
 image, its highlighted segmentation, and any current foreground and background markup lines...all overlayed on
 the same image. Using the drop-down menu, you can select a different
 view:<br>
 <ul>
-<li><span style="font-style: italic;">Combined</span>:
+<li><span style="font-style: italic;">Segmented</span>:
 Shows the image with foreground areas brightened and background areas
 darkened. Any current foreground and background annotation marks are overlayed.</li>
 <li><span style="font-style: italic;">Original:</span>
index 1919489af61e2b11858cd18e1f93e147c9a5a5df..49a5051cd21373c5fca7f2a192339b84f00ab798 100644 (file)
@@ -710,7 +710,7 @@ public class AppWindow extends ApplicationWindow implements FileDropListener {
                                status(AppStatus.Information, "Location [%4d,%4d] Color [%3d,%3d,%3d]",pt.x, pt.y, c.red, c.green, c.blue);
                                if(view.getContext().isEnabled())
                                {
-                                       if(view.getContext().getEnabledMask().getImageData().getPixel(pt.x,pt.y) != 0 && (view.getPainter().getName().equals("Combined")) && SegmentationView.getLabelMode())
+                                       if(view.getContext().getEnabledMask().getImageData().getPixel(pt.x,pt.y) != 0 && (view.getPainter().getName().equals("Segmented")) && SegmentationView.getLabelMode())
                                {       
                                                String segmentName = view.getContext().getEnabledMask().ontologyTerm.getName();
                                                view.getCanvas().setToolTipText(segmentName);
index d878efdbb7f9eae177005cd66f9390683a10da89..2e03a7a2a8a1839b3e0a7ffb36039c2c396debdc 100644 (file)
@@ -32,7 +32,7 @@ public class Main {
                for (String s: Application.DEFAULT_PLUGIN_SEARCH_PATH) {
                        System.out.println(s);
                }
-
+               
                Display.setAppName(Application.APP_NAME);
                check();
                loadPlugins();
index ed5d6fca2959ea558a4e03491f7f551af3c2cde2..83571cba69a8d57897ec1bc27e5ccdcc3822f553 100644 (file)
@@ -14,10 +14,10 @@ public class PainterRegistry {
        
        
        private void init() {
-               add(new CombinedPainter());
+               add(new SegmentPainter());
                add(new OriginalPainter());
                /*
-                * Commented different views of segmentation. Currently original and combined painter are enabled
+                * Commented different views of segmentation. Currently original and Segment painter are enabled
                 */
                //add(new MarkupPainter());
                //add(new MaskPainter());
index d989874ae95872926cd46b9cce881514dd05b146..aed5dd3c46176f474017017fcf307508815e8450 100644 (file)
@@ -258,8 +258,8 @@ public class SegmentationView extends Composite {
         */
        public void resetView() {
                Tool.LabelMode.action.setChecked(false);
-               resetViewSelectionToolbar(painters.get("Combined"));
-
+               resetViewSelectionToolbar(painters.get("Segmented"));
+               //panini
                // clear metadata
                comboLabel.removeAll();
                comboLabel.setEnabled(false);
@@ -1221,7 +1221,8 @@ public class SegmentationView extends Composite {
        Assign the label to the segment on clicking assign button and update the image segment. 
        */
        private void assignLabel() {
-               SegmentationPainter painter = painters.get("Combined");
+               SegmentationPainter painter = painters.get("Segmented");
+               //panini
                setPainter(painter);
        }
        
index 4880b63bf18000af19342fed620b123312d6fefd..3f9db4f368a13baa958d3266f3d99ddf559f7e86 100644 (file)
@@ -33,7 +33,7 @@ public class AnnotatedImageControl extends Composite {
                setLayout(new FillLayout());
                view = new ImageControl(this, SWT.NONE);
                listeners = new ArrayList<ContextChangeListener>(2);
-               painter = new CombinedPainter();
+               painter = new SegmentPainter();
                view.getCanvas().addMouseMoveListener(cursorChanger);
                addDisposeListener(disposeListener);
        }
index cb2dce00c1c576d139f5f237a9ecb207e75fd2a4..258f50cf7ccc8a3233a074698c164da36a8ecdc6 100644 (file)
@@ -12,7 +12,7 @@ import java.util.ArrayList;
 import java.util.logging.Logger;
 import java.util.zip.*;
 
-import javax.xml.bind.DatatypeConverter;
+//import javax.xml.bind.DatatypeConverter;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -21,7 +21,7 @@ import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.widgets.Display;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
+//import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
index 56cb6f39be287ab01c9746d90473c86179dac685..d9b499f263a90683c81c2b739c0494773dec25cc 100644 (file)
@@ -1,10 +1,10 @@
 package ie.dcu.segment;
 
 import ie.dcu.matrix.ByteMatrix;
-import ie.dcu.segment.annotate.Annotation;
+//import ie.dcu.segment.annotate.Annotation;
 import ie.dcu.segment.annotate.AnnotationManager;
 
-import ie.dcu.segment.annotate.AnnotationType;
+//import ie.dcu.segment.annotate.AnnotationType;
 
 import ie.dcu.apps.ist.labelling.OntologyTerm;
 
diff --git a/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java b/Annotation/src/ie/dcu/segment/painters/CombinedPainter.java
deleted file mode 100644 (file)
index 9e2064a..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-package ie.dcu.segment.painters;
-
-import ie.dcu.segment.*;
-import ie.dcu.swt.ObservableImage;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * An overlaid view of the image, segmentation mask, and markup.
- * 
- * @author Kevin McGuinness
- */
-public class CombinedPainter implements SegmentationPainter {
-       public static final String NAME = "Combined";
-       
-       private ImageData maskBorderData;
-       private Image maskBorderImage;
-
-       
-       public String getName() {
-               return NAME;
-       }
-
-
-       public String getDescription() {
-               return "An overlaid view of the image, segmentation mask, and markup";
-       }
-
-       public ImageData getMaskData(SegmentationContext ctx) {
-               /*for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
-               {
-                       if(segmentMask.enabled == true)
-                       {
-                               return segmentMask.getImageData();
-                       }
-               }*/
-               return maskBorderData;
-       }
-       
-       public void paint(SegmentationContext ctx, ObservableImage im) {
-               
-               GC gc = im.beginPaint();
-               // Paint image
-               gc.drawImage(ctx.getImage(), 0, 0);
-               int numberOfMaskObjects = ctx.getSegmentationMasks().size();
-               // Paint all masks and its borders skipping the enabled mask.
-               if(numberOfMaskObjects > 0)
-               {
-                       // For drawing all the disabled masks.
-                       for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
-                       {
-                               if(segmentMask.enabled != true)
-                               {
-                                       createVisibleMask(segmentMask,false);
-                                       gc.drawImage(segmentMask.maskImage, 0, 0);
-                                       createVisibleMaskBorder(segmentMask);
-                                       gc.drawImage(maskBorderImage, 0, 0);
-                               }
-                       }
-                       // For drawing the enabled mask and its border..
-                       for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
-                       {
-                               // Blending of background pixel values while pasting the last mask only
-                               if(segmentMask.enabled == true)
-                               {
-                                       createVisibleMask(segmentMask,true);
-                                       gc.drawImage(segmentMask.maskImage, 0, 0);
-                                       createVisibleMaskBorder(segmentMask);
-                                       gc.drawImage(maskBorderImage, 0, 0);
-                               }
-                       }
-                       // Current mask which has not yet been made into an object
-                       createVisibleMask(ctx.getMask(),false);
-                       gc.drawImage(ctx.getMask().getImage(), 0, 0);
-                       createVisibleMaskBorder(ctx.getMask());
-                       gc.drawImage(maskBorderImage, 0, 0);
-                       
-               }
-               // Very initial mask, which has not yet been turned into an object.
-               else
-               {
-                       createVisibleMask(ctx.getMask(),true);
-                       gc.drawImage(ctx.getMask().getImage(), 0, 0);
-                       createVisibleMaskBorder(ctx.getMask());
-                       gc.drawImage(maskBorderImage, 0, 0);
-               }
-               // Paint all annotations
-               ctx.getAnnotations().paint(im);
-               
-               // Commit changes
-               im.endPaint();
-       }
-       
-       /**
-        * 
-        * @param mask
-        * Mask object to be drawn.
-        * @param isFirstObject
-        * If set to <code>True</code> will blend the background and fore ground pixels.
-        */
-       private void createVisibleMask(SegmentationMask mask,boolean enabled) {
-               
-               dispose();
-               
-               if (isNewMaskDataRequired(mask)) {
-                       mask.maskImageData = createMaskData(mask.getBounds());
-               } 
-               byte main_index = 9;
-               // Blit in pixels
-               for (int y = 0, i = 0; y < mask.height; y++) {
-                       int rowOffset = y * mask.maskImageData.bytesPerLine;
-                       for (int x = 0; x < mask.width; x++) {
-                               byte alpha, index;
-                               switch (mask.values[i]) {
-                               case SegmentationMask.BACKGROUND:
-                                       alpha = enabled ? (byte) 128 : (byte) 0;
-                                       index = 0;
-                                       break;
-                               case SegmentationMask.FOREGROUND:
-                                       alpha = (byte) 128;
-                                       index = (byte) (mask.layerNumber%3+1);
-                                       break;
-                               default:
-                                       alpha = 0;
-                                       index = 0;
-                                       break;
-                               }
-                                                               
-                               // The SWT ImageData buffer doesn't usually have it's rows aligned
-                               // contiguously in memory (i.e. there are > width bytes per scan-line in
-                               // the buffer), so we can't directly copy in at the same index as the
-                               // mask.
-                               mask.maskImageData.data[x + rowOffset] = index;
-                               
-                               // However, the alpha data is always aligned correctly
-                               mask.maskImageData.alphaData[i] = alpha;
-                               
-                               // Next location in the mask
-                               i++;
-                               main_index = index;
-                       }
-               }
-       // Create new mask
-       mask.maskImage = new Image(Display.getCurrent(), mask.maskImageData);
-       }
-       
-       private void createVisibleMaskBorder(SegmentationMask mask) {
-               dispose();
-               
-               if (isNewMaskBorderDataRequired(mask.getBounds())) {
-                       maskBorderData = createMaskBorderData(mask.getBounds());
-               } 
-               
-               // Set pixels
-               byte[] buff = new byte[maskBorderData.width];
-               for (int y = 0, i = 0; y < mask.height-1; y++) {
-                       for (int x = 0; x < mask.width-1; x++) {
-                               // Make transparent
-                               buff[x] = 0;
-                               
-                               // Current pixel
-                               byte pix1 = mask.values[i];
-                               
-                               // Neighbor to right & neighbor below
-                               byte pix2 = mask.values[i+1];
-                               byte pix3 = mask.values[i+mask.width];
-                               
-                               // Set pixel if either neighbor is different
-                               if (pix1 != pix2 || pix1 != pix3) {
-                                       buff[x] = 1;
-                               }
-                               
-                               // Next pixel
-                               i++;
-                       }
-                       
-                       if (mask.width != 0) {
-                               // Last pixel in row
-                               byte pix1 = mask.values[i];
-                               byte pix2 = mask.values[i+mask.width];
-                               buff[mask.width-1] = (pix1 != pix2) ? (byte) 1 : 0;
-                               
-                               // Next row
-                               i++;
-                       }
-                       
-                       // Blit pixels
-                       maskBorderData.setPixels(0, y, buff.length, buff, 0);
-               }
-               
-               // Last row
-               if (mask.height != 0) {
-                       int yoff = (mask.height - 1) * mask.width;
-                       for (int x = 0; x < mask.width-1; x++) {
-                               byte pix1 = mask.values[x+yoff];
-                               byte pix2 = mask.values[x+yoff+1];
-                               buff[x] = (pix1 != pix2) ? (byte) 1 : 0;
-                       }
-                       
-                       // Blit
-                       maskBorderData.setPixels(0, mask.height-1, buff.length, buff, 0);
-               }
-               
-               // Create new maskBorder
-               maskBorderImage = new Image(Display.getCurrent(), maskBorderData);
-       }
-       
-       private boolean isNewMaskDataRequired(SegmentationMask mask) {
-               if (mask.getImageData() == null) {
-                       return true;
-               } else {
-                       return mask.getImageData().width != mask.getBounds().width || mask.getImageData().height != mask.getBounds().height;
-               }
-       }
-       
-       private boolean isNewMaskBorderDataRequired(Rectangle bounds) {
-               if (maskBorderData == null) {
-                       return true;
-               } else {
-                       return maskBorderData.width != bounds.width || maskBorderData.height != bounds.height;
-               }
-       }
-
-       private static ImageData createMaskData(Rectangle bounds) {
-               RGB[] colors = new RGB[] {
-                               new RGB(0, 0, 0),
-                               new RGB(255,180,180),
-                               new RGB(180,255,180),
-                               new RGB(180,180,255)
-               };
-               
-               // 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 alpha mask
-               data.alphaData = new byte[bounds.width*bounds.height];
-               
-               // Create and return the image
-               return data;
-       }
-
-       private static ImageData createMaskBorderData(Rectangle bounds) {
-               RGB[] colors = new RGB[] {
-                       new RGB(255,255,255),
-                       new RGB(255,140,0)
-               };
-               
-               // 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;
-               }
-               if (maskBorderImage != null) {
-                       if (!maskBorderImage.isDisposed()) {
-                               maskBorderImage.dispose();
-                       }
-                       maskBorderImage = null;
-               }*/
-       }
-}
diff --git a/Annotation/src/ie/dcu/segment/painters/SegmentPainter.java b/Annotation/src/ie/dcu/segment/painters/SegmentPainter.java
new file mode 100644 (file)
index 0000000..2e56be5
--- /dev/null
@@ -0,0 +1,281 @@
+package ie.dcu.segment.painters;
+
+import ie.dcu.segment.*;
+import ie.dcu.swt.ObservableImage;
+
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.widgets.*;
+
+/**
+ * An overlaid view of the image, segmentation mask, and markup.
+ * 
+ * @author Kevin McGuinness
+ */
+public class SegmentPainter implements SegmentationPainter {
+       public static final String NAME = "Segmented";
+       //here it applies
+       private ImageData maskBorderData;
+       private Image maskBorderImage;
+
+       
+       public String getName() {
+               return NAME;
+       }
+
+
+       public String getDescription() {
+               return "An overlaid view of the image, segmentation mask, and markup";
+       }
+
+       public ImageData getMaskData(SegmentationContext ctx) {
+               /*for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
+               {
+                       if(segmentMask.enabled == true)
+                       {
+                               return segmentMask.getImageData();
+                       }
+               }*/
+               return maskBorderData;
+       }
+       
+       public void paint(SegmentationContext ctx, ObservableImage im) {
+               
+               GC gc = im.beginPaint();
+               // Paint image
+               gc.drawImage(ctx.getImage(), 0, 0);
+               int numberOfMaskObjects = ctx.getSegmentationMasks().size();
+               // Paint all masks and its borders skipping the enabled mask.
+               if(numberOfMaskObjects > 0)
+               {
+                       // For drawing all the disabled masks.
+                       for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
+                       {
+                               if(segmentMask.enabled != true)
+                               {
+                                       createVisibleMask(segmentMask,false);
+                                       gc.drawImage(segmentMask.maskImage, 0, 0);
+                                       createVisibleMaskBorder(segmentMask);
+                                       gc.drawImage(maskBorderImage, 0, 0);
+                               }
+                       }
+                       // For drawing the enabled mask and its border..
+                       for(SegmentationMask segmentMask : ctx.getSegmentationMasks())
+                       {
+                               // Blending of background pixel values while pasting the last mask only
+                               if(segmentMask.enabled == true)
+                               {
+                                       createVisibleMask(segmentMask,true);
+                                       gc.drawImage(segmentMask.maskImage, 0, 0);
+                                       createVisibleMaskBorder(segmentMask);
+                                       gc.drawImage(maskBorderImage, 0, 0);
+                               }
+                       }
+                       // Current mask which has not yet been made into an object
+                       createVisibleMask(ctx.getMask(),false);
+                       gc.drawImage(ctx.getMask().getImage(), 0, 0);
+                       createVisibleMaskBorder(ctx.getMask());
+                       gc.drawImage(maskBorderImage, 0, 0);
+                       
+               }
+               // Very initial mask, which has not yet been turned into an object.
+               else
+               {
+                       createVisibleMask(ctx.getMask(),true);
+                       gc.drawImage(ctx.getMask().getImage(), 0, 0);
+                       createVisibleMaskBorder(ctx.getMask());
+                       gc.drawImage(maskBorderImage, 0, 0);
+               }
+               // Paint all annotations
+               ctx.getAnnotations().paint(im);
+               
+               // Commit changes
+               im.endPaint();
+       }
+       
+       /**
+        * 
+        * @param mask
+        * Mask object to be drawn.
+        * @param isFirstObject
+        * If set to <code>True</code> will blend the background and fore ground pixels.
+        */
+       private void createVisibleMask(SegmentationMask mask,boolean enabled) {
+               
+               dispose();
+               
+               if (isNewMaskDataRequired(mask)) {
+                       mask.maskImageData = createMaskData(mask.getBounds());
+               } 
+               //byte main_index;
+               // Blit in pixels
+               for (int y = 0, i = 0; y < mask.height; y++) {
+                       int rowOffset = y * mask.maskImageData.bytesPerLine;
+                       for (int x = 0; x < mask.width; x++) {
+                               byte alpha, index;
+                               switch (mask.values[i]) {
+                               case SegmentationMask.BACKGROUND:
+                                       alpha = enabled ? (byte) 128 : (byte) 0;
+                                       index = 0;
+                                       break;
+                               case SegmentationMask.FOREGROUND:
+                                       alpha = (byte) 128;
+                                       index = (byte) (mask.layerNumber%3+1);
+                                       break;
+                               default:
+                                       alpha = 0;
+                                       index = 0;
+                                       break;
+                               }
+                                                               
+                               // The SWT ImageData buffer doesn't usually have it's rows aligned
+                               // contiguously in memory (i.e. there are > width bytes per scan-line in
+                               // the buffer), so we can't directly copy in at the same index as the
+                               // mask.
+                               mask.maskImageData.data[x + rowOffset] = index;
+                               
+                               // However, the alpha data is always aligned correctly
+                               mask.maskImageData.alphaData[i] = alpha;
+                               
+                               // Next location in the mask
+                               i++;
+                               //main_index = index;
+                       }
+               }
+       // Create new mask
+       mask.maskImage = new Image(Display.getCurrent(), mask.maskImageData);
+       }
+       
+       private void createVisibleMaskBorder(SegmentationMask mask) {
+               dispose();
+               
+               if (isNewMaskBorderDataRequired(mask.getBounds())) {
+                       maskBorderData = createMaskBorderData(mask.getBounds());
+               } 
+               
+               // Set pixels
+               byte[] buff = new byte[maskBorderData.width];
+               for (int y = 0, i = 0; y < mask.height-1; y++) {
+                       for (int x = 0; x < mask.width-1; x++) {
+                               // Make transparent
+                               buff[x] = 0;
+                               
+                               // Current pixel
+                               byte pix1 = mask.values[i];
+                               
+                               // Neighbor to right & neighbor below
+                               byte pix2 = mask.values[i+1];
+                               byte pix3 = mask.values[i+mask.width];
+                               
+                               // Set pixel if either neighbor is different
+                               if (pix1 != pix2 || pix1 != pix3) {
+                                       buff[x] = 1;
+                               }
+                               
+                               // Next pixel
+                               i++;
+                       }
+                       
+                       if (mask.width != 0) {
+                               // Last pixel in row
+                               byte pix1 = mask.values[i];
+                               byte pix2 = mask.values[i+mask.width];
+                               buff[mask.width-1] = (pix1 != pix2) ? (byte) 1 : 0;
+                               
+                               // Next row
+                               i++;
+                       }
+                       
+                       // Blit pixels
+                       maskBorderData.setPixels(0, y, buff.length, buff, 0);
+               }
+               
+               // Last row
+               if (mask.height != 0) {
+                       int yoff = (mask.height - 1) * mask.width;
+                       for (int x = 0; x < mask.width-1; x++) {
+                               byte pix1 = mask.values[x+yoff];
+                               byte pix2 = mask.values[x+yoff+1];
+                               buff[x] = (pix1 != pix2) ? (byte) 1 : 0;
+                       }
+                       
+                       // Blit
+                       maskBorderData.setPixels(0, mask.height-1, buff.length, buff, 0);
+               }
+               
+               // Create new maskBorder
+               maskBorderImage = new Image(Display.getCurrent(), maskBorderData);
+       }
+       
+       private boolean isNewMaskDataRequired(SegmentationMask mask) {
+               if (mask.getImageData() == null) {
+                       return true;
+               } else {
+                       return mask.getImageData().width != mask.getBounds().width || mask.getImageData().height != mask.getBounds().height;
+               }
+       }
+       
+       private boolean isNewMaskBorderDataRequired(Rectangle bounds) {
+               if (maskBorderData == null) {
+                       return true;
+               } else {
+                       return maskBorderData.width != bounds.width || maskBorderData.height != bounds.height;
+               }
+       }
+
+       private static ImageData createMaskData(Rectangle bounds) {
+               RGB[] colors = new RGB[] {
+                               new RGB(0, 0, 0),
+                               new RGB(255,180,180),
+                               new RGB(180,255,180),
+                               new RGB(180,180,255)
+               };
+               
+               // 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 alpha mask
+               data.alphaData = new byte[bounds.width*bounds.height];
+               
+               // Create and return the image
+               return data;
+       }
+
+       private static ImageData createMaskBorderData(Rectangle bounds) {
+               RGB[] colors = new RGB[] {
+                       new RGB(255,255,255),
+                       new RGB(255,140,0)
+               };
+               
+               // 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;
+               }
+               if (maskBorderImage != null) {
+                       if (!maskBorderImage.isDisposed()) {
+                               maskBorderImage.dispose();
+                       }
+                       maskBorderImage = null;
+               }*/
+       }
+}