mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			1242 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			1242 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* ImageIO.java --
 | |
|    Copyright (C) 2004, 2005  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.imageio;
 | |
| 
 | |
| import java.awt.image.BufferedImage;
 | |
| import java.awt.image.RenderedImage;
 | |
| import java.io.File;
 | |
| import java.io.FileInputStream;
 | |
| import java.io.FileOutputStream;
 | |
| import java.io.IOException;
 | |
| import java.io.InputStream;
 | |
| import java.io.OutputStream;
 | |
| import java.net.URL;
 | |
| import java.util.ArrayList;
 | |
| import java.util.Collections;
 | |
| import java.util.Iterator;
 | |
| 
 | |
| import javax.imageio.spi.IIORegistry;
 | |
| import javax.imageio.spi.ImageInputStreamSpi;
 | |
| import javax.imageio.spi.ImageOutputStreamSpi;
 | |
| import javax.imageio.spi.ImageReaderSpi;
 | |
| import javax.imageio.spi.ImageTranscoderSpi;
 | |
| import javax.imageio.spi.ImageWriterSpi;
 | |
| import javax.imageio.spi.ServiceRegistry;
 | |
| import javax.imageio.stream.ImageInputStream;
 | |
| import javax.imageio.stream.ImageOutputStream;
 | |
| import javax.imageio.stream.MemoryCacheImageInputStream;
 | |
| import javax.imageio.stream.MemoryCacheImageOutputStream;
 | |
| 
 | |
| /**
 | |
|  * An uninstantiable class that provides static methods for locating
 | |
|  * and using image readers and writers.
 | |
|  */
 | |
| public final class ImageIO
 | |
