diff options
author | Jeremias Maerki <jeremias@apache.org> | 2004-08-16 19:33:19 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2004-08-16 19:33:19 +0000 |
commit | 98a82065accd4dfb081daa8429f03f0fed993dff (patch) | |
tree | c0bfd0ef9dcd880fc1a025f2394bddca264d454e /src/java/org/apache/fop/image/analyser/JPEGReader.java | |
parent | 153e0e1d8dd22414d63ba97aefbceb47ec454874 (diff) | |
download | xmlgraphics-fop-98a82065accd4dfb081daa8429f03f0fed993dff.tar.gz xmlgraphics-fop-98a82065accd4dfb081daa8429f03f0fed993dff.zip |
Fix JPEG with many long APPS markers.
Also defers the creation of the original node until it absolutely has to thus avoiding decoding the JPEG file and creating the raster unless needed.
Submitted by: Thomas DeWeese <Thomas.DeWeese.at.Kodak.com>
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197881 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/image/analyser/JPEGReader.java')
-rw-r--r-- | src/java/org/apache/fop/image/analyser/JPEGReader.java | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/java/org/apache/fop/image/analyser/JPEGReader.java b/src/java/org/apache/fop/image/analyser/JPEGReader.java index 21adf0c60..3aafbb8bc 100644 --- a/src/java/org/apache/fop/image/analyser/JPEGReader.java +++ b/src/java/org/apache/fop/image/analyser/JPEGReader.java @@ -98,17 +98,35 @@ public class JPEGReader implements ImageReader { private FopImage.ImageInfo getDimension(InputStream imageStream) throws IOException { FopImage.ImageInfo info = new FopImage.ImageInfo(); try { - imageStream.mark(imageStream.available()); + int pos=0, avail = imageStream.available(); + imageStream.mark(avail); int marker = NULL; long length, skipped; outer: - while (imageStream.available() > 0) { - while ((marker = imageStream.read()) != MARK) { - //nop, simply skip + while (true) { + do { + if (avail == 0) { + imageStream.reset(); + avail = 2*pos; + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; } + marker = imageStream.read(); + pos++; avail--; + } while (marker != MARK); + do { + if (avail == 0) { + imageStream.reset(); + avail = 2*pos; + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } marker = imageStream.read(); + pos++; avail--; } while (marker == MARK); switch (marker) { @@ -120,13 +138,42 @@ outer: case SOF2: case SOF3: // SOF3 and SOFA are only supported by PDF 1.3 case SOFA: + while (avail < 7) { + imageStream.reset(); + avail = 2*pos; + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } this.skip(imageStream, 3); + pos+=3; avail-=3; info.height = this.read2bytes(imageStream); + pos+=2; avail-=2; info.width = this.read2bytes(imageStream); + pos+=2; avail-=2; break outer; default: + while (avail < 2) { + imageStream.reset(); + avail = 2*pos; + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } length = this.read2bytes(imageStream); + pos+=2; avail-=2; + if (avail < length) { + imageStream.reset(); + avail = 2*pos; + if (avail < pos+length+10) { + avail = (int)(pos+length+10); + } + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } skipped = this.skip(imageStream, length - 2); + pos += skipped; avail -= skipped; if (skipped != length - 2) { throw new IOException("Skipping Error"); } |