javauis/lcdui_qt/src/javax/microedition/lcdui/Image.java
branchRCL_3
changeset 65 ae942d28ec0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Image.java	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,861 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package javax.microedition.lcdui;
+
+import java.io.*;
+
+import javax.microedition.lcdui.game.Sprite;
+
+import org.eclipse.swt.graphics.Internal_GfxPackageSupport;
+
+/**
+ * Class containing graphical data of image.<br>
+ * <br>
+ * Image path handling is not implemented correctly, for example "standard"
+ * LCDUI accepts path "/TestMIDlets/images/100x100.png" but corresponding path
+ * with this image-class must be "/100x100.png".
+ */
+public class Image
+{
+
+    private static Image createImageReturnValue;
+
+    private org.eclipse.swt.graphics.Image eswtImage;
+    private int eswtImageWidth;
+    private int eswtImageHeight;
+    private boolean mutable;
+    private com.nokia.mj.impl.rt.support.Finalizer finalizer;
+
+    // buffer has package visibility so that it can be used as
+    // a lock in other classes
+    ImageBuffer graphicsBuffer;
+    
+    // Graphics for transferring instance
+    // between application and UI thread
+    Graphics tempGraphics;
+
+    /**
+     * Constructor.
+     */
+    Image(org.eclipse.swt.graphics.Image eswtImage, boolean isMutable)
+    {
+        this.eswtImage = eswtImage;
+        this.mutable = isMutable;
+        eswtImageWidth = eswtImage.getBounds().width;
+        eswtImageHeight = eswtImage.getBounds().height;
+        graphicsBuffer = new ImageBuffer(this);
+        finalizer = ((finalizer != null) ? finalizer
+                     : new com.nokia.mj.impl.rt.support.Finalizer()
+        {
+            public void finalizeImpl()
+            {
+                if(finalizer != null)
+                {
+                    finalizer = null;
+                    if(!ESWTUIThreadRunner.isDisposed())
+                    {
+                        dispose();
+                    }
+                }
+            }
+        });
+        ESWTUIThreadRunner.update(getClass().getName(), 1);
+    }
+
+    /**
+     * Called by finalizer when Image is ready to free its resources.
+     */
+    void dispose()
+    {
+        ESWTUIThreadRunner.update(getClass().getName(), -1);
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                if(eswtImage != null)
+                {
+                    eswtImage.dispose();
+                    eswtImage = null;
+                }
+                graphicsBuffer.dispose();
+            }
+        });
+    }
+
+    /**
+     * Return eSWT Image object.
+     */
+    org.eclipse.swt.graphics.Image getESWTImage()
+    {
+        return eswtImage;
+    }
+
+    /**
+     * Return eSWT Image object.
+     *
+     * @param img Image
+     * @return eSWT Image
+     */
+    static org.eclipse.swt.graphics.Image getESWTImage(Image img)
+    {
+        if(img != null)
+        {
+            return img.eswtImage;
+        }
+        return null;
+    }
+
+    /**
+     * Creates new mutable image where every pixel is white.
+     *
+     * @param w The width of the image to be created.
+     * @param h The height of the image to be created.
+     * @return Image created.
+     * @throws IllegalArgumentException if width or height are zero or less.
+     */
+    public static Image createImage(int w, int h)
+    {
+        if(w <= 0 || h <= 0)
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_DIMENSIONS);
+        }
+
+        final int width = w;
+        final int height = h;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.graphics.Image eswtImg =
+                    eswtCreateImage(width, height);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, true);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                    throw new OutOfMemoryError();
+                }
+            }
+        });
+        return createImageReturnValue;
+    }
+
+    /**
+     * Creates an immutable image with the specified size from the existing
+     * image source.
+     *
+     * @param srcImage the source of image.
+     * @param width the width of the new image.
+     * @param height the height of the new image.
+     * @return the resized Image.
+     * @throws NullPointerException if aImage is null.
+     */
+    static Image createImage(Image srcImage, int width, int height)
+    {
+        if(srcImage == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_IS_NULL);
+        }
+        final Image finalImage = srcImage;
+        final int finalWidth = width;
+        final int finalHeight = height;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.graphics.Image eswtImg =
+                    eswtCreateImage(finalImage.eswtImage, finalWidth, finalHeight);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, false);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                    throw new OutOfMemoryError();
+                }
+            }
+        });
+        return createImageReturnValue;
+    }
+
+    /**
+     * Creates immutable image from existing image source.
+     *
+     * @param srcImage The source of image.
+     * @return Image created.
+     * @throws NullPointerException if source image is null.
+     */
+    public static Image createImage(Image srcImage)
+    {
+        if(srcImage == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_IS_NULL);
+        }
+
+        if(!srcImage.isMutable())
+        {
+            return srcImage;
+        }
+
+        final Image finalImage = srcImage;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.graphics.Image eswtImg =
+                    eswtCreateImage(finalImage.eswtImage);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, false);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                    throw new OutOfMemoryError();
+                }
+            }
+        });
+        return createImageReturnValue;
+    }
+
+    /**
+     * Creates an immutable image from named resource.
+     *
+     * @param name The name of the resource.
+     * @return Image created.
+     * @throws NullPointerException if name is null.
+     * @throws IOException If resource doesn't exist, data cannot be loaded or
+     *             data is invalid.
+     */
+    public static Image createImage(String name) throws IOException
+    {
+        if(name == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_FILE_NAME_IS_NULL);
+        }
+
+        String fileName = name;
+        if(!fileName.startsWith("/"))
+        {
+            fileName = "/" + fileName;
+        }
+
+        InputStream stream = Image.class.getResourceAsStream(fileName);
+        if(stream == null)
+        {
+            throw new IOException(MsgRepository.IMAGE_EXCEPTION_IO_ERROR);
+        }
+        Image image = createImage(stream);
+        try
+        {
+            stream.close();
+        }
+        catch(IOException e)
+        {
+            // ignore
+        }
+        return image;
+    }
+
+    /**
+     * Creates immutable image from stream. Thread's execution is blocked until
+     * this method is finished.
+     *
+     * @param stream The stream.
+     * @return Image created.
+     * @throws NullPointerException if stream is null.
+     * @throws java.io.IOException If I/O error occurs or data from stream is
+     *             invalid.
+     */
+    public static Image createImage(InputStream stream) throws java.io.IOException
+    {
+        if(stream == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_FILE_STREAM_IS_NULL);
+        }
+        final InputStream finalStream = stream;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.graphics.Image eswtImg = eswtCreateImage(finalStream);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, false);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                }
+            }
+        });
+        if(createImageReturnValue == null)
+        {
+            throw new IOException(MsgRepository.IMAGE_EXCEPTION_IO_ERROR);
+        }
+        return createImageReturnValue;
+    }
+
+    /**
+     * Creates new immutable image from image data provided.
+     *
+     * @param imgData Image data.
+     * @param imgOffset Start offset in image data.
+     * @param imgLength Length of data used.
+     * @return Image created.
+     * @throws ArrayIndexOutOfBoundsException if imgOffset and imgLength
+     *             specifies invalid range.
+     * @throws NullPointerException if imgData is null.
+     * @throws IllegalArgumentException if imgData content is invalid.
+     */
+    public static Image createImage(byte[] imgData, int imgOffset, int imgLength)
+    {
+        if(imgData == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_DATA_IS_NULL);
+        }
+        if(imgOffset + imgLength > imgData.length)
+        {
+            throw new ArrayIndexOutOfBoundsException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_BOUNDS);
+        }
+        if(imgOffset < 0 || imgLength < 0)
+        {
+            throw new ArrayIndexOutOfBoundsException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_BOUNDS);
+        }
+
+        InputStream inputStream = new ByteArrayInputStream(imgData, imgOffset, imgLength);
+        try
+        {
+            createImageReturnValue = createImage(inputStream);
+        }
+        catch(IOException e)
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_DATA);
+        }
+        finally
+        {
+            try
+            {
+                inputStream.close();
+            }
+            catch(IOException e)
+            {
+                // ignore
+            }
+        }
+        return createImageReturnValue;
+    }
+
+    /**
+     * Creates an immutable image from specified region of existing source image
+     * with specified transform.
+     *
+     * @param srcImage Source image.
+     * @param x Region's x.
+     * @param y Region's y.
+     * @param w Regions width.
+     * @param h Regions height.
+     * @param transform Transform, one of the transforms specified in
+     *            Sprite-class.
+     * @return Image created.
+     * @throws NullPointerException if img is null.
+     * @throws IllegalArgumentException if Region specified exceeds the source
+     *             image or if w or h is zero or less or if transform is not one
+     *             defined in Sprite-class.
+     */
+    public static Image createImage(Image srcImage,
+                                    int x,
+                                    int y,
+                                    int w,
+                                    int h,
+                                    int transform)
+    {
+        if(srcImage == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_IS_NULL);
+        }
+        if(w <= 0 || h <= 0)
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_DIMENSIONS);
+        }
+        if(!validateTransform(transform))
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_TRANSFORM);
+        }
+        if(!validateRegion(srcImage.getWidth(), srcImage.getHeight(), x, y, w, h))
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_REGION);
+        }
+
+        final Image fImage = srcImage;
+        final int fx = x;
+        final int fy = y;
+        final int fw = w;
+        final int fh = h;
+        final int fTransform = transform;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.internal.qt.graphics.Image srcCgImage =
+                    Internal_GfxPackageSupport.getImage(fImage.getESWTImage());
+
+                org.eclipse.swt.internal.qt.graphics.Image cgImage =
+                    new org.eclipse.swt.internal.qt.graphics.Image(
+                    srcCgImage, fx, fy, fw, fh);
+
+                cgImage.transform(getCgTransformValue(fTransform));
+
+                org.eclipse.swt.graphics.Image eswtImg =
+                    Internal_GfxPackageSupport.new_Image(
+                        ESWTUIThreadRunner.getInstance().getDisplay(),
+                        cgImage);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, false);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                    throw new OutOfMemoryError();
+                }
+            }
+        });
+        return createImageReturnValue;
+    }
+
+    /**
+     * Validates that a specified region is fully located within the image
+     * bounds. Method is package-private, used by Graphics.drawRegion as well.
+     */
+    static boolean validateRegion(int srcWidth, int srcHeight, int x, int y,
+                                  int w, int h)
+    {
+        return x >= 0 && y >= 0 && w <= srcWidth && h <= srcHeight;
+    }
+
+    /**
+     * Validates if transform has a valid value. Method is package-private, used
+     * by Graphics.drawRegion as well.
+     */
+    static boolean validateTransform(int transform)
+    {
+        return transform == Sprite.TRANS_NONE
+               || transform == Sprite.TRANS_MIRROR
+               || transform == Sprite.TRANS_MIRROR_ROT90
+               || transform == Sprite.TRANS_MIRROR_ROT180
+               || transform == Sprite.TRANS_MIRROR_ROT270
+               || transform == Sprite.TRANS_ROT90
+               || transform == Sprite.TRANS_ROT180
+               || transform == Sprite.TRANS_ROT270;
+    }
+
+    /**
+     *  Maps LCDUI transform constants to Common Graphics. Method is package-private, used
+     *  by Graphics.drawRegion as well.
+     */
+    static int getCgTransformValue(int transform)
+    {
+        int retVal = org.eclipse.swt.internal.qt.graphics.Image.TRANS_NONE;
+        switch(transform)
+        {
+        case Sprite.TRANS_NONE:
+            retVal = org.eclipse.swt.internal.qt.graphics.Image.TRANS_NONE;
+            break;
+        case Sprite.TRANS_ROT90:
+            retVal = org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT90;
+            break;
+        case Sprite.TRANS_ROT180:
+            retVal =
+                org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT180;
+            break;
+        case Sprite.TRANS_ROT270:
+            retVal =
+                org.eclipse.swt.internal.qt.graphics.Image.TRANS_ROT270;
+            break;
+        case Sprite.TRANS_MIRROR:
+            retVal =
+                org.eclipse.swt.internal.qt.graphics.Image.TRANS_MIRROR;
+            break;
+        case Sprite.TRANS_MIRROR_ROT90:
+            retVal = org.eclipse.swt.internal.qt.graphics.
+                     Image.TRANS_MIRROR_ROT90;
+            break;
+        case Sprite.TRANS_MIRROR_ROT180:
+            retVal = org.eclipse.swt.internal.qt.graphics.
+                     Image.TRANS_MIRROR_ROT180;
+            break;
+        case Sprite.TRANS_MIRROR_ROT270:
+            retVal = org.eclipse.swt.internal.qt.graphics.
+                     Image.TRANS_MIRROR_ROT270;
+            break;
+        default:
+            break;
+        }
+        return retVal;
+    }
+
+    /**
+     * Creates eSWT image as a copy of existing image.
+     *
+     * @param image - image to be copied.
+     * @return new eSWT image.
+     */
+    private static org.eclipse.swt.graphics.Image eswtCreateImage(
+        org.eclipse.swt.graphics.Image srcImage)
+    {
+        org.eclipse.swt.graphics.Image ret = null;
+        try
+        {
+            org.eclipse.swt.internal.qt.graphics.Image cgImage =
+                Internal_GfxPackageSupport.getImage(srcImage);
+
+            org.eclipse.swt.internal.qt.graphics.Image cgImage2 =
+                new org.eclipse.swt.internal.qt.graphics.Image(cgImage);
+
+            ret = Internal_GfxPackageSupport.new_Image(
+                      ESWTUIThreadRunner.getInstance().getDisplay(), cgImage2);
+        }
+        catch(IllegalArgumentException ex)
+        {
+            // Device is null or there's no current device.
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTException ex)
+        {
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTError err)
+        {
+            ret = null;
+        }
+        return ret;
+    }
+
+    /**
+     * Creates eSWT image of the specified size from the given image.
+     */
+    static org.eclipse.swt.graphics.Image eswtCreateImage(
+        org.eclipse.swt.graphics.Image image, int newWidth, int newHeight)
+    {
+        org.eclipse.swt.graphics.Image ret = null;
+        try
+        {
+            ret = new org.eclipse.swt.graphics.Image(
+                ESWTUIThreadRunner.getInstance().getDisplay(),
+                image.getImageData().scaledTo(newWidth, newHeight));
+        }
+        catch(IllegalArgumentException ex)
+        {
+            // Device is null or there's no current device.
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTException ex)
+        {
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTError err)
+        {
+            ret = null;
+        }
+        return ret;
+    }
+
+    /**
+     * Creates eSWT image of the specified size.
+     */
+    static org.eclipse.swt.graphics.Image eswtCreateImage(int width, int height)
+    {
+        org.eclipse.swt.graphics.Image ret = null;
+        try
+        {
+            ret = new org.eclipse.swt.graphics.Image(
+                ESWTUIThreadRunner.getInstance().getDisplay(), width, height);
+        }
+        catch(IllegalArgumentException ex)
+        {
+            // Device is null or there's no current device.
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTException ex)
+        {
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTError err)
+        {
+            ret = null;
+        }
+        return ret;
+    }
+
+    /**
+     * Creates and eSWT image out of the InputStream.
+     */
+    static org.eclipse.swt.graphics.Image eswtCreateImage(InputStream inputStream)
+    {
+        org.eclipse.swt.graphics.Image ret = null;
+        try
+        {
+            ret = new org.eclipse.swt.graphics.Image(
+                ESWTUIThreadRunner.getInstance().getDisplay(), inputStream);
+        }
+        catch(IllegalArgumentException ex)
+        {
+            // Device is null or there's no current device.
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTException ex)
+        {
+            ret = null;
+        }
+        catch(org.eclipse.swt.SWTError err)
+        {
+            ret = null;
+        }
+        return ret;
+    }
+
+    /**
+     * Synchronizes any pending draw commands to this image. The buffer sync 
+     * must be executed in UI thread and if this method is not requested to switch to
+     * UI thread, the caller must take care of serializing the call over the graphicsBuffer
+     * of this instance.
+     * 
+     * @param switchToUIThread If true the sync is run in UI thread, oherwise
+     *        caller must take care of switching to UI thread
+     */
+    void sync(boolean switchToUIThread)
+    {
+    	if(switchToUIThread) 
+		{
+    	    synchronized(graphicsBuffer)
+            {
+                ESWTUIThreadRunner.safeSyncExec(new Runnable()
+                {
+                    public void run()
+                    {
+                        graphicsBuffer.sync();
+                    }
+                });
+            }
+         } 
+    	else 
+    	{
+    		graphicsBuffer.sync();
+    	}
+    }
+
+    /**
+     * Creates new image from specified RGB array data.
+     *
+     * @param rgbData Pixel data.
+     * @param width Width of the image to be created.
+     * @param height Height of the image to be created.
+     * @param processAlpha true if there's alpha channel in image data.
+     *            Otherwise method assumes that all pixels are fully opaque.
+     * @return Image created.
+     * @throws NullPointerException if rgb is null.
+     * @throws IllegalArgumentException if w or h is zero or less.
+     * @throws ArrayIndexOutOfBoundsException if the w and h parameters doesn't
+     *             match the length of the data array provided.
+     */
+    public static Image createRGBImage(int[] rgbData,
+                                       int width,
+                                       int height,
+                                       boolean processAlpha)
+    {
+
+        if(rgbData == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_DATA_IS_NULL);
+        }
+        if(width <= 0 || height <= 0)
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_DIMENSIONS);
+        }
+        if(width * height > rgbData.length)
+        {
+            throw new ArrayIndexOutOfBoundsException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_BOUNDS);
+        }
+
+        final int[] rgb = rgbData;
+        final int w = width;
+        final int h = height;
+        final boolean alpha = processAlpha;
+        ESWTUIThreadRunner.safeSyncExec(new Runnable()
+        {
+            public void run()
+            {
+                org.eclipse.swt.internal.qt.graphics.Image cgImage =
+                    new org.eclipse.swt.internal.qt.graphics.Image(rgb, w, h, alpha);
+
+                org.eclipse.swt.graphics.Image eswtImg =
+                    Internal_GfxPackageSupport.new_Image(
+                        ESWTUIThreadRunner.getInstance().getDisplay(), cgImage);
+
+                if(eswtImg != null)
+                {
+                    createImageReturnValue = new Image(eswtImg, false);
+                }
+                else
+                {
+                    createImageReturnValue = null;
+                    throw new OutOfMemoryError();
+                }
+            }
+        });
+        return createImageReturnValue;
+    }
+
+    /**
+     * Returns ARGB data of image region to an int[] array.
+     *
+     * @param rgbData - array to be filled with ARGB data.
+     * @param offset - first index in the array to store the data.
+     * @param length - relative distance in the array between corresponding
+     *            pixels of consecutive rows.
+     * @param xPos - x-coordinate of the top-left corner of the region.
+     * @param yPos - y-coordinate of the top-left corner of the region.
+     * @param width - width of the region.
+     * @param height - height of the region.
+     */
+    public void getRGB(int[] rgbData,
+                       int offset,
+                       int length,
+                       int xPos,
+                       int yPos,
+                       int width,
+                       int height)
+    {
+
+        if(rgbData == null)
+        {
+            throw new NullPointerException(
+                MsgRepository.IMAGE_EXCEPTION_DATA_IS_NULL);
+        }
+        if(!validateRegion(this.getWidth(), this.getHeight(),
+                           xPos, yPos, width, height))
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_BOUNDS);
+        }
+        if(Math.abs(length) < width)
+        {
+            throw new IllegalArgumentException(
+                MsgRepository.IMAGE_EXCEPTION_INVALID_SCANLENGTH);
+        }
+
+        synchronized(graphicsBuffer)
+        {
+            final int[] localRgbData = rgbData;
+            final int localOffset = offset;
+            final int localLength = length;
+            final int localX = xPos;
+            final int localY = yPos;
+            final int localW = width;
+            final int localH = height;
+            ESWTUIThreadRunner.safeSyncExec(new Runnable()
+            {
+                public void run()
+                {
+                	graphicsBuffer.sync();
+                    org.eclipse.swt.internal.qt.graphics.Image cgImage = Internal_GfxPackageSupport.getImage(eswtImage);
+                    cgImage.getRGB(localRgbData, localOffset, localLength,
+                                   localX, localY, localW, localH);
+                }
+            });
+        }
+    }
+
+    /**
+     * Creates a new Graphics-objects that is able to draw to this image.
+     *
+     * @return New Graphics-object.
+     * @throws IllegalStateException if image is immutable.
+     */
+    public Graphics getGraphics()
+    {
+        if(mutable)
+        {	
+        	tempGraphics = null;
+        	ESWTUIThreadRunner.safeSyncExec(new Runnable()
+            {
+                public void run()
+                {
+        	        tempGraphics =  graphicsBuffer.getGraphics();
+                }
+            });
+            return tempGraphics;
+        }
+        throw new IllegalStateException(MsgRepository.IMAGE_EXCEPTION_IMMUTABLE);
+    }
+
+    /**
+     * Gets width of the image.
+     *
+     * @return Image width.
+     */
+    public int getWidth()
+    {
+        return eswtImageWidth;
+    }
+
+    /**
+     * Gets height of the image.
+     *
+     * @return Image height.
+     */
+    public int getHeight()
+    {
+        return eswtImageHeight;
+    }
+
+    /**
+     * Check is it possible to modify this image.
+     *
+     * @return true, if image is mutable.
+     */
+    public boolean isMutable()
+    {
+        return mutable;
+    }
+
+}