From 354f239a461ea2f5ddd494810252216014f9b90b Mon Sep 17 00:00:00 2001 From: Julien Gouesse Date: Sun, 9 Aug 2015 17:26:43 +0200 Subject: Detection of the image format, first version (work in progress), see the bug report 1042 --- .../jogamp/opengl/util/texture/ImageIOUtil.java | 428 +++++++++++++++++++++ 1 file changed, 428 insertions(+) create mode 100644 src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java (limited to 'src/jogl/classes/com') diff --git a/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java b/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java new file mode 100644 index 000000000..e9e339a0c --- /dev/null +++ b/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java @@ -0,0 +1,428 @@ +/** + * Copyright 2014 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions 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. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ +package com.jogamp.opengl.util.texture; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Utilities for image input and output + * + */ +public class ImageIOUtil { + + public static String getFileSuffix(InputStream stream) throws IOException { + if (stream == null) { + throw new IOException("Stream was null"); + } + if (!(stream instanceof BufferedInputStream)) { + stream = new BufferedInputStream(stream); + } + if (!stream.markSupported()) { + throw new IOException("Can not get non-destructively the image format"); + } + if (stream.available() < 32) { + throw new IOException("Not enough bytes to read in order to get the image format"); + } + try { + stream.mark(32); + final byte[] b = new byte[32]; + stream.read(b); + return getFileSuffix(b); + } finally { + stream.reset(); + } + + } + + public static String getFileSuffix(final byte[] b) { + /** + * http://www.faqs.org/faqs/jpeg-faq/part1/ + * http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=54989 + */ + if ((b[0] == 0xff && b[1] == 0xd8 /* && b[2] == 0xff */) + || (b[0] == 0x4A && b[1] == 0x46 && b[2] == 0x49 && b[3] == 0x46)/* JFIF */ + || (b[0] == 0x45 && b[1] == 0x78 && b[2] == 0x69 && b[3] == 0x66)/* EXIF */) { + return TextureIO.JPG; + } + /** + * http://www.libpng.org/pub/png/spec/1.1/PNG-Rationale.html#R.PNG-file-signature + */ + if (b[0] == 0x89 && b[1] == 0x50 && b[2] == 0x4E && b[3] == 0x47 /* 'P' 'N' 'G', ascii code */ + && b[4] == 0x0D && b[5] == 0x0A && b[6] == 0x1A && b[7] == 0x0A) { + return TextureIO.PNG; + } + /** + * Apple Icon Image + * + * 'i' 'c' 'n' 's' ascii code + */ + if (b[0] == 0x69 && b[1] == 0x63 && b[2] == 0x6E && b[3] == 0x73) { + return "icns"; + } + /** + * http://www.w3.org/Graphics/GIF/spec-gif87a.txt http://www.w3.org/Graphics/GIF/spec-gif89a.txt + * + * GIF87A or GIF89A ascii code + */ + if (b[0] == 0x47 && b[1] == 0x49 && b[2] == 0x46 && b[3] == 0x38 && (b[4] == 0x37 || b[4] == 0x39) + && b[5] == 0x61) { + return TextureIO.GIF; + } + /** + * http://www.fileformat.info/format/bmp/spec/e27073c25463436f8a64fa789c886d9c/view.htm + * + * BM ascii code + */ + if (b[0] == 0x42 && b[1] == 0x4d) { + return "bmp"; + } + if (b[0] == 0x3A && b[1] == 0xDE && b[2] == 0x68 && b[3] == 0xB1) { + return "dcx"; + } + if (b[0] == 0x0A && b[1] == 0x05 && b[2] == 0x01 && b[3] == 0x08) { + return "pcx"; + } + /** + * http://netpbm.sourceforge.net/doc/ppm.html + */ + if (b[0] == 0x50 && (b[1] == 0x33 /* plain */|| b[1] == 0x36)) { + return TextureIO.PPM; + } + if (b[0] == 0x38 && b[1] == 0x42 && b[2] == 0x50 && b[3] == 0x53 && b[4] == 0x00 && b[5] == 0x01 + && b[6] == 0x00 && b[7] == 0x00 && b[8] == 0x00 && b[9] == 0x00) { + // Adobe PhotoShop + return "psd"; + } + /** + * http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf + * + * intentionally detects only the little endian tiff images ("II" in the spec) + */ + if (b[0] == 0x49 && b[1] == 0x49 && b[2] == 0x2A && b[3] == 0x00) { + return TextureIO.TIFF; + } + /** + * http://paulbourke.net/dataformats/sgirgb/sgiversion.html + * + * "474 saved as a short" 474 = 0x01DA + */ + if (b[0] == 0x01 && b[1] == 0xDA /* && b[2] == 0x01 && b[3] == 0x01 && b[4] == 0x00 && b[5] == 0x03 */) { + return TextureIO.SGI_RGB; + } + /** + * 'D' 'D' 'S' ' ' ascii code + */ + if (b[0] == 0x44 && b[1] == 0x44 && b[2] == 0x53 && b[3] == 0x20) { + return TextureIO.DDS; + } + /** + * http://netpbm.sourceforge.net/doc/pam.html + */ + if (b[0] == 0x50 && b[1] == 0x37) { + return TextureIO.PAM; + } + /** + * http://netpbm.sourceforge.net/doc/pgm.html + */ + if (b[0] == 0x50 && (b[1] == 0x32 /* plain */|| b[1] == 0x35)) { + return "pgm"; + } + /** + * http://netpbm.sourceforge.net/doc/pbm.html + */ + if (b[0] == 0x50 && (b[1] == 0x31 /* plain */|| b[1] == 0x34)) { + return "pbm"; + } + if (b[0] == 0x3D && b[1] == 0x02) { + return "3d2"; + } + if (b[0] == 0x33 && b[1] == 0x44 && b[2] == 0x4D && b[3] == 0x46) { + return "3dmf"; + } + if (b[0] == 0x2A && b[1] == 0x2A && b[2] == 0x54 && b[3] == 0x49 && b[4] == 0x39 && b[5] == 0x32 + && b[6] == 0x2A && b[7] == 0x2A && b[8] == 0x01 && b[9] == 0x00 && b[10] == 0x58 + && b[11] == 0x6E && b[12] == 0x56 && b[13] == 0x69) { + return "92i"; + } + if (b[0] == 0x41 && b[1] == 0x4D && b[2] == 0x46 && b[3] == 0x46) { + return "amff"; + } + if (b[0] == 0x4A && b[1] == 0x47 && (b[2] == 0x03 || b[2] == 0x04) && b[3] == 0x0E && b[4] == 0x00 + && b[5] == 0x00 && b[6] == 0x00) { + return "art"; + } + if (b[0] == 0x73 && b[1] == 0x72 && b[2] == 0x63 && b[3] == 0x64 && b[4] == 0x6F && b[5] == 0x63 + && b[6] == 0x69 && b[7] == 0x64 && b[8] == 0x3A) { + return "cals"; + } + if (b[0] == 0x07 && b[1] == 0x20 && b[2] == 0x4D && b[3] == 0x4D) { + return "cam"; + } + if (b[0] == 0x20 && b[1] == 0x77 && b[2] == 0x00 && b[3] == 0x02) { + return "cbd"; + } + if (b[0] == 0x45 && b[1] == 0x59 && b[2] == 0x45 && b[3] == 0x53) { + return "ce2"; + } + if (b[0] == 0x80 && b[1] == 0x2A && b[2] == 0x5F && b[3] == 0xD7 && b[4] == 0x00 && b[5] == 0x00 + && b[6] == 0x08 && b[7] == 0x00 && b[8] == 0x00 && b[9] == 0x00 && b[10] == 0x04 + && b[11] == 0x00 && b[12] == 0x00 && b[13] == 0x00) { + return "cin"; + } + if (b[0] == 0x43 && b[1] == 0x61 && b[2] == 0x6C && b[3] == 0x69 && b[4] == 0x67 && b[5] == 0x61 + && b[6] == 0x72 && b[7] == 0x69) { + return "cob"; + } + if (b[0] == 0x43 && b[1] == 0x50 && b[2] == 0x54 && b[3] == 0x46 && b[4] == 0x49 && b[5] == 0x4C + && b[6] == 0x45) { + return "cpt"; + } + if (b[0] == 0x43 && b[1] == 0x41 && b[2] == 0x4C && b[3] == 0x41 && b[4] == 0x4D && b[5] == 0x55 + && b[6] == 0x53 && b[7] == 0x43 && b[8] == 0x56 && b[9] == 0x47) { + return "cvg"; + } + if (b[0] == 0x56 && b[1] == 0x69 && b[2] == 0x73 && b[3] == 0x74 && b[4] == 0x61 && b[5] == 0x20 + && b[6] == 0x44 && b[7] == 0x45 && b[8] == 0x4D && b[9] == 0x20 && b[10] == 0x46 + && b[11] == 0x69 && b[12] == 0x6C && b[13] == 0x65) { + return "dem"; + } + if (b[0] == 0x42 && b[1] == 0x4D && b[2] == 0x36) { + return "dib"; + } + if (b[0] == 0x53 && b[1] == 0x44 && b[2] == 0x50 && b[3] == 0x58) { + return "dpx"; + } + if (b[0] == 0x01 && b[1] == 0xFF && b[2] == 0x02 && b[3] == 0x04 && b[4] == 0x03 && b[5] == 0x02) { + return "drw"; + } + if (b[0] == 0x41 && b[1] == 0x43 && b[2] == 0x31 && b[3] == 0x30) { + return "dwg"; + } + if (b[0] == 0x65 && b[1] == 0x02 && b[2] == 0x01 && b[3] == 0x02) { + return "ecw"; + } + if (b[0] == 0x01 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x00 && b[4] == 0x58 && b[5] == 0x00 + && b[6] == 0x00 && b[7] == 0x00) { + return "emf"; + } + if (b[0] == 0xD0 && b[1] == 0xCF && b[2] == 0x11 && b[3] == 0xE0 && b[4] == 0xA1 && b[5] == 0xB1 + && b[6] == 0x1A && b[7] == 0xE1 && b[8] == 0x00) { + return "fpx"; + } + if (b[0] == 0x53 && b[1] == 0x49 && b[2] == 0x4D && b[3] == 0x50 && b[4] == 0x4C && b[5] == 0x45 + && b[6] == 0x20 && b[7] == 0x20 && b[8] == 0x3D) { + return "fts"; + } + if (b[0] == 0x48 && b[1] == 0x50 && b[2] == 0x48 && b[3] == 0x50 && b[4] == 0x34 && b[5] == 0x38 + && b[6] == 0x2D && b[7] == 0x45 && b[8] == 0x1E && b[9] == 0x2B) { + return "gro"; + } + if (b[0] == 0x6E && b[1] == 0x63 && b[2] == 0x6F && b[3] == 0x6C && b[4] == 0x73) { + return "hdr"; + } + if (b[0] == 0x35 && b[1] == 0x4B && b[2] == 0x50 && b[3] == 0x35 && b[4] == 0x31 && b[5] == 0x5D + && b[6] == 0x2A && b[7] == 0x67 && b[8] == 0x72 && b[9] == 0x72 && b[10] == 0x80 + && b[11] == 0x83 && b[12] == 0x85 && b[13] == 0x63) { + return "hru"; + } + if (b[0] == 0xEB && b[1] == 0x3C && b[2] == 0x90 && b[3] == 0x2A) { + return "img"; + } + if (b[0] == 0x65 && b[1] == 0x6C && b[2] == 0x6D && b[3] == 0x6F) { + return "infini-d"; + } + if (b[0] == 0x49 && b[1] == 0x57 && b[2] == 0x43 && b[3] == 0x01) { + return "iwc"; + } + if (b[0] == 0x80 && b[1] == 0x3E && b[2] == 0x44 && b[3] == 0x53 && b[4] == 0x43 && b[5] == 0x49 + && b[6] == 0x4D) { + return "j6i"; + } + if (b[0] == 0x4A && b[1] == 0x49 && b[2] == 0x46 && b[3] == 0x39 && b[4] == 0x39 && b[5] == 0x61) { + return "jif"; + } + if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x0C && b[4] == 0x6A && b[5] == 0x50 + && b[6] == 0x20 && b[7] == 0x20 && b[8] == 0x0D && b[9] == 0x0A && b[10] == 0x87 + && b[11] == 0x0A) { + return "jp2"; + } + if (b[0] == 0x4D && b[1] == 0x4D && b[2] == 0x00 && b[3] == 0x2A) { + return "kdc"; + } + if (b[0] == 0x36 && b[1] == 0x34 && b[2] == 0x4C && b[3] == 0x41 && b[4] == 0x4E && b[5] == 0x20 + && b[6] == 0x49 && b[7] == 0x44 && b[8] == 0x42 && b[9] == 0x4C && b[10] == 0x4F + && b[11] == 0x43 && b[12] == 0x4B) { + return "l64"; + } + if (b[0] == 0x46 && b[1] == 0x4F && b[2] == 0x52 && b[3] == 0x4D) { + return "lbm"; + } + if (b[0] == 0x49 && b[1] == 0x49 && b[2] == 0x2A && b[3] == 0x00 && b[4] == 0x08 && b[5] == 0x00 + && b[6] == 0x00 && b[7] == 0x00 && b[8] == 0x0E && b[9] == 0x00 && b[10] == 0x00 + && b[11] == 0x01 && b[12] == 0x04 && b[13] == 0x00) { + return "ldf"; + } + if (b[0] == 0x57 && b[1] == 0x56 && b[2] == 0x02 && b[3] == 0x00 && b[4] == 0x47 && b[5] == 0x45 + && b[6] == 0x00 && b[7] == 0x0E) { + return "lwf"; + } + if (b[0] == 0x37 && b[1] == 0x00 && b[2] == 0x00 && b[3] == 0x10 && b[4] == 0x42 && b[5] == 0x00 + && b[6] == 0x00 && b[7] == 0x10 && b[8] == 0x00 && b[9] == 0x00 && b[10] == 0x00 + && b[11] == 0x00 && b[12] == 0x39 && b[13] == 0x64) { + return "mbm"; + } + if (b[0] == 0x4D && b[1] == 0x47 && b[2] == 0x4C) { + return "mgl"; + } + if (b[0] == 0x7B && b[1] == 0x0A && b[2] == 0x20 && b[3] == 0x20 && b[4] == 0x43 && b[5] == 0x72 + && b[6] == 0x65 && b[7] == 0x61 && b[8] == 0x74 && b[9] == 0x65 && b[10] == 0x64) { + return "mif"; + } + if (b[0] == 0x8A && b[1] == 0x4D && b[2] == 0x4E && b[3] == 0x47 && b[4] == 0x0D && b[5] == 0x0A + && b[6] == 0x1A && b[7] == 0x0A) { + return "mng"; + } + if (b[0] == 0x4D && b[1] == 0x50 && b[2] == 0x46) { + return "mpw"; + } + if (b[0] == 0x44 && b[1] == 0x61 && b[2] == 0x6E && b[3] == 0x4D) { + return "msp"; + } + if (b[0] == 0x43 && b[1] == 0x36 && b[2] == 0x34) { + return "n64"; + } + if (b[0] == 0x6E && b[1] == 0x6E && b[2] == 0x0A && b[3] == 0x00 && b[4] == 0x5E && b[5] == 0x00) { + return "ncr"; + } + if (b[0] == 0x6E && b[1] == 0x66 && b[2] == 0x66) { + return "nff"; + } + if (b[0] == 0x4E && b[1] == 0x47 && b[2] == 0x47 && b[3] == 0x00 && b[4] == 0x01 && b[5] == 0x00) { + return "ngg"; + } + if (b[0] == 0x4E && b[1] == 0x4C && b[2] == 0x4D && b[3] == 0x20 && b[4] == 0x01 && b[5] == 0x02 + && b[6] == 0x00) { + return "nlm"; + } + if (b[0] == 0x4E && b[1] == 0x4F && b[2] == 0x4C && b[3] == 0x00 && b[4] == 0x01 && b[5] == 0x00 + && b[6] == 0x06 && b[7] == 0x01 && b[8] == 0x03 && b[9] == 0x00) { + return "nol"; + } + if (b[0] == 0x41 && b[1] == 0x48) { + return "pal"; + } + if (b[0] == 0x50 && b[1] == 0x41 && b[2] == 0x58) { + return "pax"; + } + if (b[0] == 0x63 && b[1] == 0x52 && b[2] == 0x01 && b[3] == 0x01 && b[4] == 0x38 && b[5] == 0x09 + && b[6] == 0x3D && b[7] == 0x00) { + return "pcd"; + } + if (b[0] == 0x1B && b[1] == 0x45 && b[2] == 0x1B && b[3] == 0x26 && b[4] == 0x6C && b[5] == 0x30 + && b[6] == 0x4F && b[7] == 0x1B && b[8] == 0x26 && b[9] == 0x6C && b[10] == 0x30 + && b[11] == 0x45 && b[12] == 0x1B && b[13] == 0x26) { + return "pcl"; + } + if (b[0] == 0x50 && b[1] == 0x49 && b[2] == 0x58 && b[3] == 0x20) { + return "pix"; + } + if (b[0] == 0x50 && b[1] == 0x4F && b[2] == 0x4C && b[3] == 0x20 && b[4] == 0x46 && b[5] == 0x6F + && b[6] == 0x72 && b[7] == 0x6D && b[8] == 0x61 && b[9] == 0x74) { + return "pol"; + } + // Paint Shop Pro + if (b[0] == 0x7E && b[1] == 0x42 && b[2] == 0x4B && b[3] == 0x00) { + return "psp"; + } + if (b[0] == 0x50 && b[1] == 0x61 && b[2] == 0x69 && b[3] == 0x6E && b[4] == 0x74 && b[5] == 0x20 + && b[6] == 0x53 && b[7] == 0x68 && b[8] == 0x6F && b[9] == 0x70 && b[10] == 0x20 + && b[11] == 0x50 && b[12] == 0x72 && b[13] == 0x6F && b[14] == 0x20 && b[15] == 0x49 + && b[16] == 0x6D && b[17] == 0x61 && b[18] == 0x67 && b[19] == 0x65 && b[20] == 0x20 + && b[21] == 0x46 && b[22] == 0x69 && b[23] == 0x6C && b[24] == 0x65) { + return "psp"; + } + if (b[0] == 0x51 && b[1] == 0x4C && b[2] == 0x49 && b[3] == 0x49 && b[4] == 0x46 && b[5] == 0x41 + && b[6] == 0x58) { + return "qfx"; + } + if (b[0] == 0x6D && b[1] == 0x6F && b[2] == 0x6F && b[3] == 0x76) { + return "qtm"; + } + if (b[0] == 0x46 && b[1] == 0x4F && b[2] == 0x52 && b[3] == 0x4D && b[4] == 0x41 && b[5] == 0x54 + && b[6] == 0x3D) { + return "rad"; + } + if (b[0] == 0x59 && b[1] == 0xA6 && b[2] == 0x6A && b[3] == 0x95) { + return "ras"; + } + if (b[0] == 0x52 && b[1] == 0x49 && b[2] == 0x58 && b[3] == 0x33) { + return "rix"; + } + if (b[0] == 0x23 && b[1] == 0x20 && b[2] == 0x24 && b[3] == 0x49 && b[4] == 0x64 && b[5] == 0x3A + && b[6] == 0x20) { + return "sid"; + } + if (b[0] == 0x41 && b[1] == 0x75 && b[2] == 0x74 && b[3] == 0x6F && b[4] == 0x43 && b[5] == 0x41 + && b[6] == 0x44 && b[7] == 0x20 && b[8] == 0x53 && b[9] == 0x6C && b[10] == 0x69 + && b[11] == 0x64 && b[12] == 0x65) { + return "sld"; + } + if (b[0] == 0x53 && b[1] == 0x74 && b[2] == 0x6F && b[3] == 0x72 && b[4] == 0x6D && b[5] == 0x33 + && b[6] == 0x44) { + return "sod"; + } + if (b[0] == 0xFA && b[1] == 0xDE && b[2] == 0xBA && b[3] == 0xBE && b[4] == 0x01 && b[5] == 0x01) { + return "wic"; + } + if (b[0] == 0xD3 && b[1] == 0x23 && b[2] == 0x00 && b[3] == 0x00 && b[4] == 0x03 && b[5] == 0x00 + && b[6] == 0x00 && b[7] == 0x00) { + return "wlm"; + } + if (b[0] == 0xD7 && b[1] == 0xCD && b[2] == 0xC6 && b[3] == 0x9A) { + return "wmf"; + } + if (b[0] == 0xFF && b[1] == 0x57 && b[2] == 0x50 && b[3] == 0x43 && b[4] == 0x10) { + return "wpg"; + } + if (b[0] == 0x23 && b[1] == 0x56 && b[2] == 0x52 && b[3] == 0x4D && b[4] == 0x4C && b[5] == 0x20 + && b[6] == 0x56 && b[7] == 0x32 && b[8] == 0x2E && b[9] == 0x30) { + return "wrl"; + } + if (b[0] == 0x23 && b[1] == 0x64 && b[2] == 0x65 && b[3] == 0x66 && b[4] == 0x69 && b[5] == 0x6E + && b[6] == 0x65) { + return "xbm"; + } + if (b[0] == 0x2F && b[1] == 0x2A && b[2] == 0x20 && b[3] == 0x58 && b[4] == 0x50 && b[5] == 0x4D + && b[6] == 0x20 && b[7] == 0x2A && b[8] == 0x2F) { + return "xpm"; + } + return null; + } +} -- cgit v1.2.3 From 0608e185b3147c28d29b02af58205e639adf3f4e Mon Sep 17 00:00:00 2001 From: Julien Gouesse Date: Sun, 9 Aug 2015 17:57:18 +0200 Subject: Documents ImageIOUtil, see the bug report 1042 --- .../com/jogamp/opengl/util/texture/ImageIOUtil.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/jogl/classes/com') diff --git a/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java b/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java index e9e339a0c..1e50f843d 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java +++ b/src/jogl/classes/com/jogamp/opengl/util/texture/ImageIOUtil.java @@ -37,6 +37,15 @@ import java.io.InputStream; */ public class ImageIOUtil { + /** + * Determines the file suffix (i.e the image format) of the given InputStream. The given + * InputStream must return true from markSupported() and support a minimum of 32 bytes + * of read-ahead. + * + * @param stream stream to check + * @return the file suffix if any, otherwise null + * @throws java.io.IOException if an I/O exception occurred + */ public static String getFileSuffix(InputStream stream) throws IOException { if (stream == null) { throw new IOException("Stream was null"); @@ -61,6 +70,14 @@ public class ImageIOUtil { } + /** + * Determines the file suffix (i.e the image format) of the given bytes from the header + * of a file. + * + * @param stream stream to check + * @return the file suffix if any, otherwise null + * @throws java.io.IOException if an I/O exception occurred + */ public static String getFileSuffix(final byte[] b) { /** * http://www.faqs.org/faqs/jpeg-faq/part1/ -- cgit v1.2.3 From b0169344a9fc01c4fcc9a9c1a750815f02bc5633 Mon Sep 17 00:00:00 2001 From: Julien Gouesse Date: Sun, 9 Aug 2015 17:58:14 +0200 Subject: Calls ImageIOUtil in TextureIO to detect the image format of a stream, see the bug report 1042 --- .../classes/com/jogamp/opengl/util/texture/TextureIO.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/jogl/classes/com') diff --git a/src/jogl/classes/com/jogamp/opengl/util/texture/TextureIO.java b/src/jogl/classes/com/jogamp/opengl/util/texture/TextureIO.java index 54a552f33..80b195642 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/texture/TextureIO.java +++ b/src/jogl/classes/com/jogamp/opengl/util/texture/TextureIO.java @@ -895,7 +895,7 @@ public class TextureIO { final boolean mipmap, final String fileSuffix) throws IOException { if (DDS.equals(fileSuffix) || - DDSImage.isDDSImage(stream)) { + DDS.equals(ImageIOUtil.getFileSuffix(stream))) { final byte[] data = IOUtil.copyStream2ByteArray(stream); final ByteBuffer buf = ByteBuffer.wrap(data); final DDSImage image = DDSImage.read(buf); @@ -1052,7 +1052,8 @@ public class TextureIO { final String fileSuffix) throws IOException { if (SGI.equals(fileSuffix) || SGI_RGB.equals(fileSuffix) || - SGIImage.isSGIImage(stream)) { + SGI.equals(ImageIOUtil.getFileSuffix(stream)) || + SGI_RGB.equals(ImageIOUtil.getFileSuffix(stream))) { final SGIImage image = SGIImage.read(stream); if (pixelFormat == 0) { pixelFormat = image.getFormat(); @@ -1124,7 +1125,8 @@ public class TextureIO { int pixelFormat, final boolean mipmap, final String fileSuffix) throws IOException { - if (PNG.equals(fileSuffix)) { + if (PNG.equals(fileSuffix) || + PNG.equals(ImageIOUtil.getFileSuffix(stream))) { final PNGPixelRect image = PNGPixelRect.read(stream, null, true /* directBuffer */, 0 /* destMinStrideInBytes */, true /* destIsGLOriented */); final GLPixelAttributes glpa = new GLPixelAttributes(glp, image.getPixelformat(), false /* pack */); if ( 0 == pixelFormat ) { @@ -1164,7 +1166,8 @@ public class TextureIO { int pixelFormat, final boolean mipmap, final String fileSuffix) throws IOException { - if (JPG.equals(fileSuffix)) { + if (JPG.equals(fileSuffix) || + JPG.equals(ImageIOUtil.getFileSuffix(stream))) { final JPEGImage image = JPEGImage.read(/*glp, */ stream); if (pixelFormat == 0) { pixelFormat = image.getGLFormat(); -- cgit v1.2.3 From 2689c311cd0fea40740c7d9db68a4e40020b1281 Mon Sep 17 00:00:00 2001 From: Julien Gouesse Date: Sun, 9 Aug 2015 17:59:43 +0200 Subject: Deprecates SGIImage.isSGIImage() and DDSImage.isDDSImage(), see the bug report 1042 --- .../com/jogamp/opengl/util/texture/spi/DDSImage.java | 4 +++- .../com/jogamp/opengl/util/texture/spi/SGIImage.java | 17 +++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'src/jogl/classes/com') diff --git a/src/jogl/classes/com/jogamp/opengl/util/texture/spi/DDSImage.java b/src/jogl/classes/com/jogamp/opengl/util/texture/spi/DDSImage.java index a71458837..36c44a409 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/texture/spi/DDSImage.java +++ b/src/jogl/classes/com/jogamp/opengl/util/texture/spi/DDSImage.java @@ -51,10 +51,10 @@ import java.nio.ByteOrder; import java.nio.channels.FileChannel; import com.jogamp.opengl.GL; - import com.jogamp.common.nio.Buffers; import com.jogamp.common.util.IOUtil; import com.jogamp.opengl.util.GLBuffers; +import com.jogamp.opengl.util.texture.ImageIOUtil; /** A reader and writer for DirectDraw Surface (.dds) files, which are used to describe textures. These files can contain multiple mipmap @@ -246,7 +246,9 @@ public class DDSImage { @param in Stream to check @return true if input stream is DDS image or false otherwise @throws java.io.IOException if an I/O exception occurred + @deprecated rather call {@link ImageIOUtil#getFileSuffix(InputStream)} */ + @Deprecated public static boolean isDDSImage(InputStream in) throws IOException { if (!(in instanceof BufferedInputStream)) { in = new BufferedInputStream(in); diff --git a/src/jogl/classes/com/jogamp/opengl/util/texture/spi/SGIImage.java b/src/jogl/classes/com/jogamp/opengl/util/texture/spi/SGIImage.java index 9088dc48e..ff8167bb0 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/texture/spi/SGIImage.java +++ b/src/jogl/classes/com/jogamp/opengl/util/texture/spi/SGIImage.java @@ -40,8 +40,9 @@ package com.jogamp.opengl.util.texture.spi; import java.io.*; -import com.jogamp.opengl.*; +import com.jogamp.opengl.*; +import com.jogamp.opengl.util.texture.ImageIOUtil; import com.jogamp.common.util.IOUtil; /**

Reads and writes SGI RGB/RGBA images.

@@ -190,11 +191,15 @@ public class SGIImage { return image; } - /** Determines from the magic number whether the given InputStream - points to an SGI RGB image. The given InputStream must return - true from markSupported() and support a minimum of two bytes - of read-ahead. */ - public static boolean isSGIImage(InputStream in) throws IOException { + /** + * Determines from the magic number whether the given InputStream points to + * an SGI RGB image. The given InputStream must return true from + * markSupported() and support a minimum of two bytes of read-ahead. + * + * @deprecated rather call {@link ImageIOUtil#getFileSuffix(InputStream)} + */ + @Deprecated + public static boolean isSGIImage(InputStream in) throws IOException { if (!(in instanceof BufferedInputStream)) { in = new BufferedInputStream(in); } -- cgit v1.2.3