diff options
author | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2005-01-16 15:14:51 +0000 |
---|---|---|
committer | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2005-01-16 15:14:51 +0000 |
commit | f3bca904add8a1e256b2c245c169e8e5a69efcd7 (patch) | |
tree | 4b18335ee421c49bcc9a418d9abc4193634986f7 /javax/imageio | |
parent | e38101c185b90d301bac951b84a77ed711d18e54 (diff) | |
download | classpath-f3bca904add8a1e256b2c245c169e8e5a69efcd7.tar.gz |
2005-01-16 Andrew John Hughes <gnu_andrew@member.fsf.org>
Final merge of HEAD patches to generics branch
All changes are listed in merged Changelog.
In addition,
* java/lang/System.java:
(getenv()): changed Runtime.securityManager to
SecurityManager.current
(getenv(String)): likewise
(remove(String)): pointed to SystemProperties
* gnu/classpath/SystemProperties.java:
(remove(String)): implemented and documented
Diffstat (limited to 'javax/imageio')
-rw-r--r-- | javax/imageio/IIOParam.java | 14 | ||||
-rw-r--r-- | javax/imageio/ImageIO.java | 146 | ||||
-rw-r--r-- | javax/imageio/ImageReadParam.java | 16 | ||||
-rw-r--r-- | javax/imageio/ImageReader.java | 39 | ||||
-rw-r--r-- | javax/imageio/ImageWriter.java | 13 | ||||
-rw-r--r-- | javax/imageio/spi/IIORegistry.java | 8 | ||||
-rw-r--r-- | javax/imageio/stream/FileCacheImageInputStream.java | 18 | ||||
-rw-r--r-- | javax/imageio/stream/FileCacheImageOutputStream.java | 32 | ||||
-rw-r--r-- | javax/imageio/stream/FileImageInputStream.java | 23 | ||||
-rw-r--r-- | javax/imageio/stream/FileImageOutputStream.java | 45 | ||||
-rw-r--r-- | javax/imageio/stream/ImageInputStreamImpl.java | 360 | ||||
-rw-r--r-- | javax/imageio/stream/ImageOutputStreamImpl.java | 180 | ||||
-rw-r--r-- | javax/imageio/stream/MemoryCacheImageInputStream.java | 40 | ||||
-rw-r--r-- | javax/imageio/stream/MemoryCacheImageOutputStream.java | 54 |
14 files changed, 952 insertions, 36 deletions
diff --git a/javax/imageio/IIOParam.java b/javax/imageio/IIOParam.java index bbab1cf79..1a5912399 100644 --- a/javax/imageio/IIOParam.java +++ b/javax/imageio/IIOParam.java @@ -141,6 +141,11 @@ public abstract class IIOParam this.destinationOffset = destinationOffset; } + public void setSourceBands(int[] sourceBands) + { + this.sourceBands = sourceBands; + } + public void setSourceRegion(Rectangle sourceRegion) { if (sourceRegion != null @@ -154,4 +159,13 @@ public abstract class IIOParam this.sourceRegion = sourceRegion; } + + public void setSourceSubsampling(int sourceXSubsampling, int sourceYSubsampling, + int subsamplingXOffset, int subsamplingYOffset) + { + this.sourceXSubsampling = sourceXSubsampling; + this.sourceYSubsampling = sourceYSubsampling; + this.subsamplingXOffset = subsamplingXOffset; + this.subsamplingYOffset = subsamplingYOffset; + } } diff --git a/javax/imageio/ImageIO.java b/javax/imageio/ImageIO.java index 6aa555891..3d74ae074 100644 --- a/javax/imageio/ImageIO.java +++ b/javax/imageio/ImageIO.java @@ -38,8 +38,15 @@ exception statement from your version. */ package javax.imageio; +import java.awt.image.RenderedImage; +import java.awt.image.BufferedImage; +import java.net.URL; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -48,6 +55,10 @@ import javax.imageio.spi.IIORegistry; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.spi.ImageWriterSpi; import javax.imageio.spi.ServiceRegistry; +import javax.imageio.stream.ImageOutputStream; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.MemoryCacheImageInputStream; +import javax.imageio.stream.MemoryCacheImageOutputStream; public final class ImageIO { @@ -142,14 +153,14 @@ public final class ImageIO public boolean filter(Object provider) { - if (provider instanceof ImageReaderSpi) + if (provider instanceof ImageWriterSpi) { - ImageReaderSpi spi = (ImageReaderSpi) provider; + ImageWriterSpi spi = (ImageWriterSpi) provider; String[] formatNames = spi.getFormatNames(); for (int i = formatNames.length - 1; i >= 0; --i) - if (formatName.equals(formatNames[i])) - return true; + if (formatName.equals(formatNames[i])) + return true; } return false; @@ -167,7 +178,7 @@ public final class ImageIO public boolean filter(Object provider) { - if (provider instanceof ImageReaderSpi) + if (provider instanceof ImageWriterSpi) { ImageWriterSpi spi = (ImageWriterSpi) provider; String[] mimetypes = spi.getMIMETypes(); @@ -192,7 +203,7 @@ public final class ImageIO public boolean filter(Object provider) { - if (provider instanceof ImageReaderSpi) + if (provider instanceof ImageWriterSpi) { ImageWriterSpi spi = (ImageWriterSpi) provider; String[] suffixes = spi.getFileSuffixes(); @@ -209,10 +220,12 @@ public final class ImageIO private static final class ImageReaderIterator implements Iterator { Iterator it; + Object readerExtension; - public ImageReaderIterator(Iterator it) + public ImageReaderIterator(Iterator it, Object readerExtension) { this.it = it; + this.readerExtension = readerExtension; } public boolean hasNext() @@ -224,7 +237,7 @@ public final class ImageIO { try { - return ((ImageReaderSpi) it.next()).createReaderInstance(); + return ((ImageReaderSpi) it.next()).createReaderInstance(readerExtension); } catch (IOException e) { @@ -241,10 +254,12 @@ public final class ImageIO private static final class ImageWriterIterator implements Iterator { Iterator it; + Object writerExtension; - public ImageWriterIterator(Iterator it) + public ImageWriterIterator(Iterator it, Object writerExtension) { this.it = it; + this.writerExtension = writerExtension; } public boolean hasNext() @@ -256,7 +271,7 @@ public final class ImageIO { try { - return ((ImageWriterSpi) it.next()).createWriterInstance(); + return ((ImageWriterSpi) it.next()).createWriterInstance(writerExtension); } catch (IOException e) { @@ -274,12 +289,13 @@ public final class ImageIO private static boolean useCache = true; private static Iterator getReadersByFilter(Class type, - ServiceRegistry.Filter filter) + ServiceRegistry.Filter filter, + Object readerExtension) { try { Iterator it = getRegistry().getServiceProviders(type, filter, true); - return new ImageReaderIterator(it); + return new ImageReaderIterator(it, readerExtension); } catch (IllegalArgumentException e) { @@ -288,12 +304,13 @@ public final class ImageIO } private static Iterator getWritersByFilter(Class type, - ServiceRegistry.Filter filter) + ServiceRegistry.Filter filter, + Object writerExtension) { try { Iterator it = getRegistry().getServiceProviders(type, filter, true); - return new ImageWriterIterator(it); + return new ImageWriterIterator(it, writerExtension); } catch (IllegalArgumentException e) { @@ -312,7 +329,8 @@ public final class ImageIO throw new IllegalArgumentException("formatName may not be null"); return getReadersByFilter(ImageReaderSpi.class, - new ReaderFormatFilter(formatName)); + new ReaderFormatFilter(formatName), + formatName); } public static Iterator getImageReadersByMIMEType(String MIMEType) @@ -321,7 +339,8 @@ public final class ImageIO throw new IllegalArgumentException("MIMEType may not be null"); return getReadersByFilter(ImageReaderSpi.class, - new ReaderMIMETypeFilter(MIMEType)); + new ReaderMIMETypeFilter(MIMEType), + MIMEType); } public static Iterator getImageReadersBySuffix(String fileSuffix) @@ -330,7 +349,8 @@ public final class ImageIO throw new IllegalArgumentException("formatName may not be null"); return getReadersByFilter(ImageReaderSpi.class, - new ReaderSuffixFilter(fileSuffix)); + new ReaderSuffixFilter(fileSuffix), + fileSuffix); } public static Iterator getImageWritersByFormatName(String formatName) @@ -339,7 +359,8 @@ public final class ImageIO throw new IllegalArgumentException("formatName may not be null"); return getWritersByFilter(ImageWriterSpi.class, - new WriterFormatFilter(formatName)); + new WriterFormatFilter(formatName), + formatName); } public static Iterator getImageWritersByMIMEType(String MIMEType) @@ -348,7 +369,8 @@ public final class ImageIO throw new IllegalArgumentException("MIMEType may not be null"); return getWritersByFilter(ImageWriterSpi.class, - new WriterMIMETypeFilter(MIMEType)); + new WriterMIMETypeFilter(MIMEType), + MIMEType); } public static Iterator getImageWritersBySuffix(String fileSuffix) @@ -357,7 +379,8 @@ public final class ImageIO throw new IllegalArgumentException("fileSuffix may not be null"); return getWritersByFilter(ImageWriterSpi.class, - new WriterSuffixFilter(fileSuffix)); + new WriterSuffixFilter(fileSuffix), + fileSuffix); } public static String[] getReaderFormatNames() @@ -496,4 +519,87 @@ public final class ImageIO { ImageIO.useCache = useCache; } + + /* + * "Standard" simplified entry points. + */ + + public static boolean write(RenderedImage im, + String formatName, + File output) + throws IOException + { + return write(im, formatName, new FileOutputStream(output)); + } + + public static boolean write(RenderedImage im, + String formatName, + OutputStream output) + throws IOException + { + return write(im, formatName, new MemoryCacheImageOutputStream(output)); + } + + + public static boolean write(RenderedImage im, + String formatName, + ImageOutputStream output) + throws IOException + { + Iterator writers = getImageWritersByFormatName(formatName); + IIOImage img = new IIOImage(im, null, null); + while (writers.hasNext()) + { + ImageWriter w = (ImageWriter) writers.next(); + try + { + w.setOutput(output); + } + catch (IllegalArgumentException e) + { + continue; + } + + w.write(null, img, null); + output.close(); + return true; + } + return false; + } + + public static BufferedImage read(ImageInputStream stream) + throws IOException + { + Iterator providers = getRegistry().getServiceProviders(ImageReaderSpi.class, true); + while (providers.hasNext()) + { + ImageReaderSpi spi = (ImageReaderSpi) providers.next(); + if (spi.canDecodeInput(stream)) + { + ImageReader reader = spi.createReaderInstance(); + reader.setInput(stream); + return reader.read(0, null); + } + } + return null; + } + + public static BufferedImage read(URL input) + throws IOException + { + return read(input.openStream()); + } + + public static BufferedImage read(InputStream input) + throws IOException + { + return read(new MemoryCacheImageInputStream(input)); + } + + public static BufferedImage read(File input) + throws IOException + { + return read(new FileInputStream(input)); + } + } diff --git a/javax/imageio/ImageReadParam.java b/javax/imageio/ImageReadParam.java index e5414bda1..4192c563b 100644 --- a/javax/imageio/ImageReadParam.java +++ b/javax/imageio/ImageReadParam.java @@ -94,6 +94,22 @@ public class ImageReadParam extends IIOParam { return sourceRenderSize; } + + public void setDestination(BufferedImage destination) + { + this.destination = destination; + } + + public void setDestinationBands(int[] destinationBands) + { + this.destinationBands = destinationBands; + } + + public void setSourceProgressivePasses(int minPass, int numPasses) + { + this.minProgressivePass = minPass; + this.numProgressivePasses = numPasses; + } public void setSourceRenderSize(Dimension size) throws UnsupportedOperationException diff --git a/javax/imageio/ImageReader.java b/javax/imageio/ImageReader.java index 91cb53cd8..6e5a1b2d8 100644 --- a/javax/imageio/ImageReader.java +++ b/javax/imageio/ImageReader.java @@ -51,6 +51,7 @@ import javax.imageio.event.IIOReadUpdateListener; import javax.imageio.event.IIOReadWarningListener; import javax.imageio.metadata.IIOMetadata; import javax.imageio.spi.ImageReaderSpi; +import javax.imageio.stream.ImageInputStream; public abstract class ImageReader { @@ -62,7 +63,7 @@ public abstract class ImageReader protected Locale locale; protected int minIndex; protected ImageReaderSpi originatingProvider; - protected List progressListeners; + protected List progressListeners = new ArrayList(); protected boolean seekForwardOnly; protected List updateListeners = new ArrayList(); protected List warningListeners = new ArrayList(); @@ -156,6 +157,42 @@ public abstract class ImageReader public abstract Iterator getImageTypes(int imageIndex) throws IOException; + public void setInput(Object input, + boolean seekForwardOnly, + boolean ignoreMetadata) + { + Class[] okClasses = originatingProvider.getInputTypes(); + if (okClasses == null) + { + if (!(input instanceof ImageInputStream)) + throw new IllegalArgumentException(); + } + else + { + boolean classOk = false; + for (int i = 0; i < okClasses.length; ++i) + if (okClasses[i].isInstance(input)) + classOk = true; + if (!classOk) + throw new IllegalArgumentException(); + } + + this.input = input; + this.seekForwardOnly = seekForwardOnly; + this.ignoreMetadata = ignoreMetadata; + this.minIndex = 0; + } + + public void setInput(Object in, boolean seekForwardOnly) + { + setInput(in, seekForwardOnly, false); + } + + public void setInput(Object in) + { + setInput(in, false, false); + } + public Object getInput() { return input; diff --git a/javax/imageio/ImageWriter.java b/javax/imageio/ImageWriter.java index 64466b151..389ca4360 100644 --- a/javax/imageio/ImageWriter.java +++ b/javax/imageio/ImageWriter.java @@ -40,6 +40,7 @@ package javax.imageio; import java.awt.Dimension; import java.io.IOException; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -59,9 +60,9 @@ public abstract class ImageWriter protected Locale locale; protected ImageWriterSpi originatingProvider; protected Object output; - protected List progressListeners; - protected List warningListeners; - protected List warningLocales; + protected List progressListeners = new ArrayList(); + protected List warningListeners = new ArrayList(); + protected List warningLocales = new ArrayList(); protected ImageWriter(ImageWriterSpi originatingProvider) { @@ -371,11 +372,11 @@ public abstract class ImageWriter if (originatingProvider != null) types = originatingProvider.getOutputTypes(); - + if (types != null) for (int i = types.length - 1; i >= 0; --i) - if (types[i].equals(output.getClass())) - found = true; + if (types[i].isInstance(output)) + found = true; if (! found) throw new IllegalArgumentException("output type not available"); diff --git a/javax/imageio/spi/IIORegistry.java b/javax/imageio/spi/IIORegistry.java index 7728cf428..6531fabca 100644 --- a/javax/imageio/spi/IIORegistry.java +++ b/javax/imageio/spi/IIORegistry.java @@ -39,7 +39,9 @@ exception statement from your version. */ package javax.imageio.spi; import gnu.classpath.ServiceFactory; +import gnu.java.awt.ClasspathToolkit; +import java.awt.Toolkit; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -52,8 +54,8 @@ public final class IIORegistry extends ServiceRegistry static { - //defaultCategories.add(ImageReaderSpi.class); - //defaultCategories.add(ImageWriterSpi.class); + defaultCategories.add(ImageReaderSpi.class); + defaultCategories.add(ImageWriterSpi.class); defaultCategories.add(ImageTranscoderSpi.class); defaultCategories.add(ImageInputStreamSpi.class); defaultCategories.add(ImageOutputStreamSpi.class); @@ -78,6 +80,8 @@ public final class IIORegistry extends ServiceRegistry super(defaultCategories.iterator()); // XXX: Register built-in Spis here. + + ((ClasspathToolkit)Toolkit.getDefaultToolkit()).registerImageIOSpis(this); registerApplicationClasspathSpis(); } 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/FileImageOutputStream.java b/javax/imageio/stream/FileImageOutputStream.java index 073faed19..5b47af840 100644 --- a/javax/imageio/stream/FileImageOutputStream.java +++ b/javax/imageio/stream/FileImageOutputStream.java @@ -46,7 +46,7 @@ import java.io.RandomAccessFile; /** * @author Michael Koch (konqueror@gmx.de) */ -public class FileImageOutputStream +public class FileImageOutputStream extends ImageOutputStreamImpl { private RandomAccessFile file; @@ -87,4 +87,47 @@ public class FileImageOutputStream return -1L; } } + + public int read() + throws IOException + { + checkClosed(); + + setBitOffset(0); + return file.read(); + } + + public int read(byte[] data, int offset, int len) + throws IOException + { + checkClosed(); + + setBitOffset(0); + return file.read(data, offset, len); + } + + public void seek(long position) + throws IOException + { + super.seek(position); + file.seek(position); + } + + public void write(byte[] data, int offset, int len) + throws IOException + { + checkClosed(); + + flushBits(); + file.write(data, offset, len); + } + + public void write(int value) + throws IOException + { + checkClosed(); + + // FIXME: Flush pending bits. + file.write(value); + } } 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..3631e64fc 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.IOException; +import java.io.InputStream; + /** * @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); + } } |