| {
 | |
|   /**
 | |
|    * Construct an ImageIO.  Private since ImageIO is not instantiable.
 | |
|    */
 | |
|   private ImageIO()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   private static final class ReaderFormatFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String formatName;
 | |
| 
 | |
|     public ReaderFormatFilter(String formatName)
 | |
|     {
 | |
|       this.formatName = formatName;
 | |
|     }
 | |
| 
 | |
|     public boolean filter (Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageReaderSpi)
 | |
|         {
 | |
|           ImageReaderSpi spi = (ImageReaderSpi) provider;
 | |
|           String[] formatNames = spi.getFormatNames();
 | |
| 
 | |
|           for (int i = formatNames.length - 1; i >= 0; --i)
 | |
|             if (formatName.equals(formatNames[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class ReaderMIMETypeFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String MIMEType;
 | |
| 
 | |
|     public ReaderMIMETypeFilter(String MIMEType)
 | |
|     {
 | |
|       this.MIMEType = MIMEType;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageReaderSpi)
 | |
|         {
 | |
|           ImageReaderSpi spi = (ImageReaderSpi) provider;
 | |
|           String[] mimetypes = spi.getMIMETypes();
 | |
| 
 | |
|           for (int i = mimetypes.length - 1; i >= 0; --i)
 | |
|             if (MIMEType.equals(mimetypes[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class ReaderObjectFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private Object object;
 | |
| 
 | |
|     public ReaderObjectFilter(Object object)
 | |
|     {
 | |
|       this.object = object;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageReaderSpi)
 | |
|         {
 | |
|           ImageReaderSpi spi = (ImageReaderSpi) provider;
 | |
| 
 | |
|           try
 | |
|             {
 | |
|               if (spi.canDecodeInput(object))
 | |
|                 return true;
 | |
|             }
 | |
|           catch (IOException e)
 | |
|             {
 | |
|               // Return false in this case
 | |
|             }
 | |
|         }
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class ReaderSuffixFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String fileSuffix;
 | |
| 
 | |
|     public ReaderSuffixFilter(String fileSuffix)
 | |
|     {
 | |
|       this.fileSuffix = fileSuffix;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageReaderSpi)
 | |
|         {
 | |
|           ImageReaderSpi spi = (ImageReaderSpi) provider;
 | |
|           String[] suffixes = spi.getFileSuffixes();
 | |
| 
 | |
|           for (int i = suffixes.length - 1; i >= 0; --i)
 | |
|             if (fileSuffix.equals(suffixes[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class WriterFormatFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String formatName;
 | |
| 
 | |
|     public WriterFormatFilter(String formatName)
 | |
|     {
 | |
|       this.formatName = formatName;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageWriterSpi)
 | |
|         {
 | |
|           ImageWriterSpi spi = (ImageWriterSpi) provider;
 | |
|           String[] formatNames = spi.getFormatNames();
 | |
| 
 | |
|           for (int i = formatNames.length - 1; i >= 0; --i)
 | |
|             if (formatName.equals(formatNames[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class WriterMIMETypeFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String MIMEType;
 | |
| 
 | |
|     public WriterMIMETypeFilter(String MIMEType)
 | |
|     {
 | |
|       this.MIMEType = MIMEType;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageWriterSpi)
 | |
|         {
 | |
|           ImageWriterSpi spi = (ImageWriterSpi) provider;
 | |
|           String[] mimetypes = spi.getMIMETypes();
 | |
| 
 | |
|           for (int i = mimetypes.length - 1; i >= 0; --i)
 | |
|             if (MIMEType.equals(mimetypes[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class WriterSuffixFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private String fileSuffix;
 | |
| 
 | |
|     public WriterSuffixFilter(String fileSuffix)
 | |
|     {
 | |
|       this.fileSuffix = fileSuffix;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageWriterSpi)
 | |
|         {
 | |
|           ImageWriterSpi spi = (ImageWriterSpi) provider;
 | |
|           String[] suffixes = spi.getFileSuffixes();
 | |
| 
 | |
|           for (int i = suffixes.length - 1; i >= 0; --i)
 | |
|             if (fileSuffix.equals(suffixes[i]))
 | |
|               return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class WriterObjectFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private ImageTypeSpecifier type;
 | |
|     private String formatName;
 | |
| 
 | |
|     public WriterObjectFilter(ImageTypeSpecifier type,
 | |
|                               String formatName)
 | |
|     {
 | |
|       this.type = type;
 | |
|       this.formatName = formatName;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageWriterSpi)
 | |
|         {
 | |
|           ImageWriterSpi spi = (ImageWriterSpi) provider;
 | |
| 
 | |
|           if (spi.canEncodeImage(type))
 | |
|             {
 | |
|               String[] formatNames = spi.getFormatNames();
 | |
|               for (int i = formatNames.length - 1; i >= 0; --i)
 | |
|                 if (formatName.equals(formatNames[i]))
 | |
|                   return true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class TranscoderFilter implements ServiceRegistry.Filter
 | |
|   {
 | |
|     private ImageReader reader;
 | |
|     private ImageWriter writer;
 | |
| 
 | |
|     public TranscoderFilter(ImageReader reader,
 | |
|                             ImageWriter writer)
 | |
|     {
 | |
|       this.reader = reader;
 | |
|       this.writer = writer;
 | |
|     }
 | |
| 
 | |
|     public boolean filter(Object provider)
 | |
|     {
 | |
|       if (provider instanceof ImageTranscoderSpi)
 | |
|         {
 | |
|           ImageTranscoderSpi spi = (ImageTranscoderSpi) provider;
 | |
| 
 | |
|           if (spi.getReaderServiceProviderName().equals
 | |
|               (reader.getOriginatingProvider().getClass().getName())
 | |
|               && spi.getWriterServiceProviderName().equals
 | |
|               (writer.getOriginatingProvider().getClass().getName()))
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class ImageReaderIterator
 | |
|     implements Iterator<ImageReader>
 | |
|   {
 | |
|     Iterator<ImageReaderSpi> it;
 | |
|     Object readerExtension;
 | |
| 
 | |
|     public ImageReaderIterator(Iterator<ImageReaderSpi> it,
 | |
|                                Object readerExtension)
 | |
|     {
 | |
|       this.it = it;
 | |
|       this.readerExtension = readerExtension;
 | |
|     }
 | |
| 
 | |
|     public ImageReaderIterator(Iterator<ImageReaderSpi> it)
 | |
|     {
 | |
|       this.it = it;
 | |
|     }
 | |
| 
 | |
|     public boolean hasNext()
 | |
|     {
 | |
|       return it.hasNext();
 | |
|     }
 | |
| 
 | |
|     public ImageReader next()
 | |
|     {
 | |
|       try
 | |
|         {
 | |
|           ImageReaderSpi spi = it.next();
 | |
|           return (readerExtension == null
 | |
|               ? spi.createReaderInstance()
 | |
|               : spi.createReaderInstance(readerExtension));
 | |
|         }
 | |
|       catch (IOException e)
 | |
|         {
 | |
|           return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void remove()
 | |
|     {
 | |
|       throw new UnsupportedOperationException();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final class ImageWriterIterator
 | |
|     implements Iterator<ImageWriter>
 | |
|   {
 | |
|     Iterator<ImageWriterSpi> it;
 | |
|     Object writerExtension;
 | |
| 
 | |
|     public ImageWriterIterator(Iterator<ImageWriterSpi> it,
 | |
|                                Object writerExtension)
 | |
|     {
 | |
|       this.it = it;
 | |
|       this.writerExtension = writerExtension;
 | |
|     }
 | |
| 
 | |
|     public ImageWriterIterator(Iterator<ImageWriterSpi> it)
 | |
|     {
 | |
|       this.it = it;
 | |
|     }
 | |
| 
 | |
|     public boolean hasNext()
 | |
|     {
 | |
|       return it.hasNext();
 | |
|     }
 | |
| 
 | |
|     public ImageWriter next()
 | |
|     {
 | |
|       try
 | |
|         {
 | |
|           ImageWriterSpi spi = it.next();
 | |
|           return (writerExtension == null
 | |
|               ? spi.createWriterInstance()
 | |
|               : spi.createWriterInstance(writerExtension));
 | |
|         }
 | |
|       catch (IOException e)
 | |
|         {
 | |
|           return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void remove()
 | |
|     {
 | |
|       throw new UnsupportedOperationException();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static File cacheDirectory;
 | |
|   private static boolean useCache = true;
 | |
| 
 | |
|   private static Iterator<ImageReader> getReadersByFilter(Class<ImageReaderSpi> type,
 | |
|                                                           ServiceRegistry.Filter filter,
 | |
|                                                           Object readerExtension)
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator<ImageReaderSpi> it
 | |
|           = getRegistry().getServiceProviders(type, filter, true);
 | |
|         return new ImageReaderIterator(it, readerExtension);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return Collections.EMPTY_SET.iterator();
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   private static Iterator<ImageWriter> getWritersByFilter(Class<ImageWriterSpi> type,
 | |
|                                                           ServiceRegistry.Filter filter,
 | |
|                                                           Object writerExtension)
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator<ImageWriterSpi> it
 | |
|           = getRegistry().getServiceProviders(type, filter, true);
 | |
|         return new ImageWriterIterator(it, writerExtension);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return Collections.EMPTY_SET.iterator();
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve the current cache directory.
 | |
|    *
 | |
|    * @return the current cache directory or null if none is set.
 | |
|    */
 | |
|   public static File getCacheDirectory()
 | |
|   {
 | |
|     return cacheDirectory;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered readers for the given
 | |
|    * format.
 | |
|    *
 | |
|    * @param formatName an infomal format name (e.g. "jpeg" or "bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image readers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if formatName is null
 | |
|    */
 | |
|   public static Iterator<ImageReader> getImageReadersByFormatName(String formatName)
 | |
|   {
 | |
|     if (formatName == null)
 | |
|       throw new IllegalArgumentException("formatName may not be null");
 | |
| 
 | |
|     return getReadersByFilter(ImageReaderSpi.class,
 | |
|                               new ReaderFormatFilter(formatName),
 | |
|                               formatName);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered readers for the given
 | |
|    * MIME type.
 | |
|    *
 | |
|    * @param MIMEType a MIME specification for an image type
 | |
|    * (e.g. "image/jpeg" or "image/x-bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image readers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if MIMEType is null
 | |
|    */
 | |
|   public static Iterator<ImageReader> getImageReadersByMIMEType(String MIMEType)
 | |
|   {
 | |
|     if (MIMEType == null)
 | |
|       throw new IllegalArgumentException("MIMEType may not be null");
 | |
| 
 | |
|     return getReadersByFilter(ImageReaderSpi.class,
 | |
|                               new ReaderMIMETypeFilter(MIMEType),
 | |
|                               MIMEType);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered readers for the given
 | |
|    * file suffix.
 | |
|    *
 | |
|    * @param fileSuffix an image file suffix (e.g. "jpg" or "bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image readers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if fileSuffix is null
 | |
|    */
 | |
|   public static Iterator<ImageReader> getImageReadersBySuffix(String fileSuffix)
 | |
|   {
 | |
|     if (fileSuffix == null)
 | |
|       throw new IllegalArgumentException("formatName may not be null");
 | |
| 
 | |
|     return getReadersByFilter(ImageReaderSpi.class,
 | |
|                               new ReaderSuffixFilter(fileSuffix),
 | |
|                               fileSuffix);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered writers for the given
 | |
|    * format.
 | |
|    *
 | |
|    * @param formatName an infomal format name (e.g. "jpeg" or "bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image writers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if formatName is null
 | |
|    */
 | |
|   public static Iterator<ImageWriter> getImageWritersByFormatName(String formatName)
 | |
|   {
 | |
|     if (formatName == null)
 | |
|       throw new IllegalArgumentException("formatName may not be null");
 | |
| 
 | |
|     return getWritersByFilter(ImageWriterSpi.class,
 | |
|                               new WriterFormatFilter(formatName),
 | |
|                               formatName);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered writers for the given
 | |
|    * MIME type.
 | |
|    *
 | |
|    * @param MIMEType a MIME specification for an image type
 | |
|    * (e.g. "image/jpeg" or "image/x-bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image writers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if MIMEType is null
 | |
|    */
 | |
|   public static Iterator<ImageWriter> getImageWritersByMIMEType(String MIMEType)
 | |
|   {
 | |
|     if (MIMEType == null)
 | |
|       throw new IllegalArgumentException("MIMEType may not be null");
 | |
| 
 | |
|     return getWritersByFilter(ImageWriterSpi.class,
 | |
|                               new WriterMIMETypeFilter(MIMEType),
 | |
|                               MIMEType);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over all registered writers for the given
 | |
|    * file suffix.
 | |
|    *
 | |
|    * @param fileSuffix an image file suffix (e.g. "jpg" or "bmp")
 | |
|    *
 | |
|    * @return an iterator over a collection of image writers
 | |
|    *
 | |
|    * @exception IllegalArgumentException if fileSuffix is null
 | |
|    */
 | |
|   public static Iterator<ImageWriter> getImageWritersBySuffix(String fileSuffix)
 | |
|   {
 | |
|     if (fileSuffix == null)
 | |
|       throw new IllegalArgumentException("fileSuffix may not be null");
 | |
| 
 | |
|     return getWritersByFilter(ImageWriterSpi.class,
 | |
|                               new WriterSuffixFilter(fileSuffix),
 | |
|                               fileSuffix);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve all the informal format names supported by the
 | |
|    * collection of registered image readers.
 | |
|    *
 | |
|    * @return an array of format names
 | |
|    */
 | |
|   public static String[] getReaderFormatNames()
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator it =
 | |
|           getRegistry().getServiceProviders(ImageReaderSpi.class, true);
 | |
|         ArrayList result = new ArrayList();
 | |
| 
 | |
|         while (it.hasNext())
 | |
|           {
 | |
|             ImageReaderSpi spi = (ImageReaderSpi) it.next();
 | |
|             String[] names = spi.getFormatNames();
 | |
| 
 | |
|             for (int i = names.length - 1; i >= 0; --i)
 | |
|               result.add(names[i]);
 | |
|           }
 | |
| 
 | |
|         return (String[]) result.toArray(new String[result.size()]);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return new String[0];
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve all the MIME types supported by the collection of
 | |
|    * registered image readers.
 | |
|    *
 | |
|    * @return an array of MIME types
 | |
|    */
 | |
|   public static String[] getReaderMIMETypes()
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator it =
 | |
|           getRegistry().getServiceProviders(ImageReaderSpi.class, true);
 | |
|         ArrayList result = new ArrayList();
 | |
| 
 | |
|         while (it.hasNext())
 | |
|           {
 | |
|             ImageReaderSpi spi = (ImageReaderSpi) it.next();
 | |
|             String[] names = spi.getMIMETypes();
 | |
| 
 | |
|             for (int i = names.length - 1; i >= 0; --i)
 | |
|               result.add(names[i]);
 | |
|           }
 | |
| 
 | |
|         return (String[]) result.toArray(new String[result.size()]);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return new String[0];
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   private static IIORegistry getRegistry()
 | |
|   {
 | |
|     return IIORegistry.getDefaultInstance();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Check whether or not an on-disk cache is used for image input and
 | |
|    * output streams.
 | |
|    *
 | |
|    * @return true if an on-disk cache is available, false otherwise
 | |
|    */
 | |
|   public static boolean getUseCache()
 | |
|   {
 | |
|     return useCache;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve all the informal format names supported by the
 | |
|    * collection of registered image writers.
 | |
|    *
 | |
|    * @return an array of format names
 | |
|    */
 | |
|   public static String[] getWriterFormatNames()
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator it =
 | |
|           getRegistry().getServiceProviders(ImageWriterSpi.class, true);
 | |
|         ArrayList result = new ArrayList();
 | |
| 
 | |
|         while (it.hasNext())
 | |
|           {
 | |
|             ImageWriterSpi spi = (ImageWriterSpi) it.next();
 | |
|             String[] names = spi.getFormatNames();
 | |
| 
 | |
|             for (int i = names.length - 1; i >= 0; --i)
 | |
|               result.add(names[i]);
 | |
|           }
 | |
| 
 | |
|         return (String[]) result.toArray(new String[result.size()]);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return new String[0];
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve all the MIME types supported by the collection of
 | |
|    * registered image writers.
 | |
|    *
 | |
|    * @return an array of MIME types
 | |
|    */
 | |
|   public static String[] getWriterMIMETypes()
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         Iterator it =
 | |
|           getRegistry().getServiceProviders(ImageWriterSpi.class, true);
 | |
|         ArrayList result = new ArrayList();
 | |
| 
 | |
|         while (it.hasNext())
 | |
|           {
 | |
|             ImageWriterSpi spi = (ImageWriterSpi) it.next();
 | |
|             String[] names = spi.getMIMETypes();
 | |
| 
 | |
|             for (int i = names.length - 1; i >= 0; --i)
 | |
|               result.add(names[i]);
 | |
|           }
 | |
| 
 | |
|         return (String[]) result.toArray(new String[result.size()]);
 | |
|       }
 | |
|     catch (IllegalArgumentException e)
 | |
|       {
 | |
|         return new String[0];
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Rescans the application classpath for ImageIO service providers
 | |
|    * and registers them.
 | |
|    */
 | |
|   public static void scanForPlugins()
 | |
|   {
 | |
|     IIORegistry.getDefaultInstance().registerApplicationClasspathSpis();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Set the directory to be used for caching image data.  A null
 | |
|    * argument means to use the default system temporary directory.
 | |
|    * This cache directory is only used if getUseCache returns true.
 | |
|    *
 | |
|    * @param cacheDirectory the directory where image data should be
 | |
|    * cached
 | |
|    *
 | |
|    * @exception IllegalArgumentException if cacheDirectory is not a
 | |
|    * directory
 | |
|    */
 | |
|   public static void setCacheDirectory(File cacheDirectory)
 | |
|   {
 | |
|     // FIXME: add SecurityManager call
 | |
|     if (cacheDirectory != null)
 | |
|       {
 | |
|         if (!cacheDirectory.isDirectory())
 | |
|           throw new IllegalArgumentException("cacheDirectory must be a directory");
 | |
| 
 | |
|         cacheDirectory.canWrite();
 | |
|       }
 | |
| 
 | |
|     ImageIO.cacheDirectory = cacheDirectory;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Control whether or not an on-disk cache is used.  This cache is
 | |
|    * used to store input or output data from an image data stream when
 | |
|    * data in the stream needs to be re-processed.
 | |
|    *
 | |
|    * If useCache is false the cache will be stored in memory.  Doing
 | |
|    * so eliminates file creation and deletion overhead.  The default
 | |
|    * is to use an on-disk cache.
 | |
|    *
 | |
|    * @param useCache true to use an on-disk cache, false otherwise
 | |
|    */
 | |
|   public static void setUseCache(boolean useCache)
 | |
|   {
 | |
|     ImageIO.useCache = useCache;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Write an image to a file using a registered writer that supports
 | |
|    * the given format, overwriting the file if it already exists.
 | |
|    *
 | |
|    * @param im the image data to write
 | |
|    * @param formatName an informal description of the output format
 | |
|    * @param output the file to which the image will be written
 | |
|    *
 | |
|    * @return false if no registered writer supports the given format,
 | |
|    * true otherwise
 | |
|    *
 | |
|    * @exception IllegalArgumentException if any argument is null
 | |
|    * @exception IOException if a writing error occurs
 | |
|    */
 | |
|   public static boolean write(RenderedImage im,
 | |
|                               String formatName,
 | |
|                               File output)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (im == null || formatName == null || output == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     return write(im, formatName, new FileOutputStream(output));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Write an image to an output stream using a registered writer that
 | |
|    * supports the given format.
 | |
|    *
 | |
|    * @param im the image data to write
 | |
|    * @param formatName an informal description of the output format
 | |
|    * @param output the output stream to which the image will be
 | |
|    * written
 | |
|    *
 | |
|    * @return false if no registered writer supports the given format,
 | |
|    * true otherwise
 | |
|    *
 | |
|    * @exception IllegalArgumentException if any argument is null
 | |
|    * @exception IOException if a writing error occurs
 | |
|    */
 | |
|   public static boolean write(RenderedImage im,
 | |
|                               String formatName,
 | |
|                               OutputStream output)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (im == null || formatName == null || output == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     return write(im, formatName, new MemoryCacheImageOutputStream(output));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Write an image to an ImageOutputStream using a registered writer
 | |
|    * that supports the given format.  Image data is written starting
 | |
|    * at the ImageOutputStream's current stream pointer, overwriting
 | |
|    * any existing data.
 | |
|    *
 | |
|    * @param im the image data to write
 | |
|    * @param formatName an informal description of the output format
 | |
|    * @param output the image output stream to which the image will be
 | |
|    * written
 | |
|    *
 | |
|    * @return false if no registered writer supports the given format,
 | |
|    * true otherwise
 | |
|    *
 | |
|    * @exception IllegalArgumentException if any argument is null
 | |
|    * @exception IOException if a writing error occurs
 | |
|    */
 | |
|   public static boolean write(RenderedImage im,
 | |
|                               String formatName,
 | |
|                               ImageOutputStream output)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (im == null || formatName == null || output == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     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);
 | |
|         w.dispose();
 | |
|         output.close();
 | |
|         return true;
 | |
|       }
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create a buffered image from an image input stream.  An image
 | |
|    * reader that supports the given image data is automatically
 | |
|    * selected from the collection of registered readers.  If no
 | |
|    * registered reader can handle the input format, null is returned.
 | |
|    *
 | |
|    * @param stream the image input stream from which to read image
 | |
|    * data
 | |
|    *
 | |
|    * @return a new buffered image created from the given image data,
 | |
|    * or null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if stream is null
 | |
|    * @exception IOException if a reading error occurs
 | |
|    */
 | |
|   public static BufferedImage read(ImageInputStream stream)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (stream == null)
 | |
|       throw new IllegalArgumentException("null argument");
 | |
| 
 | |
|     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;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create a buffered image from a URL.  An image reader that
 | |
|    * supports the given image data is automatically selected from the
 | |
|    * collection of registered readers.  If no registered reader can
 | |
|    * handle the input format, null is returned.
 | |
|    *
 | |
|    * The image data will be cached in the current cache directory if
 | |
|    * caching is enabled.
 | |
|    *
 | |
|    * This method does not locate readers that read data directly from
 | |
|    * a URL.  To locate such readers manually, use IIORegistry and
 | |
|    * ImageReaderSpi.
 | |
|    *
 | |
|    * @param input the URL from which to retrieve the image file
 | |
|    *
 | |
|    * @return a new buffered image created from the given image URL, or
 | |
|    * null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if input is null
 | |
|    * @exception IOException if a reading error occurs
 | |
|    */
 | |
|   public static BufferedImage read(URL input)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (input == null)
 | |
|       throw new IllegalArgumentException("null argument");
 | |
| 
 | |
|     return read(input.openStream());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create a buffered image from an input stream.  An image reader
 | |
|    * that supports the given image data is automatically selected from
 | |
|    * the collection of registered readers.  If no registered reader
 | |
|    * can handle the input format, null is returned.
 | |
|    *
 | |
|    * The image data will be cached in the current cache directory if
 | |
|    * caching is enabled.
 | |
|    *
 | |
|    * This method does not locate readers that read data directly from
 | |
|    * an input stream.  To locate such readers manually, use
 | |
|    * IIORegistry and ImageReaderSpi.
 | |
|    *
 | |
|    * @param input the input stream from which to read the image data
 | |
|    *
 | |
|    * @return a new buffered image created from the given input stream,
 | |
|    * or null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if input is null
 | |
|    * @exception IOException if a reading error occurs
 | |
|    */
 | |
|   public static BufferedImage read(InputStream input)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (input == null)
 | |
|       throw new IllegalArgumentException("null argument");
 | |
| 
 | |
|     return read(new MemoryCacheImageInputStream(input));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create a buffered image from a file.  An image reader that
 | |
|    * supports the given image data is automatically selected from the
 | |
|    * collection of registered readers.  If no registered reader can
 | |
|    * handle the input format, null is returned.
 | |
|    *
 | |
|    * The image data will be cached in the current cache directory if
 | |
|    * caching is enabled.
 | |
|    *
 | |
|    * This method does not locate readers that read data directly from
 | |
|    * a file.  To locate such readers manually, use IIORegistry and
 | |
|    * ImageReaderSpi.
 | |
|    *
 | |
|    * @param input the file from which to read image data
 | |
|    *
 | |
|    * @return a new buffered image created from the given image file,
 | |
|    * or null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if input is null
 | |
|    * @exception IOException if a reading error occurs
 | |
|    */
 | |
|   public static BufferedImage read(File input)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (input == null)
 | |
|       throw new IllegalArgumentException("null argument");
 | |
| 
 | |
|     return read(new FileInputStream(input));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create an image input stream from the given object.  The
 | |
|    * collection of ImageInputStreamSpis registered with the
 | |
|    * IIORegistry is searched for an image input stream that can take
 | |
|    * input from the given object.  null is returned if no such SPI is
 | |
|    * registered.
 | |
|    *
 | |
|    * The image data will be cached in the current cache directory if
 | |
|    * caching is enabled.
 | |
|    *
 | |
|    * @param input an object from which to read image data
 | |
|    *
 | |
|    * @return an ImageInputStream that can read data from input, or
 | |
|    * null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if input is null
 | |
|    * @exception IOException if caching is required but not enabled
 | |
|    */
 | |
|   public static ImageInputStream createImageInputStream (Object input)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (input == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     Iterator spis = getRegistry().getServiceProviders
 | |
|       (ImageInputStreamSpi.class, true);
 | |
| 
 | |
|     ImageInputStreamSpi foundSpi = null;
 | |
| 
 | |
|     while(spis.hasNext())
 | |
|       {
 | |
|         ImageInputStreamSpi spi = (ImageInputStreamSpi) spis.next();
 | |
| 
 | |
|         if (input.getClass().equals(spi.getInputClass()))
 | |
|           {
 | |
|             foundSpi = spi;
 | |
|             break;
 | |
|           }
 | |
|       }
 | |
| 
 | |
|     return foundSpi == null ? null :
 | |
|       foundSpi.createInputStreamInstance (input,
 | |
|                                           getUseCache(),
 | |
|                                           getCacheDirectory());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create an image output stream from the given object.  The
 | |
|    * collection of ImageOutputStreamSpis registered with the
 | |
|    * IIORegistry is searched for an image output stream that can send
 | |
|    * output to the given object.  null is returned if no such SPI is
 | |
|    * registered.
 | |
|    *
 | |
|    * The image data will be cached in the current cache directory if
 | |
|    * caching is enabled.
 | |
|    *
 | |
|    * @param output an object to which to write image data
 | |
|    *
 | |
|    * @return an ImageOutputStream that can send data to output, or
 | |
|    * null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if output is null
 | |
|    * @exception IOException if caching is required but not enabled
 | |
|    */
 | |
|   public static ImageOutputStream createImageOutputStream (Object output)
 | |
|     throws IOException
 | |
|   {
 | |
|     if (output == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     Iterator spis = getRegistry().getServiceProviders
 | |
|       (ImageOutputStreamSpi.class, true);
 | |
| 
 | |
|     ImageOutputStreamSpi foundSpi = null;
 | |
| 
 | |
|     while(spis.hasNext())
 | |
|       {
 | |
|         ImageOutputStreamSpi spi = (ImageOutputStreamSpi) spis.next();
 | |
| 
 | |
|         if (output.getClass().equals(spi.getOutputClass()))
 | |
|           {
 | |
|             foundSpi = spi;
 | |
|             break;
 | |
|           }
 | |
|       }
 | |
| 
 | |
|     return foundSpi == null ? null :
 | |
|       foundSpi.createOutputStreamInstance (output,
 | |
|                                            getUseCache(),
 | |
|                                            getCacheDirectory());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an image reader corresponding to an image writer, or
 | |
|    * null if writer is not registered or if no corresponding reader is
 | |
|    * registered.
 | |
|    *
 | |
|    * @param writer a registered image writer
 | |
|    *
 | |
|    * @return an image reader corresponding to writer, or null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if writer is null
 | |
|    */
 | |
|   public static ImageReader getImageReader (ImageWriter writer)
 | |
|   {
 | |
|     if (writer == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     ImageWriterSpi spi = writer.getOriginatingProvider();
 | |
| 
 | |
|     String[] readerSpiNames = spi.getImageReaderSpiNames();
 | |
| 
 | |
|     ImageReader r = null;
 | |
| 
 | |
|     if (readerSpiNames != null)
 | |
|       {
 | |
|         try
 | |
|           {
 | |
|             Class readerClass = Class.forName (readerSpiNames[0]);
 | |
|             r = (ImageReader) readerClass.newInstance ();
 | |
|           }
 | |
|         catch (Exception e)
 | |
|           {
 | |
|             return null;
 | |
|           }
 | |
|       }
 | |
|     return r;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over the collection of registered image
 | |
|    * readers that support reading data from the given object.
 | |
|    *
 | |
|    * @param input the object for which to retrieve image readers
 | |
|    *
 | |
|    * @return an iterator over a collection of image readers
 | |
|    */
 | |
|   public static Iterator<ImageReader> getImageReaders (Object input)
 | |
|   {
 | |
|     if (input == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     Iterator<ImageReaderSpi> spiIterator
 | |
|       = getRegistry().getServiceProviders (ImageReaderSpi.class,
 | |
|                                            new ReaderObjectFilter(input),
 | |
|                                            true);
 | |
|     return new ImageReaderIterator(spiIterator);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over the collection of registered image
 | |
|    * writers that support writing images of the given type and in the
 | |
|    * given format.
 | |
|    *
 | |
|    * @param type the output image's colour and sample models
 | |
|    * @param formatName the output image format
 | |
|    *
 | |
|    * @return an iterator over a collection of image writers
 | |
|    */
 | |
|   public static Iterator<ImageWriter> getImageWriters (ImageTypeSpecifier type,
 | |
|                                           String formatName)
 | |
|   {
 | |
|     if (type == null || formatName == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     final Iterator<ImageWriterSpi> spiIterator
 | |
|       = getRegistry().getServiceProviders (ImageWriterSpi.class,
 | |
|                                            new WriterObjectFilter(type,
 | |
|                                                                   formatName),
 | |
|                                                                   true);
 | |
|     return new ImageWriterIterator(spiIterator);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an image writer corresponding to an image reader, or
 | |
|    * null if reader is not registered or if no corresponding writer is
 | |
|    * registered.  This method is useful for preserving metadata
 | |
|    * without needing to understand its format, since the returned
 | |
|    * writer will be able to write, unchanged, the metadata passed to
 | |
|    * it by the reader.
 | |
|    *
 | |
|    * @param reader a registered image reader
 | |
|    *
 | |
|    * @return an image writer corresponding to reader, or null
 | |
|    *
 | |
|    * @exception IllegalArgumentException if reader is null
 | |
|    */
 | |
|   public static ImageWriter getImageWriter (ImageReader reader)
 | |
|   {
 | |
|     if (reader == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     ImageReaderSpi spi = reader.getOriginatingProvider();
 | |
| 
 | |
|     String[] writerSpiNames = spi.getImageWriterSpiNames();
 | |
| 
 | |
|     ImageWriter w = null;
 | |
| 
 | |
|     if (writerSpiNames != null)
 | |
|       {
 | |
|         try
 | |
|           {
 | |
|             Class writerClass = Class.forName (writerSpiNames[0]);
 | |
|             w = (ImageWriter) writerClass.newInstance ();
 | |
|           }
 | |
|         catch (Exception e)
 | |
|           {
 | |
|             return null;
 | |
|           }
 | |
|       }
 | |
|     return w;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Retrieve an iterator over a collection of image transcoders that
 | |
|    * support transcoding from the given image reader's metadata format
 | |
|    * to the given writer's metadata format.
 | |
|    *
 | |
|    * @param reader an image reader
 | |
|    * @param writer an image writer
 | |
|    *
 | |
|    * @return an iterator over a collection of image transcoders
 | |
|    *
 | |
|    * @exception IllegalArgumentException if either reader or writer is
 | |
|    * null
 | |
|    */
 | |
|   public static Iterator<ImageTranscoder> getImageTranscoders (ImageReader reader,
 | |
|                                                                ImageWriter writer)
 | |
|   {
 | |
|     if (reader == null || writer == null)
 | |
|       throw new IllegalArgumentException ("null argument");
 | |
| 
 | |
|     final Iterator<ImageTranscoderSpi> spiIterator
 | |
|       = getRegistry().getServiceProviders (ImageTranscoderSpi.class,
 | |
|                                            new TranscoderFilter (reader,
 | |
|                                                                  writer),
 | |
|                                            true);
 | |
|     return new Iterator<ImageTranscoder>()
 | |
|     {
 | |
|       public boolean hasNext()
 | |
|       {
 | |
|         return spiIterator.hasNext();
 | |
|       }
 | |
| 
 | |
|       public ImageTranscoder next()
 | |
|       {
 | |
|         return spiIterator.next().createTranscoderInstance();
 | |
|       }
 | |
| 
 | |
|       public void remove()
 | |
|       {
 | |
|         throw new UnsupportedOperationException();
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| }
 |