imagedatafactory.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 668 行 · 第 1/2 页

JAVA
668
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package javax.microedition.lcdui;import java.io.InputStream;import java.io.IOException;/** * Creates ImageData based on platform decoder and storage. */class ImageDataFactory implements AbstractImageDataFactory {    /** Reference to a image cache. */    private SuiteImageCache imageCache;    /** Initialize the image cache factory. */    private ImageDataFactory() {        imageCache = SuiteImageCacheFactory.getCache();    }    /**     * Singleton <code>ImageDataFactory</code> instance.     */    private static ImageDataFactory imageDataFactory =        new ImageDataFactory();    /**     * Returns the singleton <code>ImageDataFactory</code> instance.     *     * @return the singleton <code>ImageDataFactory</code> instance.     */    public static AbstractImageDataFactory getImageDataFactory() {        return imageDataFactory;    }    /**     * 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     */    public ImageData createOffScreenImageData(int width, int height) {        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;    }    /**     * Creates an immutable image from a source mutable image.     *     * <p> This method is useful for placing the contents of mutable images     * into <code>Choice</code> objects.  The application can create     * an off-screen image     * using the     * {@link #createImage(int, int) createImage(w, h)}     * method, draw into it using a <code>Graphics</code> 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 <code>Choice</code>     * objects. </p>     *     * @param mutableSource the source mutable image to be copied     * @return the new immutable image     */    public ImageData createImmutableCopy(ImageData mutableSource) {        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;    }    /**     * 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     * <a href="../../../java/lang/package-summary.html">     * Application Resource Files</a> section of the     * <code>java.lang</code> 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     */    public ImageData createResourceImageData(String name) throws IOException {        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;    }    /**     * 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 <a href="#PNG">PNG</A>.     *     * <p>The <code>imageoffset</code> and <code>imagelength</code>     * parameters specify a range of     * data within the <code>imageData</code> byte array. The     * <code>imageOffset</code> parameter     * specifies the     * offset into the array of the first data byte to be used. It must     * therefore lie within the range     * <code>[0..(imageData.length-1)]</code>. The     * <code>imageLength</code>     * 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     * <code>imageOffset + imageLength &lt; imageData.length</code>. </p>     *     * <p> This method is intended for use when loading an     * image from a variety of sources, such as from     * persistent storage or from the network.</p>     *     * @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 <code>imageData</code> is incorrectly     * formatted or otherwise cannot be decoded     */    public ImageData createImmutableImageData(byte[] imageBytes,                                              int imageOffset,                                              int imageLength) {        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;    }    /**     * Creates an immutable image using pixel data from the specified     * region of a source image, transformed as specified.     *     * <p>The source image may be mutable or immutable.  For immutable source     * images, transparency information, if any, is copied to the new     * image unchanged.</p>     *     * <p>On some devices, pre-transformed images may render more quickly     * than images that are transformed on the fly using     * <code>drawRegion</code>.     * However, creating such images does consume additional heap space,     * so this technique should be applied only to images whose rendering     * speed is critical.</p>     *     * <p>The transform function used must be one of the following, as defined     * in the {@link javax.microedition.lcdui.game.Sprite Sprite} class:<br>     *     * <code>Sprite.TRANS_NONE</code> - causes the specified image     * region to be copied unchanged<br>     * <code>Sprite.TRANS_ROT90</code> - causes the specified image     * region to be rotated clockwise by 90 degrees.<br>     * <code>Sprite.TRANS_ROT180</code> - causes the specified image     * region to be rotated clockwise by 180 degrees.<br>     * <code>Sprite.TRANS_ROT270</code> - causes the specified image     * region to be rotated clockwise by 270 degrees.<br>     * <code>Sprite.TRANS_MIRROR</code> - causes the specified image     * region to be reflected about its vertical center.<br>     * <code>Sprite.TRANS_MIRROR_ROT90</code> - causes the specified image     * region to be reflected about its vertical center and then rotated     * clockwise by 90 degrees.<br>     * <code>Sprite.TRANS_MIRROR_ROT180</code> - causes the specified image     * region to be reflected about its vertical center and then rotated     * clockwise by 180 degrees.<br>     * <code>Sprite.TRANS_MIRROR_ROT270</code> - causes the specified image     * region to be reflected about its vertical center and then rotated     * clockwise by 270 degrees.<br></p>     *     * <p>     * The size of the returned image will be the size of the specified region     * with the transform applied.  For example, if the region is     * <code>100&nbsp;x&nbsp;50</code> pixels and the transform is     * <code>TRANS_ROT90</code>, the     * returned image will be <code>50&nbsp;x&nbsp;100</code> pixels.</p>     *     * <p><strong>Note:</strong> If all of the following conditions     * are met, this method may     * simply return the source <code>Image</code> without creating a     * new one:</p>     * <ul>     * <li>the source image is immutable;</li>     * <li>the region represents the entire source image; and</li>     * <li>the transform is <code>TRANS_NONE</code>.</li>     * </ul>     *     * @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     *     */    public ImageData createImmutableImageData(ImageData dataSource,                                              int x, int y,                                              int width, int height,                                              int transform) {        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 {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?