diff options
author | eschaeffer <eschaeffer@unknown> | 2000-08-11 14:27:10 +0000 |
---|---|---|
committer | eschaeffer <eschaeffer@unknown> | 2000-08-11 14:27:10 +0000 |
commit | 0d4448c3cd086c5c949e40f5d8ad4ffd0f40c831 (patch) | |
tree | 870eb455b336ea30e18edd050dc5d5ff8a945df1 /src/org/apache/fop/image/analyser | |
parent | 8ed9575e48d935a2c55228edae7d1572ae9e19a7 (diff) | |
download | xmlgraphics-fop-0d4448c3cd086c5c949e40f5d8ad4ffd0f40c831.tar.gz xmlgraphics-fop-0d4448c3cd086c5c949e40f5d8ad4ffd0f40c831.zip |
ImageReader implementing class for JPEG images
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193631 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/image/analyser')
-rw-r--r-- | src/org/apache/fop/image/analyser/JPEGReader.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/org/apache/fop/image/analyser/JPEGReader.java b/src/org/apache/fop/image/analyser/JPEGReader.java new file mode 100644 index 000000000..e7370ae4e --- /dev/null +++ b/src/org/apache/fop/image/analyser/JPEGReader.java @@ -0,0 +1,161 @@ +/* + ============================================================================ + The Apache Software License, Version 1.1 + ============================================================================ + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + Redistribution and use in source and binary forms, with or without modifica- + tion, 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. + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. + 4. The names "Fop" and "Apache Software Foundation" must not be used to + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. + 5. Products derived from this software may not be called "Apache", nor may + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 THE + APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + DING, 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. + This software consists of voluntary contributions made by many individuals + on behalf of the Apache Software Foundation and was originally created by + James Tauber <jtauber@jtauber.com>. For more information on the Apache + Software Foundation, please see <http://www.apache.org/>. + */ + +package org.apache.fop.image.analyser; + +// Java +import java.io.BufferedInputStream; +import java.io.IOException; + +/** + * ImageReader object for JPEG image type. + * @author Pankaj Narula + * @version 1.0 + */ +public class JPEGReader extends AbstractImageReader { + /** + * Only SOFn and APPn markers are defined as SOFn is needed for the height and + * width search. APPn is also defined because if the JPEG contains thumbnails + * the dimensions of the thumnail would also be after the SOFn marker enclosed + * inside the APPn marker. And we don't want to confuse those dimensions with + * the image dimensions. + */ + static protected final int MARK = 0xff; //Beginneing of a Marker + static protected final int NULL = 0x00; //Special case for 0xff00 + static protected final int SOF1 = 0xc0; //Baseline DCT + static protected final int SOF2 = 0xc1; //Extended Sequential DCT + static protected final int SOF3 = 0xc2; //Progrssive DCT only PDF 1.3 + static protected final int SOFA = 0xca; //Progressice DCT only PDF 1.3 + static protected final int APP0 = 0xe0; //Application marker, JFIF + static protected final int APPF = 0xef; //Application marker + static protected final int SOS = 0xda; //Start of Scan + static protected final int SOI = 0xd8; //start of Image + static protected final int JPG_SIG_LENGTH = 2; + + protected byte[] header; + + public boolean verifySignature(BufferedInputStream fis) + throws IOException { + this.imageStream = fis; + this.setDefaultHeader(); + boolean supported = ((header[0] == (byte) 0xff) && + (header[1] == (byte) 0xd8)); + if (supported) { + setDimension(); + return true; + } else + return false; + } + + public String getMimeType() { + return "image/jpeg"; + } + + protected void setDefaultHeader() throws IOException { + this.header = new byte[JPG_SIG_LENGTH]; + try { + this.imageStream.mark(JPG_SIG_LENGTH + 1); + this.imageStream.read(header); + this.imageStream.reset(); + } catch (IOException ex) { + try { + this.imageStream.reset(); + } catch (IOException exbis) {} + throw ex; + } + } + + protected void setDimension() throws IOException { + try { + int marker = NULL; + long length, skipped; + outer: + while (imageStream.available() > 0) { + while ((marker = imageStream.read()) != MARK) { + ; + } + do { + marker = imageStream.read(); + } while (marker == MARK) + ; + switch (marker) { + case SOI : + break; + case NULL: + break; + case SOF1: + case SOF2: + case SOF3: //SOF3 and SOFA are only supported by PDF 1.3 + case SOFA: + this.skip(3); + this.height = this.read2bytes(); + this.width = this.read2bytes(); + break outer; + default: + length = this.read2bytes(); + skipped = this.skip(length - 2); + if (skipped != length - 2) + throw new IOException("Skipping Error"); + } + } + } catch (IOException ioe) { + try { + this.imageStream.reset(); + } catch (IOException exbis) {} + throw ioe; + } + } + + protected int read2bytes() throws IOException { + int byte1 = imageStream.read(); + int byte2 = imageStream.read(); + return (int)((byte1 << 8) | byte2); + } + + protected long skip(long n) throws IOException { + long discarded = 0; + while (discarded != n) { + imageStream.read(); + discarded++; + } + return discarded; //scope for exception + } +} + |