FileDocCategorySizeDatePackage
ImageDataFactory.javaAPI DocphoneME MR2 API (J2ME)26767Wed May 02 18:00:08 BST 2007javax.microedition.lcdui

ImageDataFactory

public class ImageDataFactory extends Object implements AbstractImageDataFactory
Creates ImageData based on platform decoder and storage.

Fields Summary
private static ImageDataFactory
imageDataFactory
Singleton ImageDataFactory instance.
Constructors Summary
Methods Summary
public ImageDatacreateImmutableCopy(ImageData mutableSource)
Creates an immutable image from a source mutable image.

This method is useful for placing the contents of mutable images into Choice objects. The application can create an off-screen image using the {@link #createImage(int, int) createImage(w, h)} method, draw into it using a Graphics object obtained with the {@link #getGraphics() getGraphics()} method, and then create an immutable copy of it with this method. The immutable copy may then be placed into Choice objects.

param
mutableSource the source mutable image to be copied
return
the new immutable image

        ImageData data = new ImageData(mutableSource.getWidth(),
                                       mutableSource.getHeight(),
                                       false);


        // Duplicate mutable image contents
        try {
            createImmutableImageDataCopy(data, mutableSource);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                createImmutableImageDataCopy(data, mutableSource);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                createImmutableImageDataCopy(data, mutableSource);
            }
        }

        return data;
    
public ImageDatacreateImmutableImageData(byte[] imageBytes, int imageOffset, int imageLength)
Creates an immutable image which is decoded from the data stored in the specified byte array at the specified offset and length. The data must be in a self-identifying image file format supported by the implementation, such as PNG.

The imageoffset and imagelength parameters specify a range of data within the imageData byte array. The imageOffset parameter specifies the offset into the array of the first data byte to be used. It must therefore lie within the range [0..(imageData.length-1)]. The imageLength parameter specifies the number of data bytes to be used. It must be a positive integer and it must not cause the range to extend beyond the end of the array. That is, it must be true that imageOffset + imageLength < imageData.length.

This method is intended for use when loading an image from a variety of sources, such as from persistent storage or from the network.

param
imageBytes the array of image data in a supported image format
param
imageOffset the offset of the start of the data in the array
param
imageLength the length of the data in the array
return
the created image data
throws
IllegalArgumentException if imageData is incorrectly formatted or otherwise cannot be decoded

        ImageData data = new ImageData();

        // width, height and native data will be set below
        try {
            createImmutableImageDecodeImage(data, imageBytes, imageOffset,
                                            imageLength);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                createImmutableImageDecodeImage(data,
                                                imageBytes, imageOffset,
                                                imageLength);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                createImmutableImageDecodeImage(data, imageBytes, imageOffset,
                                                imageLength);
            }
        }

        return data;
    
public ImageDatacreateImmutableImageData(ImageData dataSource, int x, int y, int width, int height, int transform)
Creates an immutable image using pixel data from the specified region of a source image, transformed as specified.

The source image may be mutable or immutable. For immutable source images, transparency information, if any, is copied to the new image unchanged.

On some devices, pre-transformed images may render more quickly than images that are transformed on the fly using drawRegion. However, creating such images does consume additional heap space, so this technique should be applied only to images whose rendering speed is critical.

The transform function used must be one of the following, as defined in the {@link javax.microedition.lcdui.game.Sprite Sprite} class:
Sprite.TRANS_NONE - causes the specified image region to be copied unchanged
Sprite.TRANS_ROT90 - causes the specified image region to be rotated clockwise by 90 degrees.
Sprite.TRANS_ROT180 - causes the specified image region to be rotated clockwise by 180 degrees.
Sprite.TRANS_ROT270 - causes the specified image region to be rotated clockwise by 270 degrees.
Sprite.TRANS_MIRROR - causes the specified image region to be reflected about its vertical center.
Sprite.TRANS_MIRROR_ROT90 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 90 degrees.
Sprite.TRANS_MIRROR_ROT180 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 180 degrees.
Sprite.TRANS_MIRROR_ROT270 - causes the specified image region to be reflected about its vertical center and then rotated clockwise by 270 degrees.

The size of the returned image will be the size of the specified region with the transform applied. For example, if the region is 100 x 50 pixels and the transform is TRANS_ROT90, the returned image will be 50 x 100 pixels.

Note: If all of the following conditions are met, this method may simply return the source Image without creating a new one:

  • the source image is immutable;
  • the region represents the entire source image; and
  • the transform is TRANS_NONE.

param
dataSource the source image data to be copied from
param
x the horizontal location of the region to be copied
param
y the vertical location of the region to be copied
param
width the width of the region to be copied
param
height the height of the region to be copied
param
transform the transform to be applied to the region
return
the new immutable image data

        ImageData dataDest;

        if ((transform & Image.TRANSFORM_SWAP_AXIS) != 0x0) {
            dataDest = new ImageData(height, width, false);
        } else {
            dataDest = new ImageData(width, height, false);
        }

        // Copy native data from the source region
        try {
            createImmutableImageDataRegion(dataDest, dataSource,
                                           x, y, width, height,
                                           transform,
                                           dataSource.isMutable());
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                createImmutableImageDataRegion(dataDest,
                                               dataSource,
                                               x, y, width, height,
                                               transform,
                                               dataSource.isMutable());
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                createImmutableImageDataRegion(dataDest, dataSource,
                                               x, y, width, height,
                                               transform,
                                               dataSource.isMutable());
            }
        }

        return dataDest;
    
