/* * $RCSfile: RgbFile.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistribution in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Sun Microsystems, Inc. or the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * This software is provided "AS IS," without a warranty of any * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or * intended for use in the design, construction, operation or * maintenance of any nuclear facility. * * $Revision: 1.4 $ * $Date: 2007/02/09 17:20:10 $ * $State: Exp $ */ //package com.sun.j3d.loaders.objectfile; import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.io.FileInputStream; import java.io.InputStream; import java.awt.image.BufferedImage; import java.io.IOException; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.ComponentColorModel; import java.awt.image.WritableRaster; import java.awt.color.ColorSpace; import java.awt.Transparency; class RgbFile extends BufferedInputStream { // Header data short dimension; short xSize; short ySize; short zSize; String filename; private static final int DEBUG = 0; short getShort() throws IOException { int t1 = (short) read(); if (t1 == -1) { throw new IOException("Unexpected EOF"); } int t2 = (short) read(); if (t2 == -1) { throw new IOException("Unexpected EOF"); } return (short) ((t1 << 8) | t2); } // End of getShort() byte getByte() throws IOException { int t = read(); if (t == -1) { throw new IOException("Unexpected EOF"); } return (byte) t; } // End of getByte int getInt() throws IOException { int ret = 0; for (int i = 0; i < 4; i++) { int t = read(); if (t == -1) { throw new IOException("Unexpected EOF"); } ret = (ret << 8) | t; } return ret; } // end of getInt public BufferedImage getImage() throws IOException { short magic = getShort(); if (magic != 474) { throw new IOException("Unrecognized file format."); } byte storage = getByte(); if (storage != 0) { throw new IOException("RLE Compressed files not supported"); } byte bpc = getByte(); dimension = getShort(); xSize = getShort(); ySize = getShort(); zSize = getShort(); int pixMin = getInt(); int pixMax = getInt(); skip(84l); int colorMap = getInt(); if ((DEBUG & 1) != 0) { System.out.println(filename + ":"); System.out.println(" bpc = " + bpc); System.out.println(" dimension = " + dimension); System.out.println(" xSize = " + xSize); System.out.println(" ySize = " + ySize); System.out.println(" zSize = " + zSize); System.out.println(" pixMin = " + pixMin); System.out.println(" pixMax = " + pixMax); System.out.println(" colorMap = " + colorMap); } if ((pixMin != 0) || (pixMax != 0xff) || (colorMap != 0) || (bpc != 1)) { throw new IOException("Unsupported options in file"); } skip(404l); ComponentColorModel cm = null; if (zSize == 1) { // Black and White image ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); int[] nBits = {8}; cm = new ComponentColorModel(cs, nBits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); } else if (zSize == 2) { // Black and White image with alpha ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); int[] nBits = {8, 8}; cm = new ComponentColorModel(cs, nBits, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); } else if (zSize == 3) { // RGB Image ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] nBits = {8, 8, 8}; cm = new ComponentColorModel(cs, nBits, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); } else if (zSize == 4) { // RGBA Image ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] nBits = {8, 8, 8, 8}; cm = new ComponentColorModel(cs, nBits, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); } else { throw new IOException("Unsupported options in file"); } WritableRaster r = cm.createCompatibleWritableRaster(xSize, ySize); BufferedImage bi = new BufferedImage(cm, r, false, null); int t; byte image[] = ((DataBufferByte) r.getDataBuffer()).getData(); for (short z = 0; z < zSize; z++) { for (int y = ySize - 1; y >= 0; y--) { for (short x = 0; x < xSize; x++) { t = read(); if (t == -1) { throw new IOException("Unexpected EOF"); } image[y * (xSize * zSize) + (x * zSize) + z] = (byte) t; } } } return bi; } // End of getImage public RgbFile(InputStream s) { super(s); } // End of RgbFile(URL) } // End of class RgbFile // End of file RgbFile.java