summaryrefslogtreecommitdiff
path: root/javax/imageio
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2004-12-07 15:03:51 +0000
committerMichael Koch <konqueror@gmx.de>2004-12-07 15:03:51 +0000
commit31b7d2370b837ec9354577144032ac1001d14ee1 (patch)
tree77e4d3de78b222d2aa1d4fd526d90f4f49daba44 /javax/imageio
parent04a9a265bd68c1f56ee39ce36aa1469f033a964e (diff)
downloadclasspath-31b7d2370b837ec9354577144032ac1001d14ee1.tar.gz
2004-12-07 Michael Koch <konqueror@gmx.de>
* javax/imageio/stream/FileCacheImageInputStream.java, javax/imageio/stream/FileCacheImageOutputStream.java, javax/imageio/stream/FileImageInputStream.java, javax/imageio/stream/ImageInputStreamImpl.java, javax/imageio/stream/ImageOutputStreamImpl.java, javax/imageio/stream/MemoryCacheImageInputStream.java, javax/imageio/stream/MemoryCacheImageOutputStream.java: Added all missing methods in javax.imageio.stream.
Diffstat (limited to 'javax/imageio')
-rw-r--r--javax/imageio/stream/FileCacheImageInputStream.java18
-rw-r--r--javax/imageio/stream/FileCacheImageOutputStream.java32
-rw-r--r--javax/imageio/stream/FileImageInputStream.java23
-rw-r--r--javax/imageio/stream/ImageInputStreamImpl.java360
-rw-r--r--javax/imageio/stream/ImageOutputStreamImpl.java180
-rw-r--r--javax/imageio/stream/MemoryCacheImageInputStream.java40
-rw-r--r--javax/imageio/stream/MemoryCacheImageOutputStream.java54
7 files changed, 701 insertions, 6 deletions
diff --git a/javax/imageio/stream/FileCacheImageInputStream.java b/javax/imageio/stream/FileCacheImageInputStream.java
index 49827d4e0..a8db4779b 100644
--- a/javax/imageio/stream/FileCacheImageInputStream.java
+++ b/javax/imageio/stream/FileCacheImageInputStream.java
@@ -45,7 +45,7 @@ import java.io.InputStream;
/**
* @author Michael Koch (konqueror@gmx.de)
*/
-public class FileCacheImageInputStream
+public class FileCacheImageInputStream extends ImageInputStreamImpl
{
private InputStream stream;
private File cacheDir;
@@ -90,4 +90,20 @@ public class FileCacheImageInputStream
{
return false;
}
+
+ public int read()
+ throws IOException
+ {
+ checkStreamClosed();
+ setBitOffset(0);
+ return stream.read();
+ }
+
+ public int read(byte[] data, int offset, int len)
+ throws IOException
+ {
+ checkStreamClosed();
+ setBitOffset(0);
+ return stream.read(data, offset, len);
+ }
}
diff --git a/javax/imageio/stream/FileCacheImageOutputStream.java b/javax/imageio/stream/FileCacheImageOutputStream.java
index f8bb31002..912b368d1 100644
--- a/javax/imageio/stream/FileCacheImageOutputStream.java
+++ b/javax/imageio/stream/FileCacheImageOutputStream.java
@@ -45,7 +45,7 @@ import java.io.OutputStream;
/**
* @author Michael Koch (konqueror@gmx.de)
*/
-public class FileCacheImageOutputStream
+public class FileCacheImageOutputStream extends ImageOutputStreamImpl
{
private OutputStream stream;
private File cacheDir;
@@ -90,4 +90,34 @@ public class FileCacheImageOutputStream
{
return false;
}
+
+ public int read()
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public int read(byte[] data, int offset, int len)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public void write(byte[] data, int offset, int len)
+ throws IOException
+ {
+ checkStreamClosed();
+ // FIXME: Flush pending bits.
+ stream.write(data, offset, len);
+ }
+
+ public void write(int value)
+ throws IOException
+ {
+ checkStreamClosed();
+ // FIXME: Flush pending bits.
+ stream.write(value);
+ }
}
diff --git a/javax/imageio/stream/FileImageInputStream.java b/javax/imageio/stream/FileImageInputStream.java
index 67fd07518..168463255 100644
--- a/javax/imageio/stream/FileImageInputStream.java
+++ b/javax/imageio/stream/FileImageInputStream.java
@@ -46,7 +46,7 @@ import java.io.RandomAccessFile;
/**
* @author Michael Koch (konqueror@gmx.de)
*/
-public class FileImageInputStream
+public class FileImageInputStream extends ImageInputStreamImpl
{
private RandomAccessFile file;
@@ -84,4 +84,25 @@ public class FileImageInputStream
return -1L;
}
}
+
+ public int read()
+ throws IOException
+ {
+ setBitOffset(0);
+ return file.read();
+ }
+
+ public int read(byte[] data, int offset, int len)
+ throws IOException
+ {
+ setBitOffset(0);
+ return file.read(data, offset, len);
+ }
+
+ public void seek(long position)
+ throws IOException
+ {
+ super.seek(position);
+ file.seek(position);
+ }
}
diff --git a/javax/imageio/stream/ImageInputStreamImpl.java b/javax/imageio/stream/ImageInputStreamImpl.java
index 3a5d6dcb6..dbe6d1aaa 100644
--- a/javax/imageio/stream/ImageInputStreamImpl.java
+++ b/javax/imageio/stream/ImageInputStreamImpl.java
@@ -38,8 +38,11 @@ exception statement from your version. */
package javax.imageio.stream;
+import java.io.DataInputStream;
+import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteOrder;
+import java.util.Stack;
/**
* @author Michael Koch (konqueror@gmx.de)
@@ -47,6 +50,9 @@ import java.nio.ByteOrder;
public abstract class ImageInputStreamImpl implements ImageInputStream
{
private boolean closed;
+ private Stack markStack = new Stack();
+
+ byte[] buffer = new byte[8];
protected int bitOffset;
protected ByteOrder byteOrder;
@@ -99,6 +105,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream
public int getBitOffset()
throws IOException
{
+ checkClosed();
return bitOffset;
}
@@ -115,6 +122,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream
public long getStreamPosition()
throws IOException
{
+ checkClosed();
return streamPos;
}
@@ -138,6 +146,18 @@ public abstract class ImageInputStreamImpl implements ImageInputStream
return -1L;
}
+ public void mark()
+ {
+ try
+ {
+ markStack.push(new Long(getStreamPosition()));
+ }
+ catch (IOException e)
+ {
+ // Ignored.
+ }
+ }
+
public abstract int read()
throws IOException;
@@ -150,8 +170,346 @@ public abstract class ImageInputStreamImpl implements ImageInputStream
public abstract int read(byte[] data, int offset, int len)
throws IOException;
- public void setByteOrder (ByteOrder byteOrder)
+ public int readBit()
+ throws IOException
+ {
+ checkClosed();
+
+ // Calc new bit offset here, readByte resets it.
+ int newOffset = (bitOffset + 1) & 0x7;
+
+ byte data = readByte();
+
+ if (bitOffset != 0)
+ {
+ seek(getStreamPosition() - 1);
+ data = (byte) (data >> (8 - newOffset));
+ }
+
+ bitOffset = newOffset;
+ return data & 0x1;
+ }
+
+ public long readBits(int numBits)
+ throws IOException
+ {
+ checkClosed();
+
+ if (numBits < 0 || numBits > 64)
+ throw new IllegalArgumentException();
+
+ if (numBits == 0)
+ return 0L;
+
+ long bits = 0L;
+
+ for (int i = 0; i < numBits; i++)
+ {
+ bits <<= 1;
+ bits |= readBit();
+ }
+
+ return bits;
+ }
+
+ public boolean readBoolean()
+ throws IOException
+ {
+ byte data = readByte();
+ return data != 0;
+ }
+
+ public byte readByte()
+ throws IOException
+ {
+ int data = read();
+
+ if (data == -1)
+ throw new EOFException();
+
+ return (byte) data;
+ }
+
+ public void readBytes(IIOByteBuffer buffer, int len)
+ throws IOException
+ {
+ int result = read(buffer.getData(), buffer.getOffset(), len);
+
+ if (result == -1 || result < len)
+ throw new EOFException();
+
+ buffer.setLength(len);
+ }
+
+ public char readChar()
+ throws IOException
+ {
+ return (char) readShort();
+ }
+
+ public double readDouble()
+ throws IOException
+ {
+ return (double) readLong();
+ }
+
+ public float readFloat()
+ throws IOException
+ {
+ return (float) readInt();
+ }
+
+ public void readFully(byte[] data)
+ throws IOException
+ {
+ readFully(data, 0, data.length);
+ }
+
+ public void readFully(byte[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readByte();
+ }
+
+ public void readFully(char[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readChar();
+ }
+
+ public void readFully(double[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readDouble();
+ }
+
+ public void readFully(float[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readFloat();
+ }
+
+ public void readFully(int[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readInt();
+ }
+
+ public void readFully(long[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readLong();
+ }
+
+ public void readFully(short[] data, int offset, int len)
+ throws IOException
+ {
+ for (int i = 0; i < len; ++i)
+ data[offset + i] = readShort();
+ }
+
+ public int readInt()
+ throws IOException
+ {
+ int result = read(buffer, 0, 4);
+
+ if (result == -1)
+ throw new EOFException();
+
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ return ((buffer[0] & 0xff)
+ + (buffer[1] << 8)
+ + (buffer[2] << 16)
+ + (buffer[3] << 24));
+ }
+
+ return ((buffer[4] << 24)
+ + (buffer[3] << 16)
+ + (buffer[2] << 8)
+ + (buffer[1] & 0xff));
+ }
+
+ public String readLine()
+ throws IOException
+ {
+ checkClosed();
+
+ int c = -1;
+ boolean eol = false;
+ StringBuffer buffer = new StringBuffer();
+
+ while (!eol && (c = read()) != -1)
+ {
+ switch(c)
+ {
+ case '\r':
+ // Consume following \n'
+ long oldPosition = getStreamPosition();
+ if (read() != '\n')
+ seek(oldPosition);
+ case '\n':
+ eol = true;
+ break;
+ default:
+ buffer.append((char) c);
+ break;
+ }
+ }
+
+ if (c == -1 && buffer.length() == 0)
+ return null;
+
+ return buffer.toString();
+ }
+
+ public long readLong()
+ throws IOException
+ {
+ int result = read(buffer, 0, 8);
+
+ if (result == -1)
+ throw new EOFException();
+
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ return ((buffer[0] & 0xff)
+ + (((buffer[1] & 0xff)) << 8)
+ + (((buffer[2] & 0xff)) << 16)
+ + (((buffer[3] & 0xffL)) << 24)
+ + (((buffer[4] & 0xffL)) << 32)
+ + (((buffer[5] & 0xffL)) << 40)
+ + (((buffer[6] & 0xffL)) << 48)
+ + (((long) buffer[7]) << 56));
+ }
+
+ return ((((long) buffer[7]) << 56)
+ + ((buffer[6] & 0xffL) << 48)
+ + ((buffer[5] & 0xffL) << 40)
+ + ((buffer[4] & 0xffL) << 32)
+ + ((buffer[3] & 0xffL) << 24)
+ + ((buffer[2] & 0xff) << 16)
+ + ((buffer[1] & 0xff) << 8)
+ + (buffer[0] & 0xff));
+ }
+
+ public short readShort()
+ throws IOException
+ {
+ int result = read(buffer, 0, 2);
+
+ if (result == -1)
+ throw new EOFException();
+
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ return (short) ((buffer[0] & 0xff)
+ + (buffer[1] << 8));
+ }
+
+ return (short) ((buffer[0] << 8)
+ + (buffer[1] & 0xff));
+ }
+
+ public int readUnsignedByte()
+ throws IOException
+ {
+ return readByte() & 0xff;
+ }
+
+ public long readUnsignedInt()
+ throws IOException
+ {
+ return readInt() & 0xffffffff;
+ }
+
+ public int readUnsignedShort()
+ throws IOException
+ {
+ return readShort() & 0xffff;
+ }
+
+ public String readUTF()
+ throws IOException
+ {
+ checkClosed();
+
+ String data;
+ ByteOrder old = getByteOrder();
+ setByteOrder(ByteOrder.BIG_ENDIAN); // Strings are always big endian.
+
+ try
+ {
+ data = DataInputStream.readUTF(this);
+ }
+ finally
+ {
+ setByteOrder(old);
+ }
+
+ return data;
+ }
+
+ public void reset()
+ throws IOException
+ {
+ checkClosed();
+
+ long mark = ((Long) markStack.pop()).longValue();
+ seek(mark);
+ }
+
+ public void seek(long position)
+ throws IOException
+ {
+ checkClosed();
+
+ if (position < getFlushedPosition())
+ throw new IndexOutOfBoundsException("position < flushed position");
+
+ streamPos = position;
+ bitOffset = 0;
+ }
+
+ public void setBitOffset (int bitOffset)
+ throws IOException
+ {
+ checkClosed();
+
+ if (bitOffset < 0 || bitOffset > 7)
+ throw new IllegalArgumentException();
+
+ this.bitOffset = bitOffset;
+ }
+
+ public void setByteOrder(ByteOrder byteOrder)
{
this.byteOrder = byteOrder;
}
+
+ public int skipBytes(int num)
+ throws IOException
+ {
+ checkClosed();
+
+ seek(getStreamPosition() + num);
+ bitOffset = 0;
+ return num;
+ }
+
+ public long skipBytes(long num)
+ throws IOException
+ {
+ checkClosed();
+
+ seek(getStreamPosition() + num);
+ bitOffset = 0;
+ return num;
+ }
}
diff --git a/javax/imageio/stream/ImageOutputStreamImpl.java b/javax/imageio/stream/ImageOutputStreamImpl.java
index d60094319..214925545 100644
--- a/javax/imageio/stream/ImageOutputStreamImpl.java
+++ b/javax/imageio/stream/ImageOutputStreamImpl.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package javax.imageio.stream;
import java.io.IOException;
+import java.nio.ByteOrder;
/**
* @author Michael Koch (konqueror@gmx.de)
@@ -51,6 +52,13 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
// Do nothing here.
}
+ protected void flushBits()
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
public void write(byte[] data)
throws IOException
{
@@ -62,4 +70,176 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
public abstract void write(int value)
throws IOException;
+
+ public void writeBit(int bit)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public void writeBits(long bits, int numBits)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public void writeBoolean(boolean value)
+ throws IOException
+ {
+ writeByte(value ? 1 : 0);
+ }
+
+ public void writeByte(int value)
+ throws IOException
+ {
+ write(value & 0xff);
+ }
+
+ public void writeBytes(String data)
+ throws IOException
+ {
+ write(data.getBytes());
+ }
+
+ public void writeChar(int value)
+ throws IOException
+ {
+ writeShort((short) value);
+ }
+
+ public void writeChars(char[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeChar(data[offset + i]);
+ }
+
+ public void writeChars(String data)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public void writeDouble(double value)
+ throws IOException
+ {
+ writeLong((long) value);
+ }
+
+ public void writeDoubles(double[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeDouble(data[offset + i]);
+ }
+
+ public void writeFloat(float value)
+ throws IOException
+ {
+ writeInt((int) value);
+ }
+
+ public void writeFloats(float[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeFloat(data[offset + i]);
+ }
+
+ public void writeInt(int value)
+ throws IOException
+ {
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ buffer[0] = ((byte) value);
+ buffer[1] = ((byte) (value >> 8));
+ buffer[2] = ((byte) (value >> 16));
+ buffer[3] = ((byte) (value >> 24));
+ }
+ else
+ {
+ buffer[0] = ((byte) (value >> 24));
+ buffer[1] = ((byte) (value >> 16));
+ buffer[2] = ((byte) (value >> 8));
+ buffer[3] = ((byte) value);
+ }
+
+ write(buffer, 0, 4);
+ }
+
+ public void writeInts(int[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeInt(data[offset + i]);
+ }
+
+ public void writeLong(long value)
+ throws IOException
+ {
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ buffer[0] = ((byte) value);
+ buffer[1] = ((byte) (value >> 8));
+ buffer[2] = ((byte) (value >> 16));
+ buffer[3] = ((byte) (value >> 24));
+ buffer[4] = ((byte) (value >> 32));
+ buffer[5] = ((byte) (value >> 40));
+ buffer[6] = ((byte) (value >> 48));
+ buffer[7] = ((byte) (value >> 56));
+ }
+ else
+ {
+ buffer[0] = ((byte) (value >> 56));
+ buffer[1] = ((byte) (value >> 48));
+ buffer[2] = ((byte) (value >> 40));
+ buffer[3] = ((byte) (value >> 32));
+ buffer[4] = ((byte) (value >> 24));
+ buffer[5] = ((byte) (value >> 16));
+ buffer[6] = ((byte) (value >> 8));
+ buffer[7] = ((byte) value);
+ }
+
+ write(buffer, 0, 8);
+ }
+
+ public void writeLongs(long[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeLong(data[offset + i]);
+ }
+
+ public void writeShort(int value)
+ throws IOException
+ {
+ if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
+ {
+ buffer[0] = ((byte) value);
+ buffer[1] = ((byte) (value >> 8));
+ }
+ else
+ {
+ buffer[0] = ((byte) (value >> 8));
+ buffer[1] = ((byte) value);
+ }
+
+ write(buffer, 0, 2);
+ }
+
+ public void writeShorts(short[] data, int offset, int len)
+ throws IOException
+ {
+ for(int i = 0; i < len; ++len)
+ writeShort(data[offset + i]);
+ }
+
+ public void writeUTF(String data)
+ throws IOException
+ {
+ throw new Error("not implemented");
+ }
}
diff --git a/javax/imageio/stream/MemoryCacheImageInputStream.java b/javax/imageio/stream/MemoryCacheImageInputStream.java
index c7ca6d6e0..0318f5670 100644
--- a/javax/imageio/stream/MemoryCacheImageInputStream.java
+++ b/javax/imageio/stream/MemoryCacheImageInputStream.java
@@ -38,11 +38,35 @@ exception statement from your version. */
package javax.imageio.stream;
+import java.io.InputStream;
+import java.io.IOException;
+
/**
* @author Michael Koch (konqueror@gmx.de)
*/
-public class MemoryCacheImageInputStream
+public class MemoryCacheImageInputStream extends ImageInputStreamImpl
{
+ private InputStream stream;
+
+ public MemoryCacheImageInputStream(InputStream stream)
+ {
+ this.stream = stream;
+ }
+
+ public void close()
+ throws IOException
+ {
+ super.close();
+ stream.close();
+ }
+
+ public void flushBefore(long position)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
public boolean isCached()
{
return true;
@@ -57,4 +81,18 @@ public class MemoryCacheImageInputStream
{
return true;
}
+
+ public int read()
+ throws IOException
+ {
+ setBitOffset(0);
+ return stream.read();
+ }
+
+ public int read(byte[] data, int offset, int len)
+ throws IOException
+ {
+ setBitOffset(0);
+ return stream.read(data, offset, len);
+ }
}
diff --git a/javax/imageio/stream/MemoryCacheImageOutputStream.java b/javax/imageio/stream/MemoryCacheImageOutputStream.java
index b91fd6663..a21efae98 100644
--- a/javax/imageio/stream/MemoryCacheImageOutputStream.java
+++ b/javax/imageio/stream/MemoryCacheImageOutputStream.java
@@ -38,11 +38,35 @@ exception statement from your version. */
package javax.imageio.stream;
+import java.io.IOException;
+import java.io.OutputStream;
+
/**
* @author Michael Koch (konqueror@gmx.de)
*/
-public class MemoryCacheImageOutputStream
+public class MemoryCacheImageOutputStream extends ImageOutputStreamImpl
{
+ private OutputStream stream;
+
+ public MemoryCacheImageOutputStream(OutputStream stream)
+ {
+ this.stream = stream;
+ }
+
+ public void close()
+ throws IOException
+ {
+ super.close();
+ stream.close();
+ }
+
+ public void flushBefore(long position)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
public boolean isCached()
{
return true;
@@ -57,4 +81,32 @@ public class MemoryCacheImageOutputStream
{
return true;
}
+
+ public int read()
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public int read (byte[] data, int offset, int len)
+ throws IOException
+ {
+ // FIXME: Implement me.
+ throw new Error("not implemented");
+ }
+
+ public void write(byte[] data, int offset, int len)
+ throws IOException
+ {
+ // FIXME: Flush pending bits.
+ stream.write(data, offset, len);
+ }
+
+ public void write(int value)
+ throws IOException
+ {
+ // FIXME: Flush pending bits.
+ stream.write(value);
+ }
}