summaryrefslogtreecommitdiff
path: root/javax/imageio
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2005-01-11 22:07:32 +0000
committerMichael Koch <konqueror@gmx.de>2005-01-11 22:07:32 +0000
commitd57944ad419a596a8346836a5fa85c4524b3b266 (patch)
treea033392f353aa8121fefeb6491eb188cff36956b /javax/imageio
parent77acbbe0e2e6eca679d97f1523840e80dd381b16 (diff)
downloadclasspath-d57944ad419a596a8346836a5fa85c4524b3b266.tar.gz
2005-01-11 Graydon Hoare <graydon@redhat.com>
* 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 <konqueror@gmx.de> * include/gnu_java_awt_peer_gtk_GdkPixbufDecoder.h: Regenerated.
Diffstat (limited to 'javax/imageio')
-rw-r--r--javax/imageio/ImageIO.java146
-rw-r--r--javax/imageio/ImageReader.java39
-rw-r--r--javax/imageio/ImageWriter.java13
-rw-r--r--javax/imageio/spi/IIORegistry.java4
4 files changed, 175 insertions, 27 deletions
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();
}