From d57944ad419a596a8346836a5fa85c4524b3b266 Mon Sep 17 00:00:00 2001 From: Michael Koch Date: Tue, 11 Jan 2005 22:07:32 +0000 Subject: 2005-01-11 Graydon Hoare * gnu/java/awt/ClasspathToolkit.java (registerImageIOSpis): New method. * gnu/java/awt/image/ImageDecoder.java (imageDecoder): New constructor using InputStream (startProduction): Handle existing InputStream. * gnu/java/awt/peer/gtk/GdkGraphics2D.java (findSimpleIntegerArray): Make public and static. (updateBufferedImage): Set each pixel, in a loop. * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java: Implement ImageIO SPI classes. (createBufferedImage): Rewrite in terms of SPI classes. * gnu/java/awt/peer/gtk/GtkToolkit.java (registerImageIOSpis): New method. * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Borrow a patch from aph, applied to trunk, which lets JNI call interface methods properly. * javax/imageio/ImageIO.java (WriterFormatFilter.filter): Fix copy-and-paste typos. (WriterMIMETypeFilter.filter): Likewise. (ImageReaderIterator): Pass extension argument through to SPI. (getReadersByFilter): Likewise. (getWritersByFilter): Likewise. (getImageReadersByFormatName): Likewise. (getImageReadersByMIMEType): Likewise. (getImageReadersBySuffix): Likewise. (getImageWritersByFormatName): Likewise. (getImageWritersByMIMEType): Likewise. (getImageWritersBySuffix): Likewise. (read): Implement. (write): Implement. * javax/imageio/ImageReader.java (progressListeners): Initialize. (setInput): Implement. * javax/imageio/ImageWriter.java (progressListeners): Initialize. (warningListeners): Likewise. (warningLocales): Likewise. (setOutput): Test "isInstance" rather than class equality. * javax/imageio/spi/IIORegistry.java (static): Add reader and writer SPIs. (IIORegistry): Call ClasspathToolkit.registerImageIOSpis. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c (query_formats): New function. (save_to_stream): Likewise. (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): Likewise. 2005-01-11 Michael Koch * include/gnu_java_awt_peer_gtk_GdkPixbufDecoder.h: Regenerated. --- javax/imageio/ImageIO.java | 146 ++++++++++++++++++++++++++++++++----- javax/imageio/ImageReader.java | 39 +++++++++- javax/imageio/ImageWriter.java | 13 ++-- javax/imageio/spi/IIORegistry.java | 4 + 4 files changed, 175 insertions(+), 27 deletions(-) (limited to 'javax/imageio') 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/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 25fade63e..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; @@ -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(); } -- cgit v1.2.1