EncodedImage.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:7k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit;
  26. import java.io.ByteArrayOutputStream;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.lang.ref.WeakReference;
  30. /**
  31.  * An image that only keeps the binary data of the source file used to load it
  32.  * in permanent memory. This allows the bitmap to get collected while the binary
  33.  * data remains, a weak reference is used for caching.
  34.  *
  35.  * @author Shai Almog
  36.  */
  37. public class EncodedImage extends Image {
  38.     private byte[] imageData;
  39.     private int width = -1;
  40.     private int height = -1;
  41.     private boolean opaqueChecked = false;
  42.     private boolean opaque = false;
  43.     private WeakReference cache;
  44.     
  45.     private EncodedImage(byte[] imageData) {
  46.         super(null);
  47.         this.imageData = imageData;
  48.     }
  49.     /**
  50.      * Returns the byte array data backing the image allowing the image to be stored
  51.      * and discarded completely from RAM.
  52.      * 
  53.      * @return byte array used to create the image, e.g. encoded PNG, JPEG etc.
  54.      */
  55.     public byte[] getImageData() {
  56.         return imageData;
  57.     }
  58.     /**
  59.      * Creates an image from the given byte array
  60.      * 
  61.      * @param data the data of the image
  62.      * @return newly created encoded image
  63.      */
  64.     public static EncodedImage create(byte[] data) {
  65.         if(data == null) {
  66.             throw new NullPointerException();
  67.         }
  68.         return new EncodedImage(data);
  69.     }
  70.     /**
  71.      * Creates an image from the input stream 
  72.      * 
  73.      * @param i the input stream
  74.      * @return newly created encoded image
  75.      * @throws java.io.IOException if thrown by the input stream
  76.      */
  77.     public static EncodedImage create(InputStream i) throws IOException {
  78.         ByteArrayOutputStream bo = new ByteArrayOutputStream();
  79.         byte[] buffer = new byte[4096];
  80.         int size = i.read(buffer);
  81.         while(size > -1) {
  82.             bo.write(buffer, 0, size);
  83.             size = i.read(buffer);
  84.         }
  85.         bo.close();
  86.         return new EncodedImage(bo.toByteArray());
  87.     }
  88.     
  89.     private Image getInternal() {
  90.         if(cache != null) {
  91.             Image i = (Image)cache.get();
  92.             if(i != null) {
  93.                 return i;
  94.             }
  95.         }
  96.         Image i = Image.createImage(imageData, 0, imageData.length);
  97.         cache = new WeakReference(i);
  98.         return i;
  99.     }
  100.     /**
  101.      * Creates an image from the input stream 
  102.      * 
  103.      * @param i the resource
  104.      * @return newly created encoded image
  105.      * @throws java.io.IOException if thrown by the input stream
  106.      */
  107.     public static EncodedImage create(String i) throws IOException {
  108.         return create(Display.getInstance().getResourceAsStream(EncodedImage.class, i));
  109.     }
  110.     /**
  111.      * @inheritDoc
  112.      */
  113.     public Image subImage(int x, int y, int width, int height, boolean processAlpha)  {
  114.         return getInternal().subImage(x, y, width, height, processAlpha);
  115.     }
  116.     /**
  117.      * @inheritDoc
  118.      */
  119.     public Image rotate(int degrees) {
  120.         return getInternal().rotate(degrees);
  121.     }
  122.     
  123.     /**
  124.      * @inheritDoc
  125.      */
  126.     public Image modifyAlpha(byte alpha) {
  127.         return getInternal().modifyAlpha(alpha);
  128.     }
  129.     
  130.     /**
  131.      * @inheritDoc
  132.      */
  133.     public Image modifyAlpha(byte alpha, int removeColor) {
  134.         return getInternal().modifyAlpha(alpha, removeColor);
  135.     }
  136.     /**
  137.      * @inheritDoc
  138.      */
  139.     public Graphics getGraphics() {        
  140.         return null;
  141.     }
  142.     /**
  143.      * @inheritDoc
  144.      */
  145.     public int getWidth() {
  146.         if(width > -1) {
  147.             return width;
  148.         }
  149.         width = getInternal().getWidth();
  150.         return width;
  151.     }
  152.     /**
  153.      * @inheritDoc
  154.      */
  155.     public int getHeight() {
  156.         if(height > -1) {
  157.             return height;
  158.         }
  159.         height = getInternal().getHeight();
  160.         return height;
  161.     }
  162.     /**
  163.      * @inheritDoc
  164.      */
  165.     protected void drawImage(Graphics g, Object nativeGraphics, int x, int y) {
  166.         getInternal().drawImage(g, nativeGraphics, x, y);
  167.     }
  168.     /**
  169.      * @inheritDoc
  170.      */
  171.     void getRGB(int[] rgbData,
  172.             int offset,
  173.             int x,
  174.             int y,
  175.             int width,
  176.             int height) {
  177.         getInternal().getRGB(rgbData, offset, x, y, width, height);
  178.     }
  179.     /**
  180.      * @inheritDoc
  181.      */
  182.     public void toRGB(RGBImage image,
  183.             int destX,
  184.             int destY,
  185.             int x,
  186.             int y,
  187.             int width,
  188.             int height) {
  189.         getInternal().toRGB(image, destX, destY, x, y, width, height);
  190.     }
  191.     /**
  192.      * @inheritDoc
  193.      */
  194.     public Image scaledWidth(int width) {
  195.         return getInternal().scaledWidth(width);
  196.     }
  197.     /**
  198.      * @inheritDoc
  199.      */
  200.     public Image scaledHeight(int height) {
  201.         return getInternal().scaledHeight(height);
  202.     }
  203.     /**
  204.      * @inheritDoc
  205.      */
  206.     public Image scaledSmallerRatio(int width, int height) {
  207.         return getInternal().scaledSmallerRatio(width, height);
  208.     }
  209.     /**
  210.      * @inheritDoc
  211.      */
  212.     public Image scaled(int width, int height) {
  213.         return getInternal().scaled(width, height);
  214.     }
  215.     /**
  216.      * @inheritDoc
  217.      */
  218.     public void scale(int width, int height) {
  219.         getInternal().scale(width, height);
  220.     }
  221.     /**
  222.      * @inheritDoc
  223.      */
  224.     public boolean isAnimation() {
  225.         return false;
  226.     }
  227.     /**
  228.      * @inheritDoc
  229.      */
  230.     public boolean isOpaque() {
  231.         if(opaqueChecked) {
  232.             return opaque;
  233.         }
  234.         opaque = getInternal().isOpaque();
  235.         return opaque;
  236.     }
  237. }