001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package javax.microedition.lcdui;
028:
029: /**
030: * AbstractImageData implementation based
031: * on putpixel graphics library and stores data on Java heap.
032: */
033: final class ImageData implements AbstractImageData {
034:
035: /**
036: * The width, height of this Image
037: */
038: private int width, height;
039:
040: /**
041: * If this Image is mutable.
042: */
043: private boolean isMutable;
044:
045: /**
046: * Image pixel data byte array.
047: * If this is null, use nativePixelData and nativeAlphaData instead.
048: */
049: private byte[] pixelData;
050:
051: /**
052: * Image alpha data byte array.
053: * If pixelData is null, use nativePixelData instead.
054: */
055: private byte[] alphaData;
056:
057: /**
058: * Image native romized pixel data.
059: * Set in native by loadRomizedImage().
060: * Must remain 0 unless pixelData is null.
061: */
062: private int nativePixelData;
063:
064: /**
065: * Image native romized alpha data.
066: * Set in native by loadRomizedImage().
067: * Must remain 0 unless pixelData is null.
068: */
069: private int nativeAlphaData;
070:
071: /**
072: * Constructs empty <code>ImageData </code>.
073: */
074: ImageData() {
075: }
076:
077: /**
078: * Constructs <code>ImageData </code> using passed in width and height.
079: * Alpha array is allocated if allocateAlpha is true.
080: *
081: * @param width The width of the <code>ImageData </code> to be created.
082: * @param height The height of the <code>ImageData </code> to be created.
083: * @param isMutable true to create mutable <code>ImageData</code>,
084: * false to create immutable <code>ImageData</code>
085: * @param clearPixelData if true pixel data whould be set to 0xff for
086: * each pixel
087: * @param allocateAlpha true if alpha data should be allocated,
088: * false - if not.
089: */
090: ImageData(int width, int height, boolean isMutable,
091: boolean clearPixelData, boolean allocateAlpha) {
092:
093: initImageData(width, height, isMutable, allocateAlpha);
094:
095: if (clearPixelData) {
096: for (int i = 0; i < pixelData.length; i++) {
097: pixelData[i] = (byte) 0xFF;
098: }
099: }
100: }
101:
102: /**
103: * Constructs mutable or immutable <code> ImageData </code>
104: * using passed in width, height and pixel data.
105: *
106: * @param width The width of the <code>ImageData </code> to be created.
107: * @param height The height of the <code>ImageData </code> to be created.
108: * @param isMutable true to create mutable <code>ImageData</code>,
109: * false to create immutable <code>ImageData</code>
110: * @param pixelData byte array that contains pixel data for the
111: * <code>ImageData</code>.
112: */
113: ImageData(int width, int height, boolean isMutable, byte[] pixelData) {
114: this .width = width;
115: this .height = height;
116: this .isMutable = isMutable;
117:
118: int length = width * height * 2;
119: byte[] newPixelData = new byte[length];
120: System.arraycopy(pixelData, 0, newPixelData, 0, length);
121:
122: this .pixelData = newPixelData;
123:
124: }
125:
126: /**
127: * Initializes mutable or immutable <code> ImageData </code>
128: * using passed in width, height.
129: * Alpha array is allocated if allocateAlpha is true.
130: *
131: * @param width The width of the <code>ImageData </code> to be created.
132: * @param height The height of the <code>ImageData </code> to be created.
133: * @param isMutable true to create mutable <code>ImageData</code>,
134: * false to create immutable <code>ImageData</code>
135: * @param allocateAlpha true if alpha data should be allocated,
136: * false - if not.
137: */
138: void initImageData(int width, int height, boolean isMutable,
139: boolean allocateAlpha) {
140: this .width = width;
141: this .height = height;
142: this .isMutable = isMutable;
143:
144: pixelData = new byte[width * height * 2];
145:
146: if (allocateAlpha) {
147: alphaData = new byte[width * height];
148: } else {
149: alphaData = null;
150: }
151: }
152:
153: /**
154: * Gets the width of the image in pixels. The value returned
155: * must reflect the actual width of the image when rendered.
156: * @return width of the image
157: */
158: public int getWidth() {
159: return width;
160: }
161:
162: /**
163: * Gets the height of the image in pixels. The value returned
164: * must reflect the actual height of the image when rendered.
165: * @return height of the image
166: */
167: public int getHeight() {
168: return height;
169: }
170:
171: /**
172: * Check if this image is mutable. Mutable images can be modified by
173: * rendering to them through a <code>Graphics</code> object
174: * obtained from the
175: * <code>getGraphics()</code> method of this object.
176: * @return <code>true</code> if the image is mutable,
177: * <code>false</code> otherwise
178: */
179: public boolean isMutable() {
180: return isMutable;
181: }
182:
183: /**
184: * Returns true if <code>ImageData</code> contains alpha data.
185: *
186: * @return true if <code>ImageData</code> contains alpha data.
187: */
188: public boolean hasAlpha() {
189: return (alphaData != null || nativeAlphaData != 0);
190: }
191:
192: /**
193: * Removes alpha data information
194: */
195: public void removeAlpha() {
196: alphaData = null;
197: }
198:
199: /**
200: * Gets pixel data associated with this <code> ImageData</code> instance.
201: * @return byte arra that represents pixel data associated with this
202: * <code>ImageData</code> instance.
203: */
204: byte[] getPixelData() {
205: return pixelData;
206: }
207: }
|