public ImageDatacreateImmutableImageData(java.io.InputStream stream)
Creates an immutable image from decoded image data obtained from an InputStream. This method blocks until all image data has been read and decoded. After this method completes (whether by returning or by throwing an exception) the stream is left open and its current position is undefined.

param
stream the name of the resource containing the image data in one of the supported image formats
return
the created image data
throws
java.io.IOException if an I/O error occurs, if the image data cannot be loaded, or if the image data cannot be decoded

        ImageData data = new ImageData();

        // width, height and native data will be set below
        try {
            getImageDataFromStream(data, stream);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                getImageDataFromStream(data, stream);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                getImageDataFromStream(data, stream);
            }
        }

        return data;
    
public ImageDatacreateImmutableImageData(int[] rgb, int width, int height, boolean processAlpha)
Creates an immutable image from a sequence of ARGB values, specified as 0xAARRGGBB. The ARGB data within the rgb array is arranged horizontally from left to right within each row, row by row from top to bottom. If processAlpha is true, the high-order byte specifies opacity; that is, 0x00RRGGBB specifies a fully transparent pixel and 0xFFRRGGBB specifies a fully opaque pixel. Intermediate alpha values specify semitransparency. If the implementation does not support alpha blending for image rendering operations, it must replace any semitransparent pixels with fully transparent pixels. (See Alpha Processing for further discussion.) If processAlpha is false, the alpha values are ignored and all pixels must be treated as fully opaque.

Consider P(a,b) to be the value of the pixel located at column a and row b of the Image, where rows and columns are numbered downward from the top starting at zero, and columns are numbered rightward from the left starting at zero. This operation can then be defined as:


P(a, b) = rgb[a + b * width]; 

for


0 <= a < width
0 <= b < height 

param
rgb an array of ARGB values that composes the image
param
width the width of the image
param
height the height of the image
param
processAlpha true if rgb has an alpha channel, false if all pixels are fully opaque
return
the created image data

        ImageData data = new ImageData(width, height, false);

        // create native image data below
        try {
            createImmutableImageDecodeRGBImage(data, rgb,
                                               width, height,
                                               processAlpha);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                createImmutableImageDecodeRGBImage(data, rgb,
                                                   width, height,
                                                   processAlpha);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                createImmutableImageDecodeRGBImage(data, rgb,
                                                   width, height,
                                                   processAlpha);
            }
        }

        return data;
    
public ImageDatacreateImmutableImageData(int imageDataArrayPtr, int imageDataArrayLength)
Create a immutable image from romized image data.

param
imageDataArrayPtr native pointer to image data as Java int
param
imageDataArrayLength length of image data array
return
the created image data
throws
IllegalArgumentException if the id is invalid


        ImageData data = new ImageData();

        // width, height and native image data will be set below
        if (!loadRomizedImage(data, imageDataArrayPtr,
                    imageDataArrayLength)) {
            throw new IllegalArgumentException();
        }

        return data;
    
private native voidcreateImmutableImageDataCopy(ImageData dest, ImageData source)
Native function to create an immutable copy of an image data.

param
dest The ImageData where to make a copy
param
source The Image to make a copy of, either mutable or immutable.

private native voidcreateImmutableImageDataRegion(ImageData dataDest, ImageData dataSource, int x, int y, int width, int height, int transform, boolean isMutable)
Native function that creates an immutable image data from a region of another image data, applying the given transform

param
dataDest The ImageData to make a copy to
param
dataSource The ImageData to make a copy of
param
x The horizontal offset of the top left of the region to copy
param
y The vertical offset of the top left of the region to copy
param
width The width of the new Image
param
height The height of the new Image
param
transform The transformation to apply
param
isMutable True if the Image is mutable, false otherwise

private native voidcreateImmutableImageDecodeImage(ImageData data, byte[] inputData, int offset, int length)
Native function to decode an ImageData from a byte array

param
data The ImageData object
param
inputData The byte array image data
param
offset The start of the image data within the byte array
param
length The length of the image data in the byte array
throws
IllegalArgumentException if the data cannot be decoded

private native voidcreateImmutableImageDecodeRGBImage(ImageData data, int[] inputData, int width, int height, boolean processAlpha)
Native function to decode an ImageData from an array of RGB data

param
data the ImageData object
param
inputData an array of ARGB values that composes the image.
param
width the width of the image
param
height the height of the image
param
processAlpha true if rgb has an alpha channel, false if all pixels are fully opaque

private native voidcreateMutableImageData(ImageData data, int width, int height)
Create a mutable image data

param
data The ImageData object
param
width The width of the new mutable image
param
height The height of the new mutable image

