Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 46955 invoked from network); 10 Sep 2010 16:35:31 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 10 Sep 2010 16:35:31 -0000 Received: (qmail 97562 invoked by uid 500); 10 Sep 2010 16:35:31 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 97131 invoked by uid 500); 10 Sep 2010 16:35:30 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 97075 invoked by uid 99); 10 Sep 2010 16:35:30 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Sep 2010 16:35:30 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Sep 2010 16:35:25 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id F1AEF2388BEC; Fri, 10 Sep 2010 16:33:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r995859 [8/30] - in /commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan: ./ color/ common/ common/byteSources/ common/mylzw/ formats/bmp/ formats/bmp/pixelparsers/ formats/bmp/writers/ formats/gif/ formats/ico/ formats/jpeg/ fo... Date: Fri, 10 Sep 2010 16:33:42 -0000 To: commits@commons.apache.org From: sebb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100910163455.F1AEF2388BEC@eris.apache.org> Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/BmpImageParser.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/BmpImageParser.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/BmpImageParser.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/BmpImageParser.java Fri Sep 10 16:33:35 2010 @@ -52,670 +52,670 @@ import org.apache.sanselan.util.ParamMap public class BmpImageParser extends ImageParser { - public BmpImageParser() - { - super.setByteOrder(BYTE_ORDER_INTEL); - } - - public String getName() - { - return "Bmp-Custom"; - } - - public String getDefaultExtension() - { - return DEFAULT_EXTENSION; - } - - private static final String DEFAULT_EXTENSION = ".bmp"; - - private static final String ACCEPTED_EXTENSIONS[] = { DEFAULT_EXTENSION, }; - - protected String[] getAcceptedExtensions() - { - return ACCEPTED_EXTENSIONS; - } - - protected ImageFormat[] getAcceptedTypes() - { - return new ImageFormat[] { ImageFormat.IMAGE_FORMAT_BMP, // - }; - } - - private static final byte BMP_HEADER_SIGNATURE[] = { 0x42, 0x4d, }; - - private BmpHeaderInfo readBmpHeaderInfo(InputStream is, - FormatCompliance formatCompliance, boolean verbose) - throws ImageReadException, IOException - { - byte identifier1 = readByte("Identifier1", is, "Not a Valid BMP File"); - byte identifier2 = readByte("Identifier2", is, "Not a Valid BMP File"); - - if (formatCompliance != null) - { - formatCompliance.compare_bytes("Signature", BMP_HEADER_SIGNATURE, - new byte[] { identifier1, identifier2, }); - } - - int fileSize = read4Bytes("File Size", is, "Not a Valid BMP File"); - int reserved = read4Bytes("Reserved", is, "Not a Valid BMP File"); - int bitmapDataOffset = read4Bytes("Bitmap Data Offset", is, - "Not a Valid BMP File"); - - int bitmapHeaderSize = read4Bytes("Bitmap Header Size", is, - "Not a Valid BMP File"); - int width = read4Bytes("Width", is, "Not a Valid BMP File"); - int height = read4Bytes("Height", is, "Not a Valid BMP File"); - int planes = read2Bytes("Planes", is, "Not a Valid BMP File"); - int bitsPerPixel = read2Bytes("Bits Per Pixel", is, - "Not a Valid BMP File"); - int compression = read4Bytes("Compression", is, "Not a Valid BMP File"); - int bitmapDataSize = read4Bytes("Bitmap Data Size", is, - "Not a Valid BMP File"); - int hResolution = read4Bytes("HResolution", is, "Not a Valid BMP File"); - int vResolution = read4Bytes("VResolution", is, "Not a Valid BMP File"); - int colorsUsed = read4Bytes("ColorsUsed", is, "Not a Valid BMP File"); - int colorsImportant = read4Bytes("ColorsImportant", is, - "Not a Valid BMP File"); - - if (verbose) - { - this.debugNumber("identifier1", identifier1, 1); - this.debugNumber("identifier2", identifier2, 1); - this.debugNumber("fileSize", fileSize, 4); - this.debugNumber("reserved", reserved, 4); - this.debugNumber("bitmapDataOffset", bitmapDataOffset, 4); - this.debugNumber("bitmapHeaderSize", bitmapHeaderSize, 4); - this.debugNumber("width", width, 4); - this.debugNumber("height", height, 4); - this.debugNumber("planes", planes, 2); - this.debugNumber("bitsPerPixel", bitsPerPixel, 2); - this.debugNumber("compression", compression, 4); - this.debugNumber("bitmapDataSize", bitmapDataSize, 4); - this.debugNumber("hResolution", hResolution, 4); - this.debugNumber("vResolution", vResolution, 4); - this.debugNumber("colorsUsed", colorsUsed, 4); - this.debugNumber("colorsImportant", colorsImportant, 4); - } - - BmpHeaderInfo result = new BmpHeaderInfo(identifier1, identifier2, - fileSize, reserved, bitmapDataOffset, bitmapHeaderSize, width, - height, planes, bitsPerPixel, compression, bitmapDataSize, - hResolution, vResolution, colorsUsed, colorsImportant); - return result; - } - - private static final int BI_RGB = 0; - private static final int BI_RLE4 = 2; - private static final int BI_RLE8 = 1; - private static final int BI_BITFIELDS = 3; - - private byte[] getRLEBytes(InputStream is, int RLESamplesPerByte) - throws ImageReadException, IOException - { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - // this.setDebug(true); - - boolean done = false; - while (!done) - { - int a = 0xff & this.readByte("RLE a", is, "BMP: Bad RLE"); - baos.write(a); - int b = 0xff & this.readByte("RLE b", is, "BMP: Bad RLE"); - baos.write(b); - - if (a == 0) - { - switch (b) - { - case 0: // EOL - break; - case 1: // EOF - // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - // ); - done = true; - break; - case 2: { - // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - // ); - int c = 0xff & this.readByte("RLE c", is, "BMP: Bad RLE"); - baos.write(c); - int d = 0xff & this.readByte("RLE d", is, "BMP: Bad RLE"); - baos.write(d); - - } - break; - default: { - int size = b / RLESamplesPerByte; - if ((b % RLESamplesPerByte) > 0) - size++; - if ((size % 2) != 0) - size++; - - // System.out.println("b: " + b); - // System.out.println("size: " + size); - // System.out.println("RLESamplesPerByte: " + - // RLESamplesPerByte); - // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - // ); - byte bytes[] = this.readByteArray("bytes", size, is, - "RLE: Absolute Mode"); - baos.write(bytes); - } - break; - } - } - } - - return baos.toByteArray(); - } - - private ImageContents readImageContents(InputStream is, - FormatCompliance formatCompliance, boolean verbose) - throws ImageReadException, IOException - { - BmpHeaderInfo bhi = readBmpHeaderInfo(is, formatCompliance, verbose); - - int colorTableSize = bhi.colorsUsed; - if (colorTableSize == 0) - colorTableSize = (1 << bhi.bitsPerPixel); - - if (verbose) - { - this.debugNumber("ColorsUsed", bhi.colorsUsed, 4); - this.debugNumber("BitsPerPixel", bhi.bitsPerPixel, 4); - this.debugNumber("ColorTableSize", colorTableSize, 4); - this.debugNumber("bhi.colorsUsed", bhi.colorsUsed, 4); - this.debugNumber("Compression", bhi.compression, 4); - } - - int paletteLength; - int rleSamplesPerByte = 0; - boolean rle = false; - - switch (bhi.compression) - { - case BI_RGB: - if (verbose) - System.out.println("Compression: BI_RGB"); - if (bhi.bitsPerPixel <= 8) - paletteLength = 4 * colorTableSize; - else - paletteLength = 0; - // BytesPerPaletteEntry = 0; - // System.out.println("Compression: BI_RGBx2: " + bhi.BitsPerPixel); - // System.out.println("Compression: BI_RGBx2: " + (bhi.BitsPerPixel - // <= 16)); - break; - - case BI_RLE4: - if (verbose) - System.out.println("Compression: BI_RLE4"); - paletteLength = 4 * colorTableSize; - rleSamplesPerByte = 2; - // ExtraBitsPerPixel = 4; - rle = true; - // // BytesPerPixel = 2; - // // BytesPerPaletteEntry = 0; - break; - // - case BI_RLE8: - if (verbose) - System.out.println("Compression: BI_RLE8"); - paletteLength = 4 * colorTableSize; - rleSamplesPerByte = 1; - // ExtraBitsPerPixel = 8; - rle = true; - // BytesPerPixel = 2; - // BytesPerPaletteEntry = 0; - break; - // - case BI_BITFIELDS: - if (verbose) - System.out.println("Compression: BI_BITFIELDS"); - paletteLength = 3 * 4; // TODO: is this right? are the masks always - // LONGs? - // BytesPerPixel = 2; - // BytesPerPaletteEntry = 4; - break; - - default: - throw new ImageReadException("BMP: Unknown Compression: " - + bhi.compression); - } - - byte colorTable[] = null; - if (paletteLength > 0) - colorTable = this.readByteArray("ColorTable", paletteLength, is, - "Not a Valid BMP File"); - - if (verbose) - { - this.debugNumber("paletteLength", paletteLength, 4); - System.out.println("ColorTable: " - + ((colorTable == null) ? "null" : "" + colorTable.length)); - } - - int pixelCount = bhi.width * bhi.height; - - int imageLineLength = ((((bhi.bitsPerPixel) * bhi.width) + 7) / 8); - - if (verbose) - { - // this.debugNumber("Total BitsPerPixel", - // (ExtraBitsPerPixel + bhi.BitsPerPixel), 4); - // this.debugNumber("Total Bit Per Line", - // ((ExtraBitsPerPixel + bhi.BitsPerPixel) * bhi.Width), 4); - // this.debugNumber("ExtraBitsPerPixel", ExtraBitsPerPixel, 4); - this.debugNumber("bhi.Width", bhi.width, 4); - this.debugNumber("bhi.Height", bhi.height, 4); - this.debugNumber("ImageLineLength", imageLineLength, 4); - // this.debugNumber("imageDataSize", imageDataSize, 4); - this.debugNumber("PixelCount", pixelCount, 4); - } - // int ImageLineLength = BytesPerPixel * bhi.Width; - while ((imageLineLength % 4) != 0) - imageLineLength++; - - final int headerSize = BITMAP_FILE_HEADER_SIZE - + BITMAP_INFO_HEADER_SIZE; - int expectedDataOffset = headerSize + paletteLength; - - if (verbose) - { - this.debugNumber("bhi.BitmapDataOffset", bhi.bitmapDataOffset, 4); - this.debugNumber("expectedDataOffset", expectedDataOffset, 4); - } - int extraBytes = bhi.bitmapDataOffset - expectedDataOffset; - if (extraBytes < 0) - throw new ImageReadException("BMP has invalid image data offset: " - + bhi.bitmapDataOffset + " (expected: " - + expectedDataOffset + ", paletteLength: " + paletteLength - + ", headerSize: " + headerSize + ")"); - else if (extraBytes > 0) - this.readByteArray("BitmapDataOffset", extraBytes, is, - "Not a Valid BMP File"); - - int imageDataSize = bhi.height * imageLineLength; - - if (verbose) - this.debugNumber("imageDataSize", imageDataSize, 4); - - byte imageData[]; - if (rle) - imageData = getRLEBytes(is, rleSamplesPerByte); - else - imageData = this.readByteArray("ImageData", imageDataSize, is, - "Not a Valid BMP File"); - - if (verbose) - this.debugNumber("ImageData.length", imageData.length, 4); - - PixelParser pixelParser; - - switch (bhi.compression) - { - case BI_RLE4: - case BI_RLE8: - pixelParser = new PixelParserRle(bhi, colorTable, imageData); - break; - case BI_RGB: - pixelParser = new PixelParserRgb(bhi, colorTable, imageData); - break; - case BI_BITFIELDS: - pixelParser = new PixelParserBitFields(bhi, colorTable, imageData); - break; - default: - throw new ImageReadException("BMP: Unknown Compression: " - + bhi.compression); - } - - return new ImageContents(bhi, colorTable, imageData, pixelParser); - } - - private BmpHeaderInfo readBmpHeaderInfo(ByteSource byteSource, - boolean verbose) throws ImageReadException, IOException - { - InputStream is = null; - try - { - is = byteSource.getInputStream(); - - // readSignature(is); - return readBmpHeaderInfo(is, null, verbose); - } finally - { - try - { - if (is != null) { - is.close(); - } - } catch (Exception e) - { - Debug.debug(e); - } - - } - } - - public byte[] getICCProfileBytes(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - return null; - } - - public Dimension getImageSize(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - // make copy of params; we'll clear keys as we consume them. - params = (params == null) ? new HashMap() : new HashMap(params); - - boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, - false); - - if (params.containsKey(PARAM_KEY_VERBOSE)) - params.remove(PARAM_KEY_VERBOSE); - - if (params.size() > 0) - { - Object firstKey = params.keySet().iterator().next(); - throw new ImageReadException("Unknown parameter: " + firstKey); - } - - BmpHeaderInfo bhi = readBmpHeaderInfo(byteSource, verbose); - - if (bhi == null) - throw new ImageReadException("BMP: couldn't read header"); - - return new Dimension(bhi.width, bhi.height); - - } - - public byte[] embedICCProfile(byte image[], byte profile[]) - { - return null; - } - - public boolean embedICCProfile(File src, File dst, byte profile[]) - { - return false; - } - - public IImageMetadata getMetadata(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - return null; - } - - private String getBmpTypeDescription(int Identifier1, int Identifier2) - { - if ((Identifier1 == 'B') && (Identifier2 == 'M')) - return "Windows 3.1x, 95, NT,"; - if ((Identifier1 == 'B') && (Identifier2 == 'A')) - return "OS/2 Bitmap Array"; - if ((Identifier1 == 'C') && (Identifier2 == 'I')) - return "OS/2 Color Icon"; - if ((Identifier1 == 'C') && (Identifier2 == 'P')) - return "OS/2 Color Pointer"; - if ((Identifier1 == 'I') && (Identifier2 == 'C')) - return "OS/2 Icon"; - if ((Identifier1 == 'P') && (Identifier2 == 'T')) - return "OS/2 Pointer"; - - return "Unknown"; - } - - public ImageInfo getImageInfo(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - // make copy of params; we'll clear keys as we consume them. - params = (params == null) ? new HashMap() : new HashMap(params); - - boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, - false); - - if (params.containsKey(PARAM_KEY_VERBOSE)) - params.remove(PARAM_KEY_VERBOSE); - - if (params.size() > 0) - { - Object firstKey = params.keySet().iterator().next(); - throw new ImageReadException("Unknown parameter: " + firstKey); - } - - ImageContents ic = readImageContents(byteSource.getInputStream(), - FormatCompliance.getDefault(), verbose); - - if (ic == null) - throw new ImageReadException("Couldn't read BMP Data"); - - BmpHeaderInfo bhi = ic.bhi; - byte colorTable[] = ic.colorTable; - - if (bhi == null) - throw new ImageReadException("BMP: couldn't read header"); - - int height = bhi.height; - int width = bhi.width; - - ArrayList comments = new ArrayList(); - // TODO: comments... - - int bitsPerPixel = bhi.bitsPerPixel; - ImageFormat format = ImageFormat.IMAGE_FORMAT_BMP; - String name = "BMP Windows Bitmap"; - String mimeType = "image/x-ms-bmp"; - // we ought to count images, but don't yet. - int numberOfImages = -1; - // not accurate ... only reflects first - boolean isProgressive = false; - // boolean isProgressive = (fPNGChunkIHDR.InterlaceMethod != 0); - // - // pixels per meter - int physicalWidthDpi = (int) (bhi.hResolution * 1000.0 / 2.54); - float physicalWidthInch = (float) ((double) width / (double) physicalWidthDpi); - // int physicalHeightDpi = 72; - int physicalHeightDpi = (int) (bhi.vResolution * 1000.0 / 2.54); - float physicalHeightInch = (float) ((double) height / (double) physicalHeightDpi); - - String formatDetails = "Bmp (" + (char) bhi.identifier1 - + (char) bhi.identifier2 + ": " - + getBmpTypeDescription(bhi.identifier1, bhi.identifier2) + ")"; - - boolean isTransparent = false; - - boolean usesPalette = colorTable != null; - int colorType = ImageInfo.COLOR_TYPE_RGB; - String compressionAlgorithm = ImageInfo.COMPRESSION_ALGORITHM_RLE; - - ImageInfo result = new ImageInfo(formatDetails, bitsPerPixel, comments, - format, name, height, mimeType, numberOfImages, - physicalHeightDpi, physicalHeightInch, physicalWidthDpi, - physicalWidthInch, width, isProgressive, isTransparent, - usesPalette, colorType, compressionAlgorithm); - - return result; - } - - public boolean dumpImageFile(PrintWriter pw, ByteSource byteSource) - throws ImageReadException, IOException - { - pw.println("bmp.dumpImageFile"); - - ImageInfo imageData = getImageInfo(byteSource, null); - if (imageData == null) - return false; - - imageData.toString(pw, ""); - - pw.println(""); - - return true; - } - - public FormatCompliance getFormatCompliance(ByteSource byteSource) - throws ImageReadException, IOException - { - boolean verbose = false; - - FormatCompliance result = new FormatCompliance(byteSource - .getDescription()); - - readImageContents(byteSource.getInputStream(), result, verbose); - - return result; - } - - public BufferedImage getBufferedImage(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - return getBufferedImage(byteSource.getInputStream(), params); - } - - public BufferedImage getBufferedImage(InputStream inputStream, Map params) - throws ImageReadException, IOException - { - // make copy of params; we'll clear keys as we consume them. - params = (params == null) ? new HashMap() : new HashMap(params); - - boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, - false); - - if (params.containsKey(PARAM_KEY_VERBOSE)) - params.remove(PARAM_KEY_VERBOSE); - if (params.containsKey(BUFFERED_IMAGE_FACTORY)) - params.remove(BUFFERED_IMAGE_FACTORY); - - if (params.size() > 0) - { - Object firstKey = params.keySet().iterator().next(); - throw new ImageReadException("Unknown parameter: " + firstKey); - } - - ImageContents ic = readImageContents(inputStream, - FormatCompliance.getDefault(), verbose); - if (ic == null) - throw new ImageReadException("Couldn't read BMP Data"); - - BmpHeaderInfo bhi = ic.bhi; - // byte colorTable[] = ic.colorTable; - // byte imageData[] = ic.imageData; - - int width = bhi.width; - int height = bhi.height; - - boolean hasAlpha = false; - BufferedImage result = getBufferedImageFactory(params) - .getColorBufferedImage(width, height, hasAlpha); - - if (verbose) - { - System.out.println("width: " + width); - System.out.println("height: " + height); - System.out.println("width*height: " + width * height); - System.out.println("width*height*4: " + width * height * 4); - } - - PixelParser pixelParser = ic.pixelParser; - - pixelParser.processImage(result); - - return result; - - } - - private static final int BITMAP_FILE_HEADER_SIZE = 14; - private static final int BITMAP_INFO_HEADER_SIZE = 40; - - public void writeImage(BufferedImage src, OutputStream os, Map params) - throws ImageWriteException, IOException - { - // make copy of params; we'll clear keys as we consume them. - params = (params == null) ? new HashMap() : new HashMap(params); - - // clear format key. - if (params.containsKey(PARAM_KEY_FORMAT)) - params.remove(PARAM_KEY_FORMAT); - - if (params.size() > 0) - { - Object firstKey = params.keySet().iterator().next(); - throw new ImageWriteException("Unknown parameter: " + firstKey); - } - - final SimplePalette palette = new PaletteFactory().makePaletteSimple( - src, 256); - - BMPWriter writer = null; - if (palette == null) - writer = new BMPWriterRGB(); - else - writer = new BMPWriterPalette(palette); - - byte imagedata[] = writer.getImageData(src); - BinaryOutputStream bos = new BinaryOutputStream(os, BYTE_ORDER_INTEL); - - { - // write BitmapFileHeader - os.write(0x42); // B, Windows 3.1x, 95, NT, Bitmap - os.write(0x4d); // M - - int filesize = BITMAP_FILE_HEADER_SIZE + BITMAP_INFO_HEADER_SIZE + // header - // size - 4 * writer.getPaletteSize() + // palette size in bytes - imagedata.length; - bos.write4Bytes(filesize); - - bos.write4Bytes(0); // reserved - bos.write4Bytes(BITMAP_FILE_HEADER_SIZE + BITMAP_INFO_HEADER_SIZE - + 4 * writer.getPaletteSize()); // Bitmap Data Offset - } - - int width = src.getWidth(); - int height = src.getHeight(); - - { // write BitmapInfoHeader - bos.write4Bytes(BITMAP_INFO_HEADER_SIZE); // Bitmap Info Header Size - bos.write4Bytes(width); // width - bos.write4Bytes(height); // height - bos.write2Bytes(1); // Number of Planes - bos.write2Bytes(writer.getBitsPerPixel()); // Bits Per Pixel - - bos.write4Bytes(BI_RGB); // Compression - bos.write4Bytes(imagedata.length); // Bitmap Data Size - bos.write4Bytes(0); // HResolution - bos.write4Bytes(0); // VResolution - if (palette == null) - bos.write4Bytes(0); // Colors - else - bos.write4Bytes(palette.length()); // Colors - bos.write4Bytes(0); // Important Colors - // bos.write_4_bytes(0); // Compression - } - - { // write Palette - writer.writePalette(bos); - } - { // write Image Data - bos.writeByteArray(imagedata); - } - } - - /** - * Extracts embedded XML metadata as XML string. - *

- * - * @param byteSource - * File containing image data. - * @param params - * Map of optional parameters, defined in SanselanConstants. - * @return Xmp Xml as String, if present. Otherwise, returns null. - */ - public String getXmpXml(ByteSource byteSource, Map params) - throws ImageReadException, IOException - { - return null; - } + public BmpImageParser() + { + super.setByteOrder(BYTE_ORDER_INTEL); + } + + public String getName() + { + return "Bmp-Custom"; + } + + public String getDefaultExtension() + { + return DEFAULT_EXTENSION; + } + + private static final String DEFAULT_EXTENSION = ".bmp"; + + private static final String ACCEPTED_EXTENSIONS[] = { DEFAULT_EXTENSION, }; + + protected String[] getAcceptedExtensions() + { + return ACCEPTED_EXTENSIONS; + } + + protected ImageFormat[] getAcceptedTypes() + { + return new ImageFormat[] { ImageFormat.IMAGE_FORMAT_BMP, // + }; + } + + private static final byte BMP_HEADER_SIGNATURE[] = { 0x42, 0x4d, }; + + private BmpHeaderInfo readBmpHeaderInfo(InputStream is, + FormatCompliance formatCompliance, boolean verbose) + throws ImageReadException, IOException + { + byte identifier1 = readByte("Identifier1", is, "Not a Valid BMP File"); + byte identifier2 = readByte("Identifier2", is, "Not a Valid BMP File"); + + if (formatCompliance != null) + { + formatCompliance.compare_bytes("Signature", BMP_HEADER_SIGNATURE, + new byte[] { identifier1, identifier2, }); + } + + int fileSize = read4Bytes("File Size", is, "Not a Valid BMP File"); + int reserved = read4Bytes("Reserved", is, "Not a Valid BMP File"); + int bitmapDataOffset = read4Bytes("Bitmap Data Offset", is, + "Not a Valid BMP File"); + + int bitmapHeaderSize = read4Bytes("Bitmap Header Size", is, + "Not a Valid BMP File"); + int width = read4Bytes("Width", is, "Not a Valid BMP File"); + int height = read4Bytes("Height", is, "Not a Valid BMP File"); + int planes = read2Bytes("Planes", is, "Not a Valid BMP File"); + int bitsPerPixel = read2Bytes("Bits Per Pixel", is, + "Not a Valid BMP File"); + int compression = read4Bytes("Compression", is, "Not a Valid BMP File"); + int bitmapDataSize = read4Bytes("Bitmap Data Size", is, + "Not a Valid BMP File"); + int hResolution = read4Bytes("HResolution", is, "Not a Valid BMP File"); + int vResolution = read4Bytes("VResolution", is, "Not a Valid BMP File"); + int colorsUsed = read4Bytes("ColorsUsed", is, "Not a Valid BMP File"); + int colorsImportant = read4Bytes("ColorsImportant", is, + "Not a Valid BMP File"); + + if (verbose) + { + this.debugNumber("identifier1", identifier1, 1); + this.debugNumber("identifier2", identifier2, 1); + this.debugNumber("fileSize", fileSize, 4); + this.debugNumber("reserved", reserved, 4); + this.debugNumber("bitmapDataOffset", bitmapDataOffset, 4); + this.debugNumber("bitmapHeaderSize", bitmapHeaderSize, 4); + this.debugNumber("width", width, 4); + this.debugNumber("height", height, 4); + this.debugNumber("planes", planes, 2); + this.debugNumber("bitsPerPixel", bitsPerPixel, 2); + this.debugNumber("compression", compression, 4); + this.debugNumber("bitmapDataSize", bitmapDataSize, 4); + this.debugNumber("hResolution", hResolution, 4); + this.debugNumber("vResolution", vResolution, 4); + this.debugNumber("colorsUsed", colorsUsed, 4); + this.debugNumber("colorsImportant", colorsImportant, 4); + } + + BmpHeaderInfo result = new BmpHeaderInfo(identifier1, identifier2, + fileSize, reserved, bitmapDataOffset, bitmapHeaderSize, width, + height, planes, bitsPerPixel, compression, bitmapDataSize, + hResolution, vResolution, colorsUsed, colorsImportant); + return result; + } + + private static final int BI_RGB = 0; + private static final int BI_RLE4 = 2; + private static final int BI_RLE8 = 1; + private static final int BI_BITFIELDS = 3; + + private byte[] getRLEBytes(InputStream is, int RLESamplesPerByte) + throws ImageReadException, IOException + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // this.setDebug(true); + + boolean done = false; + while (!done) + { + int a = 0xff & this.readByte("RLE a", is, "BMP: Bad RLE"); + baos.write(a); + int b = 0xff & this.readByte("RLE b", is, "BMP: Bad RLE"); + baos.write(b); + + if (a == 0) + { + switch (b) + { + case 0: // EOL + break; + case 1: // EOF + // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + // ); + done = true; + break; + case 2: { + // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + // ); + int c = 0xff & this.readByte("RLE c", is, "BMP: Bad RLE"); + baos.write(c); + int d = 0xff & this.readByte("RLE d", is, "BMP: Bad RLE"); + baos.write(d); + + } + break; + default: { + int size = b / RLESamplesPerByte; + if ((b % RLESamplesPerByte) > 0) + size++; + if ((size % 2) != 0) + size++; + + // System.out.println("b: " + b); + // System.out.println("size: " + size); + // System.out.println("RLESamplesPerByte: " + + // RLESamplesPerByte); + // System.out.println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + // ); + byte bytes[] = this.readByteArray("bytes", size, is, + "RLE: Absolute Mode"); + baos.write(bytes); + } + break; + } + } + } + + return baos.toByteArray(); + } + + private ImageContents readImageContents(InputStream is, + FormatCompliance formatCompliance, boolean verbose) + throws ImageReadException, IOException + { + BmpHeaderInfo bhi = readBmpHeaderInfo(is, formatCompliance, verbose); + + int colorTableSize = bhi.colorsUsed; + if (colorTableSize == 0) + colorTableSize = (1 << bhi.bitsPerPixel); + + if (verbose) + { + this.debugNumber("ColorsUsed", bhi.colorsUsed, 4); + this.debugNumber("BitsPerPixel", bhi.bitsPerPixel, 4); + this.debugNumber("ColorTableSize", colorTableSize, 4); + this.debugNumber("bhi.colorsUsed", bhi.colorsUsed, 4); + this.debugNumber("Compression", bhi.compression, 4); + } + + int paletteLength; + int rleSamplesPerByte = 0; + boolean rle = false; + + switch (bhi.compression) + { + case BI_RGB: + if (verbose) + System.out.println("Compression: BI_RGB"); + if (bhi.bitsPerPixel <= 8) + paletteLength = 4 * colorTableSize; + else + paletteLength = 0; + // BytesPerPaletteEntry = 0; + // System.out.println("Compression: BI_RGBx2: " + bhi.BitsPerPixel); + // System.out.println("Compression: BI_RGBx2: " + (bhi.BitsPerPixel + // <= 16)); + break; + + case BI_RLE4: + if (verbose) + System.out.println("Compression: BI_RLE4"); + paletteLength = 4 * colorTableSize; + rleSamplesPerByte = 2; + // ExtraBitsPerPixel = 4; + rle = true; + // // BytesPerPixel = 2; + // // BytesPerPaletteEntry = 0; + break; + // + case BI_RLE8: + if (verbose) + System.out.println("Compression: BI_RLE8"); + paletteLength = 4 * colorTableSize; + rleSamplesPerByte = 1; + // ExtraBitsPerPixel = 8; + rle = true; + // BytesPerPixel = 2; + // BytesPerPaletteEntry = 0; + break; + // + case BI_BITFIELDS: + if (verbose) + System.out.println("Compression: BI_BITFIELDS"); + paletteLength = 3 * 4; // TODO: is this right? are the masks always + // LONGs? + // BytesPerPixel = 2; + // BytesPerPaletteEntry = 4; + break; + + default: + throw new ImageReadException("BMP: Unknown Compression: " + + bhi.compression); + } + + byte colorTable[] = null; + if (paletteLength > 0) + colorTable = this.readByteArray("ColorTable", paletteLength, is, + "Not a Valid BMP File"); + + if (verbose) + { + this.debugNumber("paletteLength", paletteLength, 4); + System.out.println("ColorTable: " + + ((colorTable == null) ? "null" : "" + colorTable.length)); + } + + int pixelCount = bhi.width * bhi.height; + + int imageLineLength = ((((bhi.bitsPerPixel) * bhi.width) + 7) / 8); + + if (verbose) + { + // this.debugNumber("Total BitsPerPixel", + // (ExtraBitsPerPixel + bhi.BitsPerPixel), 4); + // this.debugNumber("Total Bit Per Line", + // ((ExtraBitsPerPixel + bhi.BitsPerPixel) * bhi.Width), 4); + // this.debugNumber("ExtraBitsPerPixel", ExtraBitsPerPixel, 4); + this.debugNumber("bhi.Width", bhi.width, 4); + this.debugNumber("bhi.Height", bhi.height, 4); + this.debugNumber("ImageLineLength", imageLineLength, 4); + // this.debugNumber("imageDataSize", imageDataSize, 4); + this.debugNumber("PixelCount", pixelCount, 4); + } + // int ImageLineLength = BytesPerPixel * bhi.Width; + while ((imageLineLength % 4) != 0) + imageLineLength++; + + final int headerSize = BITMAP_FILE_HEADER_SIZE + + BITMAP_INFO_HEADER_SIZE; + int expectedDataOffset = headerSize + paletteLength; + + if (verbose) + { + this.debugNumber("bhi.BitmapDataOffset", bhi.bitmapDataOffset, 4); + this.debugNumber("expectedDataOffset", expectedDataOffset, 4); + } + int extraBytes = bhi.bitmapDataOffset - expectedDataOffset; + if (extraBytes < 0) + throw new ImageReadException("BMP has invalid image data offset: " + + bhi.bitmapDataOffset + " (expected: " + + expectedDataOffset + ", paletteLength: " + paletteLength + + ", headerSize: " + headerSize + ")"); + else if (extraBytes > 0) + this.readByteArray("BitmapDataOffset", extraBytes, is, + "Not a Valid BMP File"); + + int imageDataSize = bhi.height * imageLineLength; + + if (verbose) + this.debugNumber("imageDataSize", imageDataSize, 4); + + byte imageData[]; + if (rle) + imageData = getRLEBytes(is, rleSamplesPerByte); + else + imageData = this.readByteArray("ImageData", imageDataSize, is, + "Not a Valid BMP File"); + + if (verbose) + this.debugNumber("ImageData.length", imageData.length, 4); + + PixelParser pixelParser; + + switch (bhi.compression) + { + case BI_RLE4: + case BI_RLE8: + pixelParser = new PixelParserRle(bhi, colorTable, imageData); + break; + case BI_RGB: + pixelParser = new PixelParserRgb(bhi, colorTable, imageData); + break; + case BI_BITFIELDS: + pixelParser = new PixelParserBitFields(bhi, colorTable, imageData); + break; + default: + throw new ImageReadException("BMP: Unknown Compression: " + + bhi.compression); + } + + return new ImageContents(bhi, colorTable, imageData, pixelParser); + } + + private BmpHeaderInfo readBmpHeaderInfo(ByteSource byteSource, + boolean verbose) throws ImageReadException, IOException + { + InputStream is = null; + try + { + is = byteSource.getInputStream(); + + // readSignature(is); + return readBmpHeaderInfo(is, null, verbose); + } finally + { + try + { + if (is != null) { + is.close(); + } + } catch (Exception e) + { + Debug.debug(e); + } + + } + } + + public byte[] getICCProfileBytes(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + return null; + } + + public Dimension getImageSize(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + // make copy of params; we'll clear keys as we consume them. + params = (params == null) ? new HashMap() : new HashMap(params); + + boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, + false); + + if (params.containsKey(PARAM_KEY_VERBOSE)) + params.remove(PARAM_KEY_VERBOSE); + + if (params.size() > 0) + { + Object firstKey = params.keySet().iterator().next(); + throw new ImageReadException("Unknown parameter: " + firstKey); + } + + BmpHeaderInfo bhi = readBmpHeaderInfo(byteSource, verbose); + + if (bhi == null) + throw new ImageReadException("BMP: couldn't read header"); + + return new Dimension(bhi.width, bhi.height); + + } + + public byte[] embedICCProfile(byte image[], byte profile[]) + { + return null; + } + + public boolean embedICCProfile(File src, File dst, byte profile[]) + { + return false; + } + + public IImageMetadata getMetadata(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + return null; + } + + private String getBmpTypeDescription(int Identifier1, int Identifier2) + { + if ((Identifier1 == 'B') && (Identifier2 == 'M')) + return "Windows 3.1x, 95, NT,"; + if ((Identifier1 == 'B') && (Identifier2 == 'A')) + return "OS/2 Bitmap Array"; + if ((Identifier1 == 'C') && (Identifier2 == 'I')) + return "OS/2 Color Icon"; + if ((Identifier1 == 'C') && (Identifier2 == 'P')) + return "OS/2 Color Pointer"; + if ((Identifier1 == 'I') && (Identifier2 == 'C')) + return "OS/2 Icon"; + if ((Identifier1 == 'P') && (Identifier2 == 'T')) + return "OS/2 Pointer"; + + return "Unknown"; + } + + public ImageInfo getImageInfo(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + // make copy of params; we'll clear keys as we consume them. + params = (params == null) ? new HashMap() : new HashMap(params); + + boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, + false); + + if (params.containsKey(PARAM_KEY_VERBOSE)) + params.remove(PARAM_KEY_VERBOSE); + + if (params.size() > 0) + { + Object firstKey = params.keySet().iterator().next(); + throw new ImageReadException("Unknown parameter: " + firstKey); + } + + ImageContents ic = readImageContents(byteSource.getInputStream(), + FormatCompliance.getDefault(), verbose); + + if (ic == null) + throw new ImageReadException("Couldn't read BMP Data"); + + BmpHeaderInfo bhi = ic.bhi; + byte colorTable[] = ic.colorTable; + + if (bhi == null) + throw new ImageReadException("BMP: couldn't read header"); + + int height = bhi.height; + int width = bhi.width; + + ArrayList comments = new ArrayList(); + // TODO: comments... + + int bitsPerPixel = bhi.bitsPerPixel; + ImageFormat format = ImageFormat.IMAGE_FORMAT_BMP; + String name = "BMP Windows Bitmap"; + String mimeType = "image/x-ms-bmp"; + // we ought to count images, but don't yet. + int numberOfImages = -1; + // not accurate ... only reflects first + boolean isProgressive = false; + // boolean isProgressive = (fPNGChunkIHDR.InterlaceMethod != 0); + // + // pixels per meter + int physicalWidthDpi = (int) (bhi.hResolution * 1000.0 / 2.54); + float physicalWidthInch = (float) ((double) width / (double) physicalWidthDpi); + // int physicalHeightDpi = 72; + int physicalHeightDpi = (int) (bhi.vResolution * 1000.0 / 2.54); + float physicalHeightInch = (float) ((double) height / (double) physicalHeightDpi); + + String formatDetails = "Bmp (" + (char) bhi.identifier1 + + (char) bhi.identifier2 + ": " + + getBmpTypeDescription(bhi.identifier1, bhi.identifier2) + ")"; + + boolean isTransparent = false; + + boolean usesPalette = colorTable != null; + int colorType = ImageInfo.COLOR_TYPE_RGB; + String compressionAlgorithm = ImageInfo.COMPRESSION_ALGORITHM_RLE; + + ImageInfo result = new ImageInfo(formatDetails, bitsPerPixel, comments, + format, name, height, mimeType, numberOfImages, + physicalHeightDpi, physicalHeightInch, physicalWidthDpi, + physicalWidthInch, width, isProgressive, isTransparent, + usesPalette, colorType, compressionAlgorithm); + + return result; + } + + public boolean dumpImageFile(PrintWriter pw, ByteSource byteSource) + throws ImageReadException, IOException + { + pw.println("bmp.dumpImageFile"); + + ImageInfo imageData = getImageInfo(byteSource, null); + if (imageData == null) + return false; + + imageData.toString(pw, ""); + + pw.println(""); + + return true; + } + + public FormatCompliance getFormatCompliance(ByteSource byteSource) + throws ImageReadException, IOException + { + boolean verbose = false; + + FormatCompliance result = new FormatCompliance(byteSource + .getDescription()); + + readImageContents(byteSource.getInputStream(), result, verbose); + + return result; + } + + public BufferedImage getBufferedImage(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + return getBufferedImage(byteSource.getInputStream(), params); + } + + public BufferedImage getBufferedImage(InputStream inputStream, Map params) + throws ImageReadException, IOException + { + // make copy of params; we'll clear keys as we consume them. + params = (params == null) ? new HashMap() : new HashMap(params); + + boolean verbose = ParamMap.getParamBoolean(params, PARAM_KEY_VERBOSE, + false); + + if (params.containsKey(PARAM_KEY_VERBOSE)) + params.remove(PARAM_KEY_VERBOSE); + if (params.containsKey(BUFFERED_IMAGE_FACTORY)) + params.remove(BUFFERED_IMAGE_FACTORY); + + if (params.size() > 0) + { + Object firstKey = params.keySet().iterator().next(); + throw new ImageReadException("Unknown parameter: " + firstKey); + } + + ImageContents ic = readImageContents(inputStream, + FormatCompliance.getDefault(), verbose); + if (ic == null) + throw new ImageReadException("Couldn't read BMP Data"); + + BmpHeaderInfo bhi = ic.bhi; + // byte colorTable[] = ic.colorTable; + // byte imageData[] = ic.imageData; + + int width = bhi.width; + int height = bhi.height; + + boolean hasAlpha = false; + BufferedImage result = getBufferedImageFactory(params) + .getColorBufferedImage(width, height, hasAlpha); + + if (verbose) + { + System.out.println("width: " + width); + System.out.println("height: " + height); + System.out.println("width*height: " + width * height); + System.out.println("width*height*4: " + width * height * 4); + } + + PixelParser pixelParser = ic.pixelParser; + + pixelParser.processImage(result); + + return result; + + } + + private static final int BITMAP_FILE_HEADER_SIZE = 14; + private static final int BITMAP_INFO_HEADER_SIZE = 40; + + public void writeImage(BufferedImage src, OutputStream os, Map params) + throws ImageWriteException, IOException + { + // make copy of params; we'll clear keys as we consume them. + params = (params == null) ? new HashMap() : new HashMap(params); + + // clear format key. + if (params.containsKey(PARAM_KEY_FORMAT)) + params.remove(PARAM_KEY_FORMAT); + + if (params.size() > 0) + { + Object firstKey = params.keySet().iterator().next(); + throw new ImageWriteException("Unknown parameter: " + firstKey); + } + + final SimplePalette palette = new PaletteFactory().makePaletteSimple( + src, 256); + + BMPWriter writer = null; + if (palette == null) + writer = new BMPWriterRGB(); + else + writer = new BMPWriterPalette(palette); + + byte imagedata[] = writer.getImageData(src); + BinaryOutputStream bos = new BinaryOutputStream(os, BYTE_ORDER_INTEL); + + { + // write BitmapFileHeader + os.write(0x42); // B, Windows 3.1x, 95, NT, Bitmap + os.write(0x4d); // M + + int filesize = BITMAP_FILE_HEADER_SIZE + BITMAP_INFO_HEADER_SIZE + // header + // size + 4 * writer.getPaletteSize() + // palette size in bytes + imagedata.length; + bos.write4Bytes(filesize); + + bos.write4Bytes(0); // reserved + bos.write4Bytes(BITMAP_FILE_HEADER_SIZE + BITMAP_INFO_HEADER_SIZE + + 4 * writer.getPaletteSize()); // Bitmap Data Offset + } + + int width = src.getWidth(); + int height = src.getHeight(); + + { // write BitmapInfoHeader + bos.write4Bytes(BITMAP_INFO_HEADER_SIZE); // Bitmap Info Header Size + bos.write4Bytes(width); // width + bos.write4Bytes(height); // height + bos.write2Bytes(1); // Number of Planes + bos.write2Bytes(writer.getBitsPerPixel()); // Bits Per Pixel + + bos.write4Bytes(BI_RGB); // Compression + bos.write4Bytes(imagedata.length); // Bitmap Data Size + bos.write4Bytes(0); // HResolution + bos.write4Bytes(0); // VResolution + if (palette == null) + bos.write4Bytes(0); // Colors + else + bos.write4Bytes(palette.length()); // Colors + bos.write4Bytes(0); // Important Colors + // bos.write_4_bytes(0); // Compression + } + + { // write Palette + writer.writePalette(bos); + } + { // write Image Data + bos.writeByteArray(imagedata); + } + } + + /** + * Extracts embedded XML metadata as XML string. + *

+ * + * @param byteSource + * File containing image data. + * @param params + * Map of optional parameters, defined in SanselanConstants. + * @return Xmp Xml as String, if present. Otherwise, returns null. + */ + public String getXmpXml(ByteSource byteSource, Map params) + throws ImageReadException, IOException + { + return null; + } } Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/ImageContents.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/ImageContents.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/ImageContents.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/ImageContents.java Fri Sep 10 16:33:35 2010 @@ -20,18 +20,18 @@ import org.apache.sanselan.formats.bmp.p class ImageContents { - public final BmpHeaderInfo bhi; - public final byte colorTable[]; - public final byte imageData[]; - public final PixelParser pixelParser; + public final BmpHeaderInfo bhi; + public final byte colorTable[]; + public final byte imageData[]; + public final PixelParser pixelParser; - public ImageContents(BmpHeaderInfo bhi, byte ColorTable[], - byte ImageData[], PixelParser fPixelParser) - { - this.bhi = bhi; - this.colorTable = ColorTable; - this.imageData = ImageData; - this.pixelParser = fPixelParser; - } + public ImageContents(BmpHeaderInfo bhi, byte ColorTable[], + byte ImageData[], PixelParser fPixelParser) + { + this.bhi = bhi; + this.colorTable = ColorTable; + this.imageData = ImageData; + this.pixelParser = fPixelParser; + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParser.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParser.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParser.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParser.java Fri Sep 10 16:33:35 2010 @@ -26,36 +26,36 @@ import org.apache.sanselan.formats.bmp.B public abstract class PixelParser { - public final BmpHeaderInfo bhi; - public final byte colorTable[]; - public final byte imageData[]; - - protected final BinaryFileParser bfp; - protected final ByteArrayInputStream is; - - public PixelParser(BmpHeaderInfo bhi, byte ColorTable[], byte ImageData[]) - { - this.bhi = bhi; - this.colorTable = ColorTable; - this.imageData = ImageData; - - bfp = new BinaryFileParser(BinaryFileParser.BYTE_ORDER_INTEL); - is = new ByteArrayInputStream(ImageData); - } - - public abstract void processImage(BufferedImage bi) - throws ImageReadException, IOException; - - protected int getColorTableRGB(int index) - { - index *= 4; - int blue = 0xff & colorTable[index + 0]; - int green = 0xff & colorTable[index + 1]; - int red = 0xff & colorTable[index + 2]; - int alpha = 0xff; - - int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - return rgb; - } + public final BmpHeaderInfo bhi; + public final byte colorTable[]; + public final byte imageData[]; + + protected final BinaryFileParser bfp; + protected final ByteArrayInputStream is; + + public PixelParser(BmpHeaderInfo bhi, byte ColorTable[], byte ImageData[]) + { + this.bhi = bhi; + this.colorTable = ColorTable; + this.imageData = ImageData; + + bfp = new BinaryFileParser(BinaryFileParser.BYTE_ORDER_INTEL); + is = new ByteArrayInputStream(ImageData); + } + + public abstract void processImage(BufferedImage bi) + throws ImageReadException, IOException; + + protected int getColorTableRGB(int index) + { + index *= 4; + int blue = 0xff & colorTable[index + 0]; + int green = 0xff & colorTable[index + 1]; + int red = 0xff & colorTable[index + 2]; + int alpha = 0xff; + + int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + return rgb; + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserBitFields.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserBitFields.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserBitFields.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserBitFields.java Fri Sep 10 16:33:35 2010 @@ -26,104 +26,104 @@ import org.apache.sanselan.formats.bmp.B public class PixelParserBitFields extends PixelParserSimple { - private final int redShift; - private final int greenShift; - private final int blueShift; - - private final int redMask; - private final int greenMask; - private final int blueMask; - - public PixelParserBitFields(BmpHeaderInfo bhi, byte ColorTable[], - byte ImageData[]) throws ImageReadException, IOException - { - super(bhi, ColorTable, ImageData); - - InputStream bais = new ByteArrayInputStream(ColorTable); - - redMask = bfp.read4Bytes("redMask", bais, - "BMP BI_BITFIELDS Bad Color Table"); - greenMask = bfp.read4Bytes("greenMask", bais, - "BMP BI_BITFIELDS Bad Color Table"); - blueMask = bfp.read4Bytes("blueMask", bais, - "BMP BI_BITFIELDS Bad Color Table"); - - redShift = getMaskShift(redMask); - greenShift = getMaskShift(greenMask); - blueShift = getMaskShift(blueMask); - } - - private int getMaskShift(int mask) - { - int trailingZeroes = 0; - - while ((0x1 & mask) == 0) - { - mask = 0x7fffffff & (mask >> 1); - trailingZeroes++; - } - - int maskLength = 0; - - while ((0x1 & mask) == 1) - { - mask = 0x7fffffff & (mask >> 1); - maskLength++; - } - - return (trailingZeroes - (8 - maskLength)); - } - private int bytecount = 0; - - public int getNextRGB() throws ImageReadException, IOException - { - int data; - - if (bhi.bitsPerPixel == 8) - { - data = 0xff & imageData[bytecount + 0]; - bytecount += 1; - } - else if (bhi.bitsPerPixel == 24) - { - data = bfp.read3Bytes("Pixel", is, "BMP Image Data"); - bytecount += 3; - } - else if (bhi.bitsPerPixel == 32) - { - data = bfp.read4Bytes("Pixel", is, "BMP Image Data"); - bytecount += 4; - } - else if (bhi.bitsPerPixel == 16) - { - data = bfp.read2Bytes("Pixel", is, "BMP Image Data"); - bytecount += 2; - } - else - throw new ImageReadException("Unknown BitsPerPixel: " - + bhi.bitsPerPixel); - - int red = (redMask & data); - int green = (greenMask & data); - int blue = (blueMask & data); - - red = (redShift >= 0) ? red >> redShift : red << -redShift; - green = (greenShift >= 0) ? green >> greenShift : green << -greenShift; - blue = (blueShift >= 0) ? blue >> blueShift : blue << -blueShift; - - int alpha = 0xff; - - int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - - return rgb; - } - - public void newline() throws ImageReadException, IOException - { - while (((bytecount) % 4) != 0) - { - bfp.readByte("Pixel", is, "BMP Image Data"); - bytecount++; - } - } + private final int redShift; + private final int greenShift; + private final int blueShift; + + private final int redMask; + private final int greenMask; + private final int blueMask; + + public PixelParserBitFields(BmpHeaderInfo bhi, byte ColorTable[], + byte ImageData[]) throws ImageReadException, IOException + { + super(bhi, ColorTable, ImageData); + + InputStream bais = new ByteArrayInputStream(ColorTable); + + redMask = bfp.read4Bytes("redMask", bais, + "BMP BI_BITFIELDS Bad Color Table"); + greenMask = bfp.read4Bytes("greenMask", bais, + "BMP BI_BITFIELDS Bad Color Table"); + blueMask = bfp.read4Bytes("blueMask", bais, + "BMP BI_BITFIELDS Bad Color Table"); + + redShift = getMaskShift(redMask); + greenShift = getMaskShift(greenMask); + blueShift = getMaskShift(blueMask); + } + + private int getMaskShift(int mask) + { + int trailingZeroes = 0; + + while ((0x1 & mask) == 0) + { + mask = 0x7fffffff & (mask >> 1); + trailingZeroes++; + } + + int maskLength = 0; + + while ((0x1 & mask) == 1) + { + mask = 0x7fffffff & (mask >> 1); + maskLength++; + } + + return (trailingZeroes - (8 - maskLength)); + } + private int bytecount = 0; + + public int getNextRGB() throws ImageReadException, IOException + { + int data; + + if (bhi.bitsPerPixel == 8) + { + data = 0xff & imageData[bytecount + 0]; + bytecount += 1; + } + else if (bhi.bitsPerPixel == 24) + { + data = bfp.read3Bytes("Pixel", is, "BMP Image Data"); + bytecount += 3; + } + else if (bhi.bitsPerPixel == 32) + { + data = bfp.read4Bytes("Pixel", is, "BMP Image Data"); + bytecount += 4; + } + else if (bhi.bitsPerPixel == 16) + { + data = bfp.read2Bytes("Pixel", is, "BMP Image Data"); + bytecount += 2; + } + else + throw new ImageReadException("Unknown BitsPerPixel: " + + bhi.bitsPerPixel); + + int red = (redMask & data); + int green = (greenMask & data); + int blue = (blueMask & data); + + red = (redShift >= 0) ? red >> redShift : red << -redShift; + green = (greenShift >= 0) ? green >> greenShift : green << -greenShift; + blue = (blueShift >= 0) ? blue >> blueShift : blue << -blueShift; + + int alpha = 0xff; + + int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + + return rgb; + } + + public void newline() throws ImageReadException, IOException + { + while (((bytecount) % 4) != 0) + { + bfp.readByte("Pixel", is, "BMP Image Data"); + bytecount++; + } + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRgb.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRgb.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRgb.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRgb.java Fri Sep 10 16:33:35 2010 @@ -23,106 +23,106 @@ import org.apache.sanselan.formats.bmp.B public class PixelParserRgb extends PixelParserSimple { - public PixelParserRgb(BmpHeaderInfo bhi, byte ColorTable[], - byte ImageData[]) - { - super(bhi, ColorTable, ImageData); - - } - - private int bytecount = 0; - private int cached_bit_count = 0; - private int cached_byte = 0; - - int pixelCount = 0; - - public int getNextRGB() throws ImageReadException, IOException - { - pixelCount++; - - if ((bhi.bitsPerPixel == 1) // always grayscale? - || (bhi.bitsPerPixel == 4)) // always grayscale? - { - if (cached_bit_count < bhi.bitsPerPixel) - { - if (cached_bit_count != 0) - throw new ImageReadException("Unexpected leftover bits: " - + cached_bit_count + "/" + bhi.bitsPerPixel); - - cached_bit_count += 8; - cached_byte = - (0xff & imageData[bytecount]); - bytecount++; - } - int cache_mask = (1 << bhi.bitsPerPixel) - 1; - int sample = cache_mask & (cached_byte >> (8 - bhi.bitsPerPixel)); - cached_byte = 0xff & (cached_byte << bhi.bitsPerPixel); - cached_bit_count -= bhi.bitsPerPixel; - - int rgb = getColorTableRGB(sample); - - return rgb; - } else if (bhi.bitsPerPixel == 8) // always grayscale? - { - int sample = 0xff & imageData[bytecount + 0]; - - int rgb = getColorTableRGB(sample); - - bytecount += 1; - - return rgb; - } else if (bhi.bitsPerPixel == 16) - { - int data = bfp.read2Bytes("Pixel", is, "BMP Image Data"); - - int blue = (0x1f & (data >> 0)) << 3; - int green = (0x1f & (data >> 5)) << 3; - int red = (0x1f & (data >> 10)) << 3; - int alpha = 0xff; - - int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - - bytecount += 2; - - return rgb; - } else if (bhi.bitsPerPixel == 24) - { - int blue = 0xff & imageData[bytecount + 0]; - int green = 0xff & imageData[bytecount + 1]; - int red = 0xff & imageData[bytecount + 2]; - int alpha = 0xff; - - int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - - bytecount += 3; - - return rgb; - } else if (bhi.bitsPerPixel == 32) - { - int blue = 0xff & imageData[bytecount + 0]; - int green = 0xff & imageData[bytecount + 1]; - int red = 0xff & imageData[bytecount + 2]; - int alpha = 0xff; - - int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - - bytecount += 4; - - return rgb; - } - - throw new ImageReadException("Unknown BitsPerPixel: " - + bhi.bitsPerPixel); - } - - public void newline() throws ImageReadException, IOException - { - cached_bit_count = 0; - - while (((bytecount) % 4) != 0) - { - bfp.readByte("Pixel", is, "BMP Image Data"); - bytecount++; - } - } + public PixelParserRgb(BmpHeaderInfo bhi, byte ColorTable[], + byte ImageData[]) + { + super(bhi, ColorTable, ImageData); + + } + + private int bytecount = 0; + private int cached_bit_count = 0; + private int cached_byte = 0; + + int pixelCount = 0; + + public int getNextRGB() throws ImageReadException, IOException + { + pixelCount++; + + if ((bhi.bitsPerPixel == 1) // always grayscale? + || (bhi.bitsPerPixel == 4)) // always grayscale? + { + if (cached_bit_count < bhi.bitsPerPixel) + { + if (cached_bit_count != 0) + throw new ImageReadException("Unexpected leftover bits: " + + cached_bit_count + "/" + bhi.bitsPerPixel); + + cached_bit_count += 8; + cached_byte = + (0xff & imageData[bytecount]); + bytecount++; + } + int cache_mask = (1 << bhi.bitsPerPixel) - 1; + int sample = cache_mask & (cached_byte >> (8 - bhi.bitsPerPixel)); + cached_byte = 0xff & (cached_byte << bhi.bitsPerPixel); + cached_bit_count -= bhi.bitsPerPixel; + + int rgb = getColorTableRGB(sample); + + return rgb; + } else if (bhi.bitsPerPixel == 8) // always grayscale? + { + int sample = 0xff & imageData[bytecount + 0]; + + int rgb = getColorTableRGB(sample); + + bytecount += 1; + + return rgb; + } else if (bhi.bitsPerPixel == 16) + { + int data = bfp.read2Bytes("Pixel", is, "BMP Image Data"); + + int blue = (0x1f & (data >> 0)) << 3; + int green = (0x1f & (data >> 5)) << 3; + int red = (0x1f & (data >> 10)) << 3; + int alpha = 0xff; + + int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + + bytecount += 2; + + return rgb; + } else if (bhi.bitsPerPixel == 24) + { + int blue = 0xff & imageData[bytecount + 0]; + int green = 0xff & imageData[bytecount + 1]; + int red = 0xff & imageData[bytecount + 2]; + int alpha = 0xff; + + int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + + bytecount += 3; + + return rgb; + } else if (bhi.bitsPerPixel == 32) + { + int blue = 0xff & imageData[bytecount + 0]; + int green = 0xff & imageData[bytecount + 1]; + int red = 0xff & imageData[bytecount + 2]; + int alpha = 0xff; + + int rgb = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + + bytecount += 4; + + return rgb; + } + + throw new ImageReadException("Unknown BitsPerPixel: " + + bhi.bitsPerPixel); + } + + public void newline() throws ImageReadException, IOException + { + cached_bit_count = 0; + + while (((bytecount) % 4) != 0) + { + bfp.readByte("Pixel", is, "BMP Image Data"); + bytecount++; + } + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRle.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRle.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRle.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserRle.java Fri Sep 10 16:33:35 2010 @@ -26,185 +26,185 @@ import org.apache.sanselan.formats.bmp.B public class PixelParserRle extends PixelParser { - public PixelParserRle(BmpHeaderInfo bhi, byte ColorTable[], - byte ImageData[]) - { - super(bhi, ColorTable, ImageData); - - } - - private int getSamplesPerByte() throws ImageReadException, IOException - { - if (bhi.bitsPerPixel == 8) - return 1; - else if (bhi.bitsPerPixel == 4) - return 2; - else - throw new ImageReadException("BMP RLE: bad BitsPerPixel: " - + bhi.bitsPerPixel); - } - - private int[] convertDataToSamples(int data) throws ImageReadException, - IOException - { - int rgbs[]; - if (bhi.bitsPerPixel == 8) - { - rgbs = new int[1]; - rgbs[0] = getColorTableRGB(data); - // pixels_written = 1; - } - else if (bhi.bitsPerPixel == 4) - { - rgbs = new int[2]; - int sample1 = data >> 4; - int sample2 = 0x0f & data; - rgbs[0] = getColorTableRGB(sample1); - rgbs[1] = getColorTableRGB(sample2); - // pixels_written = 2; - } - else - throw new ImageReadException("BMP RLE: bad BitsPerPixel: " - + bhi.bitsPerPixel); - - return rgbs; - } - - private int processByteOfData(int rgbs[], int repeat, int x, int y, - int width, int height, DataBuffer db, BufferedImage bi) - throws ImageReadException - { - // int rbg - int pixels_written = 0; - for (int i = 0; i < repeat; i++) - { - - if ((x >= 0) && (x < width) && (y >= 0) && (y < height)) - { - // int rgb = 0xff000000; - // rgb = getNextRGB(); - int rgb = rgbs[i % rgbs.length]; - // bi.setRGB(x, y, rgb); - db.setElem(y * bhi.width + x, rgb); - // bi.setRGB(x, y, 0xff00ff00); - } - else - { - System.out.println("skipping bad pixel (" + x + "," + y + ")"); - } - - x++; - pixels_written++; - } - - return pixels_written; - } - - public void processImage(BufferedImage bi) throws ImageReadException, - IOException - { - DataBuffer db = bi.getRaster().getDataBuffer(); - - int count = 0; - int width = bhi.width; - int height = bhi.height; - int x = 0, y = height - 1; - - // bfp.setDebug(true); - - boolean done = false; - while (!done) - { - count++; - // if (count > 100) - // return; - - int a = 0xff & bfp.readByte("RLE (" + x + "," + y + ") a", is, - "BMP: Bad RLE"); - // baos.write(a); - int b = 0xff & bfp.readByte("RLE (" + x + "," + y + ") b", is, - "BMP: Bad RLE"); - // baos.write(b); - - if (a == 0) - { - switch (b) - { - case 0 : // EOL - { - // System.out.println("EOL"); - y--; - x = 0; - } - break; - case 1 : // EOF - // System.out - // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); - done = true; - break; - case 2 : { - // System.out - // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); - int c = 0xff & bfp - .readByte("RLE c", is, "BMP: Bad RLE"); - // baos.write(c); - int d = 0xff & bfp - .readByte("RLE d", is, "BMP: Bad RLE"); - // baos.write(d); - - } - break; - default : { - // System.out - // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); - - int SamplesPerByte = getSamplesPerByte(); - int size = b / SamplesPerByte; - if ((b % SamplesPerByte) > 0) - size++; - if ((size % 2) != 0) - size++; - - // System.out.println("b: " + b); - // System.out.println("size: " + size); - // System.out.println("SamplesPerByte: " + SamplesPerByte); - - byte bytes[] = bfp.readByteArray("bytes", size, is, - "RLE: Absolute Mode"); - - int remaining = b; - - // while(true) - for (int i = 0; remaining > 0; i++) - // for (int i = 0; i < bytes.length; i++) - { - int samples[] = convertDataToSamples(0xff & bytes[i]); - int towrite = Math.min(remaining, SamplesPerByte); - // System.out.println("remaining: " + remaining); - // System.out.println("SamplesPerByte: " - // + SamplesPerByte); - // System.out.println("towrite: " + towrite); - int written = processByteOfData(samples, towrite, - x, y, width, height, db, bi); - // System.out.println("written: " + written); - // System.out.println(""); - x += written; - remaining -= written; - } - // baos.write(bytes); - } - break; - } - } - else - { - int rgbs[] = convertDataToSamples(b); + public PixelParserRle(BmpHeaderInfo bhi, byte ColorTable[], + byte ImageData[]) + { + super(bhi, ColorTable, ImageData); + + } + + private int getSamplesPerByte() throws ImageReadException, IOException + { + if (bhi.bitsPerPixel == 8) + return 1; + else if (bhi.bitsPerPixel == 4) + return 2; + else + throw new ImageReadException("BMP RLE: bad BitsPerPixel: " + + bhi.bitsPerPixel); + } + + private int[] convertDataToSamples(int data) throws ImageReadException, + IOException + { + int rgbs[]; + if (bhi.bitsPerPixel == 8) + { + rgbs = new int[1]; + rgbs[0] = getColorTableRGB(data); + // pixels_written = 1; + } + else if (bhi.bitsPerPixel == 4) + { + rgbs = new int[2]; + int sample1 = data >> 4; + int sample2 = 0x0f & data; + rgbs[0] = getColorTableRGB(sample1); + rgbs[1] = getColorTableRGB(sample2); + // pixels_written = 2; + } + else + throw new ImageReadException("BMP RLE: bad BitsPerPixel: " + + bhi.bitsPerPixel); + + return rgbs; + } + + private int processByteOfData(int rgbs[], int repeat, int x, int y, + int width, int height, DataBuffer db, BufferedImage bi) + throws ImageReadException + { + // int rbg + int pixels_written = 0; + for (int i = 0; i < repeat; i++) + { + + if ((x >= 0) && (x < width) && (y >= 0) && (y < height)) + { + // int rgb = 0xff000000; + // rgb = getNextRGB(); + int rgb = rgbs[i % rgbs.length]; + // bi.setRGB(x, y, rgb); + db.setElem(y * bhi.width + x, rgb); + // bi.setRGB(x, y, 0xff00ff00); + } + else + { + System.out.println("skipping bad pixel (" + x + "," + y + ")"); + } + + x++; + pixels_written++; + } + + return pixels_written; + } + + public void processImage(BufferedImage bi) throws ImageReadException, + IOException + { + DataBuffer db = bi.getRaster().getDataBuffer(); + + int count = 0; + int width = bhi.width; + int height = bhi.height; + int x = 0, y = height - 1; + + // bfp.setDebug(true); + + boolean done = false; + while (!done) + { + count++; + // if (count > 100) + // return; + + int a = 0xff & bfp.readByte("RLE (" + x + "," + y + ") a", is, + "BMP: Bad RLE"); + // baos.write(a); + int b = 0xff & bfp.readByte("RLE (" + x + "," + y + ") b", is, + "BMP: Bad RLE"); + // baos.write(b); + + if (a == 0) + { + switch (b) + { + case 0 : // EOL + { + // System.out.println("EOL"); + y--; + x = 0; + } + break; + case 1 : // EOF + // System.out + // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + done = true; + break; + case 2 : { + // System.out + // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + int c = 0xff & bfp + .readByte("RLE c", is, "BMP: Bad RLE"); + // baos.write(c); + int d = 0xff & bfp + .readByte("RLE d", is, "BMP: Bad RLE"); + // baos.write(d); + + } + break; + default : { + // System.out + // .println("xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + + int SamplesPerByte = getSamplesPerByte(); + int size = b / SamplesPerByte; + if ((b % SamplesPerByte) > 0) + size++; + if ((size % 2) != 0) + size++; + + // System.out.println("b: " + b); + // System.out.println("size: " + size); + // System.out.println("SamplesPerByte: " + SamplesPerByte); + + byte bytes[] = bfp.readByteArray("bytes", size, is, + "RLE: Absolute Mode"); + + int remaining = b; + + // while(true) + for (int i = 0; remaining > 0; i++) + // for (int i = 0; i < bytes.length; i++) + { + int samples[] = convertDataToSamples(0xff & bytes[i]); + int towrite = Math.min(remaining, SamplesPerByte); + // System.out.println("remaining: " + remaining); + // System.out.println("SamplesPerByte: " + // + SamplesPerByte); + // System.out.println("towrite: " + towrite); + int written = processByteOfData(samples, towrite, + x, y, width, height, db, bi); + // System.out.println("written: " + written); + // System.out.println(""); + x += written; + remaining -= written; + } + // baos.write(bytes); + } + break; + } + } + else + { + int rgbs[] = convertDataToSamples(b); - x += processByteOfData(rgbs, a, x, y, width, height, db, bi); - // x += processByteOfData(b, a, x, y, width, height, bi); + x += processByteOfData(rgbs, a, x, y, width, height, db, bi); + // x += processByteOfData(b, a, x, y, width, height, bi); - } - } + } + } - } + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java Fri Sep 10 16:33:35 2010 @@ -24,31 +24,31 @@ import org.apache.sanselan.formats.bmp.B public abstract class PixelParserSimple extends PixelParser { - public PixelParserSimple(BmpHeaderInfo bhi, byte ColorTable[], - byte ImageData[]) - { - super(bhi, ColorTable, ImageData); - } - - public abstract int getNextRGB() throws ImageReadException, IOException; - - public abstract void newline() throws ImageReadException, IOException; - - public void processImage(BufferedImage bi) throws ImageReadException, - IOException - { -// DataBuffer db = bi.getRaster().getDataBuffer(); - - for (int y = bhi.height - 1; y >= 0; y--) - { - for (int x = 0; x < bhi.width; x++) - { - int rgb = getNextRGB(); - - bi.setRGB(x, y, rgb); -// db.setElem(y * bhi.width + x, rgb); - } - newline(); - } - } + public PixelParserSimple(BmpHeaderInfo bhi, byte ColorTable[], + byte ImageData[]) + { + super(bhi, ColorTable, ImageData); + } + + public abstract int getNextRGB() throws ImageReadException, IOException; + + public abstract void newline() throws ImageReadException, IOException; + + public void processImage(BufferedImage bi) throws ImageReadException, + IOException + { +// DataBuffer db = bi.getRaster().getDataBuffer(); + + for (int y = bhi.height - 1; y >= 0; y--) + { + for (int x = 0; x < bhi.width; x++) + { + int rgb = getNextRGB(); + + bi.setRGB(x, y, rgb); +// db.setElem(y * bhi.width + x, rgb); + } + newline(); + } + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriter.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriter.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriter.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriter.java Fri Sep 10 16:33:35 2010 @@ -23,12 +23,12 @@ import org.apache.sanselan.common.Binary public abstract class BMPWriter { - public abstract int getPaletteSize(); + public abstract int getPaletteSize(); - public abstract int getBitsPerPixel(); + public abstract int getBitsPerPixel(); - public abstract void writePalette(BinaryOutputStream bos) - throws IOException; + public abstract void writePalette(BinaryOutputStream bos) + throws IOException; - public abstract byte[] getImageData(BufferedImage src); + public abstract byte[] getImageData(BufferedImage src); } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterPalette.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterPalette.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterPalette.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterPalette.java Fri Sep 10 16:33:35 2010 @@ -25,104 +25,104 @@ import org.apache.sanselan.palette.Simpl public class BMPWriterPalette extends BMPWriter { - private final SimplePalette palette; - private final int bitsPerSample; + private final SimplePalette palette; + private final int bitsPerSample; - public BMPWriterPalette(SimplePalette palette) - { - this.palette = palette; - - if (palette.length() <= 2) - bitsPerSample = 1; - else if (palette.length() <= 16) - bitsPerSample = 4; - else - bitsPerSample = 8; - } - - public int getPaletteSize() - { - return palette.length(); - } - - public int getBitsPerPixel() - { - return bitsPerSample; - } - - public void writePalette(BinaryOutputStream bos) throws IOException - { - for (int i = 0; i < palette.length(); i++) - { - int rgb = palette.getEntry(i); - - int red = 0xff & (rgb >> 16); - int green = 0xff & (rgb >> 8); - int blue = 0xff & (rgb >> 0); - - bos.write(blue); - bos.write(green); - bos.write(red); - bos.write(0); - } - } - - public byte[] getImageData(BufferedImage src) - { - int width = src.getWidth(); - int height = src.getHeight(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - int bit_cache = 0; - int bits_in_cache = 0; - - int bytecount = 0; - for (int y = height - 1; y >= 0; y--) - { - for (int x = 0; x < width; x++) - { - int argb = src.getRGB(x, y); - int rgb = 0xffffff & argb; - - int index = palette.getPaletteIndex(rgb); - - if (bitsPerSample == 8) - { - baos.write(0xff & index); - bytecount++; - } else - // 4 or 1 - { - bit_cache = (bit_cache << bitsPerSample) | index; - bits_in_cache += bitsPerSample; - if (bits_in_cache >= 8) - { - baos.write(0xff & bit_cache); - bytecount++; - bit_cache = 0; - bits_in_cache = 0; - } - } - } - - if (bits_in_cache > 0) - { - bit_cache = (bit_cache << (8 - bits_in_cache)); - - baos.write(0xff & bit_cache); - bytecount++; - bit_cache = 0; - bits_in_cache = 0; - } - - while ((bytecount % 4) != 0) - { - baos.write(0); - bytecount++; - } - } + public BMPWriterPalette(SimplePalette palette) + { + this.palette = palette; + + if (palette.length() <= 2) + bitsPerSample = 1; + else if (palette.length() <= 16) + bitsPerSample = 4; + else + bitsPerSample = 8; + } + + public int getPaletteSize() + { + return palette.length(); + } + + public int getBitsPerPixel() + { + return bitsPerSample; + } + + public void writePalette(BinaryOutputStream bos) throws IOException + { + for (int i = 0; i < palette.length(); i++) + { + int rgb = palette.getEntry(i); + + int red = 0xff & (rgb >> 16); + int green = 0xff & (rgb >> 8); + int blue = 0xff & (rgb >> 0); + + bos.write(blue); + bos.write(green); + bos.write(red); + bos.write(0); + } + } + + public byte[] getImageData(BufferedImage src) + { + int width = src.getWidth(); + int height = src.getHeight(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + int bit_cache = 0; + int bits_in_cache = 0; + + int bytecount = 0; + for (int y = height - 1; y >= 0; y--) + { + for (int x = 0; x < width; x++) + { + int argb = src.getRGB(x, y); + int rgb = 0xffffff & argb; + + int index = palette.getPaletteIndex(rgb); + + if (bitsPerSample == 8) + { + baos.write(0xff & index); + bytecount++; + } else + // 4 or 1 + { + bit_cache = (bit_cache << bitsPerSample) | index; + bits_in_cache += bitsPerSample; + if (bits_in_cache >= 8) + { + baos.write(0xff & bit_cache); + bytecount++; + bit_cache = 0; + bits_in_cache = 0; + } + } + } + + if (bits_in_cache > 0) + { + bit_cache = (bit_cache << (8 - bits_in_cache)); + + baos.write(0xff & bit_cache); + bytecount++; + bit_cache = 0; + bits_in_cache = 0; + } + + while ((bytecount % 4) != 0) + { + baos.write(0); + bytecount++; + } + } - return baos.toByteArray(); - } + return baos.toByteArray(); + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterRGB.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterRGB.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterRGB.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/writers/BMPWriterRGB.java Fri Sep 10 16:33:35 2010 @@ -24,61 +24,61 @@ import org.apache.sanselan.common.Binary public class BMPWriterRGB extends BMPWriter { - // private final boolean alpha; - // - // public BMPWriterRGB(boolean alpha) - // { - // this.alpha = alpha; - // } - - public int getPaletteSize() - { - return 0; - } - - public int getBitsPerPixel() - { - // return alpha ? 32 : 24; - return 24; - } - - public void writePalette(BinaryOutputStream bos) throws IOException - { - } - - public byte[] getImageData(BufferedImage src) - { - int width = src.getWidth(); - int height = src.getHeight(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // BinaryOutputStream bos = new BinaryOutputStream(baos, BYTE_ORDER_Network); - - int bytecount = 0; - for (int y = height - 1; y >= 0; y--) - { - // for (int y = 0; y < height; y++) - for (int x = 0; x < width; x++) - { - int argb = src.getRGB(x, y); - int rgb = 0xffffff & argb; - - int red = 0xff & (rgb >> 16); - int green = 0xff & (rgb >> 8); - int blue = 0xff & (rgb >> 0); - - baos.write(blue); - baos.write(green); - baos.write(red); - bytecount += 3; - } - while ((bytecount % 4) != 0) - { - baos.write(0); - bytecount++; - } - } + // private final boolean alpha; + // + // public BMPWriterRGB(boolean alpha) + // { + // this.alpha = alpha; + // } + + public int getPaletteSize() + { + return 0; + } + + public int getBitsPerPixel() + { + // return alpha ? 32 : 24; + return 24; + } + + public void writePalette(BinaryOutputStream bos) throws IOException + { + } + + public byte[] getImageData(BufferedImage src) + { + int width = src.getWidth(); + int height = src.getHeight(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // BinaryOutputStream bos = new BinaryOutputStream(baos, BYTE_ORDER_Network); + + int bytecount = 0; + for (int y = height - 1; y >= 0; y--) + { + // for (int y = 0; y < height; y++) + for (int x = 0; x < width; x++) + { + int argb = src.getRGB(x, y); + int rgb = 0xffffff & argb; + + int red = 0xff & (rgb >> 16); + int green = 0xff & (rgb >> 8); + int blue = 0xff & (rgb >> 0); + + baos.write(blue); + baos.write(green); + baos.write(red); + bytecount += 3; + } + while ((bytecount % 4) != 0) + { + baos.write(0); + bytecount++; + } + } - return baos.toByteArray(); - } + return baos.toByteArray(); + } } \ No newline at end of file Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GIFBlock.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GIFBlock.java?rev=995859&r1=995858&r2=995859&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GIFBlock.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GIFBlock.java Fri Sep 10 16:33:35 2010 @@ -18,10 +18,10 @@ package org.apache.sanselan.formats.gif; class GIFBlock { - public final int blockCode; + public final int blockCode; - public GIFBlock(int blockCode) - { - this.blockCode = blockCode; - } + public GIFBlock(int blockCode) + { + this.blockCode = blockCode; + } } \ No newline at end of file