001: /*
002: * $RCSfile: TargaReader.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.4 $
041: * $Date: 2007/02/09 17:20:09 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.loaders.lw3d;
046:
047: import java.awt.image.BufferedImage;
048: import java.awt.image.DataBufferInt;
049: import java.applet.Applet;
050: import java.awt.Dimension;
051: import java.awt.Graphics;
052: import java.awt.MediaTracker;
053: import java.awt.Frame;
054: import java.awt.Image;
055: import java.awt.image.MemoryImageSource;
056: import java.awt.Toolkit;
057: import java.io.FileNotFoundException;
058: import java.io.DataInputStream;
059: import java.io.FileInputStream;
060: import java.io.BufferedInputStream;
061: import com.sun.j3d.loaders.IncorrectFormatException;
062: import com.sun.j3d.loaders.ParsingErrorException;
063: import java.io.IOException;
064:
065: /**
066: * This class parses a standard Targa file and retrieves the image stored
067: * therein, storing the pixel data in a BufferedImage.
068: */
069:
070: class TargaReader extends ParserObject {
071:
072: BufferedInputStream bufferedReader;
073: Image theImage = null;
074:
075: /**
076: * Constructor: creates file reader and calls parseFile() to do the real
077: * work
078: */
079: TargaReader(String fileName, int debugVals)
080: throws FileNotFoundException {
081: super (debugVals);
082: debugOutputLn(TRACE, "constructor");
083: bufferedReader = new BufferedInputStream(new DataInputStream(
084: new FileInputStream(fileName)));
085: if (bufferedReader != null)
086: parseFile();
087: }
088:
089: /**
090: * Returns the image that was created from parsing the targa file (null
091: * if the file reading failed)
092: */
093: Image getImage() {
094: return theImage;
095: }
096:
097: /**
098: * This method parses the file and stores the pixel data in a
099: * BufferedImage. The basic file format is:
100: * Byte Description
101: *
102: * 0 Image ID Length
103: * 1 Colormap type
104: * 2 Image Type
105: * 3-4 Colormap spec: 1st entry index
106: * 5-6 Colormap spec: length
107: * 7 Colormap spec: entry size
108: * 8-9 X-origin of lower-left corner
109: * 10-11 Y-origin of lower-left corner
110: * 12-13 Image width
111: * 14-15 Image height
112: * 16 Pixel depth
113: * 17 00(origin)(alpha)
114: * first 2 bytes 0, next 2 starting corner,
115: * last four number of overlay bits per pixel
116: * 18- Image ID
117: * ?? Colormap data
118: * ?? Image Data
119: * ?? Developer Area
120: * ?? Extension Area
121: * ?? File Footer
122: *
123: * We're going to make some assumptions about the format of files we're
124: * asked to load. In particular, we're not going to do any colormpa-based
125: * images: the images need to be either 24-bit or 32-bit true color.
126: * We're also going to ignore vaiours parameters in the header block, since
127: * they complicate life and don't appear to be used in Lightwave image
128: * files. In particular, the following fields will be ignored:
129: * Image ID, colormap info, xy origins, and alpha/overlay bits.
130: */
131:
132: void parseFile() throws IncorrectFormatException,
133: ParsingErrorException {
134: try {
135: int idLength = bufferedReader.read();
136: int colormapPresent = bufferedReader.read();
137: int imageType = bufferedReader.read();
138: bufferedReader.skip(9); // skipping camp and xy origin data
139: int width = bufferedReader.read()
140: | bufferedReader.read() << 8;
141: int height = bufferedReader.read()
142: | bufferedReader.read() << 8;
143: int depth = bufferedReader.read();
144: int flags = bufferedReader.read();
145: boolean bottomToTop = ((flags & 0x20) == 0);
146: boolean leftToRight = ((flags & 0x10) == 0);
147: bufferedReader.skip(idLength);
148:
149: // Check on the file parameters to see whether we should punt
150: if ((colormapPresent == 1) || imageType != 2
151: || (depth != 24 && depth != 32)) {
152: // Punt
153: throw new IncorrectFormatException(
154: "This format is not readable by the Lightwave "
155: + "loader. Only 24- or 32-bit true-color "
156: + "uncompressed Targa images will work");
157: }
158:
159: // Image format must be okay for us to read
160: BufferedImage bImage = new BufferedImage(width, height,
161: BufferedImage.TYPE_INT_ARGB);
162: int[] imageBits = ((DataBufferInt) bImage.getRaster()
163: .getDataBuffer()).getData();
164:
165: int row;
166: int column;
167:
168: for (int i = 0; i < height; ++i) {
169: if (bottomToTop)
170: row = (height - i - 1);
171: else
172: row = i;
173: for (int j = 0; j < width; ++j) {
174:
175: if (leftToRight)
176: column = j;
177: else
178: column = (width - j - 1);
179:
180: int blue = bufferedReader.read();
181: int green = bufferedReader.read();
182: int red = bufferedReader.read();
183: int alpha = 0xff;
184: if (depth == 32)
185: alpha = bufferedReader.read();
186: imageBits[row * width + column] = alpha << 24
187: | red << 16 | green << 8 | blue;
188: }
189: }
190: theImage = bImage;
191: } catch (IOException e) {
192: throw new ParsingErrorException(e.getMessage());
193: }
194: }
195:
196: }
|