From 0170ee36a9ef38352810f9f78d9f7a7f5a106e49 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Mon, 21 Aug 2017 22:03:18 +0200 Subject: [PATCH] Fix streamPos/bitPos issue in SubImageOutputStream. --- .../imageio/stream/SubImageOutputStream.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/stream/SubImageOutputStream.java b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/stream/SubImageOutputStream.java index 2a24eef4..e72cde21 100644 --- a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/stream/SubImageOutputStream.java +++ b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/stream/SubImageOutputStream.java @@ -4,6 +4,8 @@ import javax.imageio.stream.ImageOutputStream; import javax.imageio.stream.ImageOutputStreamImpl; import java.io.IOException; +import static com.twelvemonkeys.lang.Validate.notNull; + /** * ImageInputStream that writes through a delegate, but keeps local position and bit offset. * Note: Flushing or closing this stream will *not* have an effect on the delegate. @@ -14,29 +16,47 @@ import java.io.IOException; */ public class SubImageOutputStream extends ImageOutputStreamImpl { private final ImageOutputStream stream; + private final long startPos; - public SubImageOutputStream(final ImageOutputStream stream) { - this.stream = stream; + public SubImageOutputStream(final ImageOutputStream stream) throws IOException { + this.stream = notNull(stream, "stream"); + startPos = stream.getStreamPosition(); + } + + @Override + public void seek(long pos) throws IOException { + super.seek(pos); + stream.seek(startPos + pos); } @Override public void write(int b) throws IOException { + flushBits(); + stream.write(b); + streamPos++; } @Override public void write(byte[] b, int off, int len) throws IOException { + flushBits(); stream.write(b, off, len); + streamPos += len; } @Override public int read() throws IOException { + bitOffset = 0; + streamPos++; return stream.read(); } @Override public int read(byte[] b, int off, int len) throws IOException { - return stream.read(b, off, len); + bitOffset = 0; + int count = stream.read(b, off, len); + streamPos += count; + return count; } @Override