public ImageDatacreateOffScreenImageData(int width, int height)
Creates a new, mutable image for off-screen drawing. Every pixel within the newly created image is white. The width and height of the image must both be greater than zero.

param
width the width of the new image, in pixels
param
height the height of the new image, in pixels
return
the created image data

        ImageData data = new ImageData(width, height, true);

        // Create native image data and store its pointer in nativeImageData
        try {
            createMutableImageData(data, width, height);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                createMutableImageData(data, width, height);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                createMutableImageData(data, width, height);
            }
        }

        return data;
    
public ImageDatacreateResourceImageData(java.lang.String name)
Creates an immutable image from decoded image data obtained from the named resource. The name parameter is a resource name as defined by {@link Class#getResourceAsStream(String) Class.getResourceAsStream(name)}. The rules for resolving resource names are defined in the Application Resource Files section of the java.lang package documentation.

param
name the name of the resource containing the image data in one of the supported image formats
return
the created image data
throws
java.io.IOException if the resource does not exist, the data cannot be loaded, or the image data cannot be decoded

        if (name == null) {
            throw new java.lang.NullPointerException();
        }

        ImageData data = new ImageData();

        // width, height and native data will be set below

        /*
         * Load native image data from cache and create
         * image, if available. If image is not cached,
         * proceed to load and create image normally.
         */
        if (loadAndCreateImmutableImageDataFromCache(data, name)) {
            return data;
        }

        /*
         * allocate an array and read in the bits using
         * Class.getResourceAsStream(name);
         */
        InputStream is = ImageData.class.getResourceAsStream(name);

        /*
         * If the InputStream "is" is null, when "name" is
         * is not null, throw an IOException, not a NullPointerException
         */
        if (is == null) {
            throw new java.io.IOException();
        }

        try {
            getImageDataFromStream(data, is);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                getImageDataFromStream(data, is);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                getImageDataFromStream(data, is);
            }
        }

        return data;
    
private static native voidgarbageCollectImages(boolean doFullGC)
Garbage collected to free native resources from zombie images.

param
doFullGC boolean indicating whether to do a full GC or only request young generation GC.

public static AbstractImageDataFactorygetImageDataFactory()
Returns the singleton ImageDataFactory instance.

return
the singleton ImageDataFactory instance.


                   
        
        return imageDataFactory;
    
private voidgetImageDataFromStream(ImageData data, java.io.InputStream istream)
helper function called by the create functions above. Upon return, the input stream will be closed.

param
data the ImageData object
param
istream the name of the input stream containing image data in a supported format
throws
IOException if there is an error with the stream

        int blocksize = 4096; // the size of blocks to read and allocate

        /*
         * Allocate an array assuming available is correct.
         * Only reading an EOF is the real end of file
         * so allocate an extra byte to read the EOF into.
         * If available is incorrect, increase the buffer
         * size and keep reading.
         */
        int l = istream.available();
        byte[] buffer = new byte[l+1];
        int length = 0;

        // TBD: Guard against an implementation with incorrect available
        while ((l = istream.read(buffer, length,
                                 buffer.length-length)) != -1) {
            length += l;
            if (length == buffer.length) {
                byte[] b = new byte[buffer.length + blocksize];
                System.arraycopy(buffer, 0, b, 0, length);
                buffer = b;
            }
        }

        try {
            createImmutableImageDecodeImage(data, buffer, 0, length);
        } catch (IllegalArgumentException iae) {
            // Data cannot be not decoded
            throw new java.io.IOException();
        } finally {
            istream.close();
        }
    
private booleanloadAndCreateImmutableImageDataFromCache(ImageData data, java.lang.String resName)
Load and create image data from cache. The real work is done in the native function.

param
data The ImageData object
param
resName Image resource name
return
true if image was loaded and created, false otherwise

        MIDletSuite midletSuite =
            MIDletStateHandler.getMidletStateHandler().getMIDletSuite();
        int suiteId = midletSuite.getID();

        try {
            return loadAndCreateImmutableImageDataFromCache0(data,
                                                             suiteId, resName);
        } catch(OutOfMemoryError e) {
            garbageCollectImages(false);

            try {
                return loadAndCreateImmutableImageDataFromCache0(data,
                                                                 suiteId,
                                                                 resName);
            } catch(OutOfMemoryError e2) {
                garbageCollectImages(true);

                return loadAndCreateImmutableImageDataFromCache0(data,
                                                                 suiteId,
                                                                 resName);
            }
        }
    
private native booleanloadAndCreateImmutableImageDataFromCache0(ImageData data, int suiteId, java.lang.String resName)
Native function to load native image data from cache and create an immutable image.

param
data The ImageData object
param
suiteId The suite id
param
resName The image resource name
return
true if image was loaded and created, false otherwise

private native booleanloadRomizedImage(ImageData data, int imageDataArrayPtr, int imageDataArrayPtrLength)
Native function to load an ImageData directly out of the rom image.

param
data the ImageData object
param
imageDataArrayPtr native pointer to image data as Java int
param
imageDataArrayPtrLength length of image data array
return
true if the imaged data loading was successful, otherwise it returns false