/* * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.imageio.spi; import java.awt.image.RenderedImage;import java.io.IOException;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriter;import javax.imageio.stream.ImageOutputStream; /** * The service provider interface (SPI) for <code>ImageWriter</code>s. * For more information on service provider classes, see the class comment * for the <code>IIORegistry</code> class. * * <p> Each <code>ImageWriterSpi</code> provides several types of information * about the <code>ImageWriter</code> class with which it is associated. * * <p> The name of the vendor who defined the SPI class and a * brief description of the class are available via the * <code>getVendorName</code>, <code>getDescription</code>, * and <code>getVersion</code> methods. * These methods may be internationalized to provide locale-specific * output. These methods are intended mainly to provide short, * human-writable information that might be used to organize a pop-up * menu or other list. * * <p> Lists of format names, file suffixes, and MIME types associated * with the service may be obtained by means of the * <code>getFormatNames</code>, <code>getFileSuffixes</code>, and * <code>getMIMEType</code> methods. These methods may be used to * identify candidate <code>ImageWriter</code>s for writing a * particular file or stream based on manual format selection, file * naming, or MIME associations. * * <p> A more reliable way to determine which <code>ImageWriter</code>s * are likely to be able to parse a particular data stream is provided * by the <code>canEncodeImage</code> method. This methods allows the * service provider to inspect the actual image contents. * * <p> Finally, an instance of the <code>ImageWriter</code> class * associated with this service provider may be obtained by calling * the <code>createWriterInstance</code> method. Any heavyweight * initialization, such as the loading of native libraries or creation * of large tables, should be deferred at least until the first * invocation of this method. * * @see IIORegistry * @see javax.imageio.ImageTypeSpecifier * @see javax.imageio.ImageWriter * */public abstract class ImageWriterSpi extends ImageReaderWriterSpi { /** * A single-element array, initially containing * <code>ImageOutputStream.class</code>, to be returned from * <code>getOutputTypes</code>. * @deprecated Instead of using this field, directly create * the equivalent array <code>{ ImageOutputStream.class }<code>. */ @Deprecated public static final Class[] STANDARD_OUTPUT_TYPE = { ImageOutputStream.class }; /** * An array of <code>Class</code> objects to be returned from * <code>getOutputTypes</code>, initially <code>null</code>. */ protected Class[] outputTypes = null; /** * An array of strings to be returned from * <code>getImageReaderSpiNames</code>, initially * <code>null</code>. */ protected String[] readerSpiNames = null; /** * The <code>Class</code> of the writer, initially * <code>null</code>. */ private Class writerClass = null; /** * Constructs a blank <code>ImageWriterSpi</code>. It is up to * the subclass to initialize instance variables and/or override * method implementations in order to provide working versions of * all methods. */ protected ImageWriterSpi() { } /** * Constructs an <code>ImageWriterSpi</code> with a given * set of values. * * @param vendorName the vendor name, as a non-<code>null</code> * <code>String</code>. * @param version a version identifier, as a non-<code>null</code> * <code>String</code>. * @param names a non-<code>null</code> array of * <code>String</code>s indicating the format names. At least one * entry must be present. * @param suffixes an array of <code>String</code>s indicating the * common file suffixes. If no suffixes are defined, * <code>null</code> should be supplied. An array of length 0 * will be normalized to <code>null</code>. * @param MIMETypes an array of <code>String</code>s indicating * the format's MIME types. If no suffixes are defined, * <code>null</code> should be supplied. An array of length 0 * will be normalized to <code>null</code>. * @param writerClassName the fully-qualified name of the * associated <code>ImageWriterSpi</code> class, as a * non-<code>null</code> <code>String</code>. * @param outputTypes an array of <code>Class</code> objects of * length at least 1 indicating the legal output types. * @param readerSpiNames an array <code>String</code>s of length * at least 1 naming the classes of all associated * <code>ImageReader</code>s, or <code>null</code>. An array of * length 0 is normalized to <code>null</code>. * @param supportsStandardStreamMetadataFormat a * <code>boolean</code> that indicates whether a stream metadata * object can use trees described by the standard metadata format. * @param nativeStreamMetadataFormatName a * <code>String</code>, or <code>null</code>, to be returned from * <code>getNativeStreamMetadataFormatName</code>. * @param nativeStreamMetadataFormatClassName a * <code>String</code>, or <code>null</code>, to be used to instantiate * a metadata format object to be returned from * <code>getNativeStreamMetadataFormat</code>. * @param extraStreamMetadataFormatNames an array of * <code>String</code>s, or <code>null</code>, to be returned from * <code>getExtraStreamMetadataFormatNames</code>. An array of length * 0 is normalized to <code>null</code>. * @param extraStreamMetadataFormatClassNames an array of * <code>String</code>s, or <code>null</code>, to be used to instantiate * a metadata format object to be returned from * <code>getStreamMetadataFormat</code>. An array of length * 0 is normalized to <code>null</code>. * @param supportsStandardImageMetadataFormat a * <code>boolean</code> that indicates whether an image metadata * object can use trees described by the standard metadata format. * @param nativeImageMetadataFormatName a * <code>String</code>, or <code>null</code>, to be returned from * <code>getNativeImageMetadataFormatName</code>. * @param nativeImageMetadataFormatClassName a * <code>String</code>, or <code>null</code>, to be used to instantiate * a metadata format object to be returned from * <code>getNativeImageMetadataFormat</code>. * @param extraImageMetadataFormatNames an array of * <code>String</code>s to be returned from * <code>getExtraImageMetadataFormatNames</code>. An array of length 0 * is normalized to <code>null</code>. * @param extraImageMetadataFormatClassNames an array of * <code>String</code>s, or <code>null</code>, to be used to instantiate * a metadata format object to be returned from * <code>getImageMetadataFormat</code>. An array of length * 0 is normalized to <code>null</code>. * * @exception IllegalArgumentException if <code>vendorName</code> * is <code>null</code>. * @exception IllegalArgumentException if <code>version</code> * is <code>null</code>. * @exception IllegalArgumentException if <code>names</code> * is <code>null</code> or has length 0. * @exception IllegalArgumentException if <code>writerClassName</code> * is <code>null</code>. * @exception IllegalArgumentException if <code>outputTypes</code> * is <code>null</code> or has length 0. */ public ImageWriterSpi(String vendorName, String version, String[] names, String[] suffixes, String[] MIMETypes, String writerClassName, Class[] outputTypes, String[] readerSpiNames, boolean supportsStandardStreamMetadataFormat, String nativeStreamMetadataFormatName, String nativeStreamMetadataFormatClassName, String[] extraStreamMetadataFormatNames, String[] extraStreamMetadataFormatClassNames, boolean supportsStandardImageMetadataFormat, String nativeImageMetadataFormatName, String nativeImageMetadataFormatClassName, String[] extraImageMetadataFormatNames, String[] extraImageMetadataFormatClassNames) { super(vendorName, version, names, suffixes, MIMETypes, writerClassName, supportsStandardStreamMetadataFormat, nativeStreamMetadataFormatName, nativeStreamMetadataFormatClassName, extraStreamMetadataFormatNames, extraStreamMetadataFormatClassNames, supportsStandardImageMetadataFormat, nativeImageMetadataFormatName, nativeImageMetadataFormatClassName, extraImageMetadataFormatNames, extraImageMetadataFormatClassNames); if (outputTypes == null) { throw new IllegalArgumentException ("outputTypes == null!"); } if (outputTypes.length == 0) { throw new IllegalArgumentException ("outputTypes.length == 0!"); } this.outputTypes = (outputTypes == STANDARD_OUTPUT_TYPE) ? new Class<?>[] { ImageOutputStream.class } : outputTypes.clone(); // If length == 0, leave it null if (readerSpiNames != null && readerSpiNames.length > 0) { this.readerSpiNames = (String[])readerSpiNames.clone(); } } /** * Returns <code>true</code> if the format that this writer * outputs preserves pixel data bit-accurately. The default * implementation returns <code>true</code>. * * @return <code>true</code> if the format preserves full pixel * accuracy. */ public boolean isFormatLossless() { return true; } /** * Returns an array of <code>Class</code> objects indicating what * types of objects may be used as arguments to the writer's * <code>setOutput</code> method. * * <p> For most writers, which only output to an * <code>ImageOutputStream</code>, a single-element array * containing <code>ImageOutputStream.class</code> should be * returned. * * @return a non-<code>null</code> array of * <code>Class</code>objects of length at least 1. */ public Class[] getOutputTypes() { return (Class[])outputTypes.clone(); } /** * Returns <code>true</code> if the <code>ImageWriter</code> * implementation associated with this service provider is able to * encode an image with the given layout. The layout * (<i>i.e.</i>, the image's <code>SampleModel</code> and * <code>ColorModel</code>) is described by an * <code>ImageTypeSpecifier</code> object. * * <p> A return value of <code>true</code> is not an absolute * guarantee of successful encoding; the encoding process may still * produce errors due to factors such as I/O errors, inconsistent * or malformed data structures, etc. The intent is that a * reasonable inspection of the basic structure of the image be * performed in order to determine if it is within the scope of * the encoding format. For example, a service provider for a * format that can only encode greyscale would return * <code>false</code> if handed an RGB <code>BufferedImage</code>. * Similarly, a service provider for a format that can encode * 8-bit RGB imagery might refuse to encode an image with an * associated alpha channel. * * <p> Different <code>ImageWriter</code>s, and thus service * providers, may choose to be more or less strict. For example, * they might accept an image with premultiplied alpha even though * it will have to be divided out of each pixel, at some loss of * precision, in order to be stored. * * @param type an <code>ImageTypeSpecifier</code> specifying the * layout of the image to be written. * * @return <code>true</code> if this writer is likely to be able * to encode images with the given layout. * * @exception IllegalArgumentException if <code>type</code> * is <code>null</code>. */ public abstract boolean canEncodeImage(ImageTypeSpecifier type); /** * Returns <code>true</code> if the <code>ImageWriter</code> * implementation associated with this service provider is able to * encode the given <code>RenderedImage</code> instance. Note * that this includes instances of * <code>java.awt.image.BufferedImage</code>. * * <p> See the discussion for * <code>canEncodeImage(ImageTypeSpecifier)</code> for information * on the semantics of this method. * * @param im an instance of <code>RenderedImage</code> to be encoded. * * @return <code>true</code> if this writer is likely to be able * to encode this image. * * @exception IllegalArgumentException if <code>im</code> * is <code>null</code>. */ public boolean canEncodeImage(RenderedImage im) { return canEncodeImage(ImageTypeSpecifier.createFromRenderedImage(im)); } /** * Returns an instance of the <code>ImageWriter</code> * implementation associated with this service provider. * The returned object will initially be in an initial state as if * its <code>reset</code> method had been called. * * <p> The default implementation simply returns * <code>createWriterInstance(null)</code>. * * @return an <code>ImageWriter</code> instance. * * @exception IOException if an error occurs during loading, * or initialization of the writer class, or during instantiation * or initialization of the writer object. */ public ImageWriter createWriterInstance() throws IOException { return createWriterInstance(null); } /** * Returns an instance of the <code>ImageWriter</code> * implementation associated with this service provider. * The returned object will initially be in an initial state * as if its <code>reset</code> method had been called. * * <p> An <code>Object</code> may be supplied to the plug-in at * construction time. The nature of the object is entirely * plug-in specific. * * <p> Typically, a plug-in will implement this method using code * such as <code>return new MyImageWriter(this)</code>. * * @param extension a plug-in specific extension object, which may * be <code>null</code>. * * @return an <code>ImageWriter</code> instance. * * @exception IOException if the attempt to instantiate * the writer fails. * @exception IllegalArgumentException if the * <code>ImageWriter</code>'s constructor throws an * <code>IllegalArgumentException</code> to indicate that the * extension object is unsuitable. */ public abstract ImageWriter createWriterInstance(Object extension) throws IOException; /** * Returns <code>true</code> if the <code>ImageWriter</code> object * passed in is an instance of the <code>ImageWriter</code> * associated with this service provider. * * @param writer an <code>ImageWriter</code> instance. * * @return <code>true</code> if <code>writer</code> is recognized * * @exception IllegalArgumentException if <code>writer</code> is * <code>null</code>. */ public boolean isOwnWriter(ImageWriter writer) { if (writer == null) { throw new IllegalArgumentException("writer == null!"); } String name = writer.getClass().getName(); return name.equals(pluginClassName); } /** * Returns an array of <code>String</code>s containing all the * fully qualified names of all the <code>ImageReaderSpi</code> * classes that can understand the internal metadata * representation used by the <code>ImageWriter</code> associated * with this service provider, or <code>null</code> if there are * no such <code>ImageReaders</code> specified. If a * non-<code>null</code> value is returned, it must have non-zero * length. * * <p> The first item in the array must be the name of the service * provider for the "preferred" reader, as it will be used to * instantiate the <code>ImageReader</code> returned by * <code>ImageIO.getImageReader(ImageWriter)</code>. * * <p> This mechanism may be used to obtain * <code>ImageReaders</code> that will generated non-pixel * meta-data (see <code>IIOExtraDataInfo</code>) in a structure * understood by an <code>ImageWriter</code>. By reading the * image and obtaining this data from one of the * <code>ImageReaders</code> obtained with this method and passing * it on to the <code>ImageWriter</code>, a client program can * read an image, modify it in some way, and write it back out * preserving all meta-data, without having to understand anything * about the internal structure of the meta-data, or even about * the image format. * * @return an array of <code>String</code>s of length at least 1 * containing names of <code>ImageReaderSpi</code>s, or * <code>null</code>. * * @see javax.imageio.ImageIO#getImageReader(ImageWriter) * @see ImageReaderSpi#getImageWriterSpiNames() */ public String[] getImageReaderSpiNames() { return readerSpiNames == null ? null : (String[])readerSpiNames.clone(); }}
/*
* Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javax.imageio.spi;
import java.awt.image.RenderedImage;
import java.io.IOException;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
/**
* The service provider interface (SPI) for <code>ImageWriter</code>s.
* For more information on service provider classes, see the class comment
* for the <code>IIORegistry</code> class.
*
* <p> Each <code>ImageWriterSpi</code> provides several types of information
* about the <code>ImageWriter</code> class with which it is associated.
*
* <p> The name of the vendor who defined the SPI class and a
* brief description of the class are available via the
* <code>getVendorName</code>, <code>getDescription</code>,
* and <code>getVersion</code> methods.
* These methods may be internationalized to provide locale-specific
* output. These methods are intended mainly to provide short,
* human-writable information that might be used to organize a pop-up
* menu or other list.
*
* <p> Lists of format names, file suffixes, and MIME types associated
* with the service may be obtained by means of the
* <code>getFormatNames</code>, <code>getFileSuffixes</code>, and
* <code>getMIMEType</code> methods. These methods may be used to
* identify candidate <code>ImageWriter</code>s for writing a
* particular file or stream based on manual format selection, file
* naming, or MIME associations.
*
* <p> A more reliable way to determine which <code>ImageWriter</code>s
* are likely to be able to parse a particular data stream is provided
* by the <code>canEncodeImage</code> method. This methods allows the
* service provider to inspect the actual image contents.
*
* <p> Finally, an instance of the <code>ImageWriter</code> class
* associated with this service provider may be obtained by calling
* the <code>createWriterInstance</code> method. Any heavyweight
* initialization, such as the loading of native libraries or creation
* of large tables, should be deferred at least until the first
* invocation of this method.
*
* @see IIORegistry
* @see javax.imageio.ImageTypeSpecifier
* @see javax.imageio.ImageWriter
*
*/
public abstract class ImageWriterSpi extends ImageReaderWriterSpi {
/**
* A single-element array, initially containing
* <code>ImageOutputStream.class</code>, to be returned from
* <code>getOutputTypes</code>.
* @deprecated Instead of using this field, directly create
* the equivalent array <code>{ ImageOutputStream.class }<code>.
*/
@Deprecated
public static final Class[] STANDARD_OUTPUT_TYPE =
{ ImageOutputStream.class };
/**
* An array of <code>Class</code> objects to be returned from
* <code>getOutputTypes</code>, initially <code>null</code>.
*/
protected Class[] outputTypes = null;
/**
* An array of strings to be returned from
* <code>getImageReaderSpiNames</code>, initially
* <code>null</code>.
*/
protected String[] readerSpiNames = null;
/**
* The <code>Class</code> of the writer, initially
* <code>null</code>.
*/
private Class writerClass = null;
/**
* Constructs a blank <code>ImageWriterSpi</code>. It is up to
* the subclass to initialize instance variables and/or override
* method implementations in order to provide working versions of
* all methods.
*/
protected ImageWriterSpi() {
}
/**
* Constructs an <code>ImageWriterSpi</code> with a given
* set of values.
*
* @param vendorName the vendor name, as a non-<code>null</code>
* <code>String</code>.
* @param version a version identifier, as a non-<code>null</code>
* <code>String</code>.
* @param names a non-<code>null</code> array of
* <code>String</code>s indicating the format names. At least one
* entry must be present.
* @param suffixes an array of <code>String</code>s indicating the
* common file suffixes. If no suffixes are defined,
* <code>null</code> should be supplied. An array of length 0
* will be normalized to <code>null</code>.
* @param MIMETypes an array of <code>String</code>s indicating
* the format's MIME types. If no suffixes are defined,
* <code>null</code> should be supplied. An array of length 0
* will be normalized to <code>null</code>.
* @param writerClassName the fully-qualified name of the
* associated <code>ImageWriterSpi</code> class, as a
* non-<code>null</code> <code>String</code>.
* @param outputTypes an array of <code>Class</code> objects of
* length at least 1 indicating the legal output types.
* @param readerSpiNames an array <code>String</code>s of length
* at least 1 naming the classes of all associated
* <code>ImageReader</code>s, or <code>null</code>. An array of
* length 0 is normalized to <code>null</code>.
* @param supportsStandardStreamMetadataFormat a
* <code>boolean</code> that indicates whether a stream metadata
* object can use trees described by the standard metadata format.
* @param nativeStreamMetadataFormatName a
* <code>String</code>, or <code>null</code>, to be returned from
* <code>getNativeStreamMetadataFormatName</code>.
* @param nativeStreamMetadataFormatClassName a
* <code>String</code>, or <code>null</code>, to be used to instantiate
* a metadata format object to be returned from
* <code>getNativeStreamMetadataFormat</code>.
* @param extraStreamMetadataFormatNames an array of
* <code>String</code>s, or <code>null</code>, to be returned from
* <code>getExtraStreamMetadataFormatNames</code>. An array of length
* 0 is normalized to <code>null</code>.
* @param extraStreamMetadataFormatClassNames an array of
* <code>String</code>s, or <code>null</code>, to be used to instantiate
* a metadata format object to be returned from
* <code>getStreamMetadataFormat</code>. An array of length
* 0 is normalized to <code>null</code>.
* @param supportsStandardImageMetadataFormat a
* <code>boolean</code> that indicates whether an image metadata
* object can use trees described by the standard metadata format.
* @param nativeImageMetadataFormatName a
* <code>String</code>, or <code>null</code>, to be returned from
* <code>getNativeImageMetadataFormatName</code>.
* @param nativeImageMetadataFormatClassName a
* <code>String</code>, or <code>null</code>, to be used to instantiate
* a metadata format object to be returned from
* <code>getNativeImageMetadataFormat</code>.
* @param extraImageMetadataFormatNames an array of
* <code>String</code>s to be returned from
* <code>getExtraImageMetadataFormatNames</code>. An array of length 0
* is normalized to <code>null</code>.
* @param extraImageMetadataFormatClassNames an array of
* <code>String</code>s, or <code>null</code>, to be used to instantiate
* a metadata format object to be returned from
* <code>getImageMetadataFormat</code>. An array of length
* 0 is normalized to <code>null</code>.
*
* @exception IllegalArgumentException if <code>vendorName</code>
* is <code>null</code>.
* @exception IllegalArgumentException if <code>version</code>
* is <code>null</code>.
* @exception IllegalArgumentException if <code>names</code>
* is <code>null</code> or has length 0.
* @exception IllegalArgumentException if <code>writerClassName</code>
* is <code>null</code>.
* @exception IllegalArgumentException if <code>outputTypes</code>
* is <code>null</code> or has length 0.
*/
public ImageWriterSpi(String vendorName,
String version,
String[] names,
String[] suffixes,
String[] MIMETypes,
String writerClassName,
Class[] outputTypes,
String[] readerSpiNames,
boolean supportsStandardStreamMetadataFormat,
String nativeStreamMetadataFormatName,
String nativeStreamMetadataFormatClassName,
String[] extraStreamMetadataFormatNames,
String[] extraStreamMetadataFormatClassNames,
boolean supportsStandardImageMetadataFormat,
String nativeImageMetadataFormatName,
String nativeImageMetadataFormatClassName,
String[] extraImageMetadataFormatNames,
String[] extraImageMetadataFormatClassNames) {
super(vendorName, version,
names, suffixes, MIMETypes, writerClassName,
supportsStandardStreamMetadataFormat,
nativeStreamMetadataFormatName,
nativeStreamMetadataFormatClassName,
extraStreamMetadataFormatNames,
extraStreamMetadataFormatClassNames,
supportsStandardImageMetadataFormat,
nativeImageMetadataFormatName,
nativeImageMetadataFormatClassName,
extraImageMetadataFormatNames,
extraImageMetadataFormatClassNames);
if (outputTypes == null) {
throw new IllegalArgumentException
("outputTypes == null!");
}
if (outputTypes.length == 0) {
throw new IllegalArgumentException
("outputTypes.length == 0!");
}
this.outputTypes = (outputTypes == STANDARD_OUTPUT_TYPE) ?
new Class<?>[] { ImageOutputStream.class } :
outputTypes.clone();
// If length == 0, leave it null
if (readerSpiNames != null && readerSpiNames.length > 0) {
this.readerSpiNames = (String[])readerSpiNames.clone();
}
}
/**
* Returns <code>true</code> if the format that this writer
* outputs preserves pixel data bit-accurately. The default
* implementation returns <code>true</code>.
*
* @return <code>true</code> if the format preserves full pixel
* accuracy.
*/
public boolean isFormatLossless() {
return true;
}
/**
* Returns an array of <code>Class</code> objects indicating what
* types of objects may be used as arguments to the writer's
* <code>setOutput</code> method.
*
* <p> For most writers, which only output to an
* <code>ImageOutputStream</code>, a single-element array
* containing <code>ImageOutputStream.class</code> should be
* returned.
*
* @return a non-<code>null</code> array of
* <code>Class</code>objects of length at least 1.
*/
public Class[] getOutputTypes() {
return (Class[])outputTypes.clone();
}
/**
* Returns <code>true</code> if the <code>ImageWriter</code>
* implementation associated with this service provider is able to
* encode an image with the given layout. The layout
* (<i>i.e.</i>, the image's <code>SampleModel</code> and
* <code>ColorModel</code>) is described by an
* <code>ImageTypeSpecifier</code> object.
*
* <p> A return value of <code>true</code> is not an absolute
* guarantee of successful encoding; the encoding process may still
* produce errors due to factors such as I/O errors, inconsistent
* or malformed data structures, etc. The intent is that a
* reasonable inspection of the basic structure of the image be
* performed in order to determine if it is within the scope of
* the encoding format. For example, a service provider for a
* format that can only encode greyscale would return
* <code>false</code> if handed an RGB <code>BufferedImage</code>.
* Similarly, a service provider for a format that can encode
* 8-bit RGB imagery might refuse to encode an image with an
* associated alpha channel.
*
* <p> Different <code>ImageWriter</code>s, and thus service
* providers, may choose to be more or less strict. For example,
* they might accept an image with premultiplied alpha even though
* it will have to be divided out of each pixel, at some loss of
* precision, in order to be stored.
*
* @param type an <code>ImageTypeSpecifier</code> specifying the
* layout of the image to be written.
*
* @return <code>true</code> if this writer is likely to be able
* to encode images with the given layout.
*
* @exception IllegalArgumentException if <code>type</code>
* is <code>null</code>.
*/
public abstract boolean canEncodeImage(ImageTypeSpecifier type);
/**
* Returns <code>true</code> if the <code>ImageWriter</code>
* implementation associated with this service provider is able to
* encode the given <code>RenderedImage</code> instance. Note
* that this includes instances of
* <code>java.awt.image.BufferedImage</code>.
*
* <p> See the discussion for
* <code>canEncodeImage(ImageTypeSpecifier)</code> for information
* on the semantics of this method.
*
* @param im an instance of <code>RenderedImage</code> to be encoded.
*
* @return <code>true</code> if this writer is likely to be able
* to encode this image.
*
* @exception IllegalArgumentException if <code>im</code>
* is <code>null</code>.
*/
public boolean canEncodeImage(RenderedImage im) {
return canEncodeImage(ImageTypeSpecifier.createFromRenderedImage(im));
}
/**
* Returns an instance of the <code>ImageWriter</code>
* implementation associated with this service provider.
* The returned object will initially be in an initial state as if
* its <code>reset</code> method had been called.
*
* <p> The default implementation simply returns
* <code>createWriterInstance(null)</code>.
*
* @return an <code>ImageWriter</code> instance.
*
* @exception IOException if an error occurs during loading,
* or initialization of the writer class, or during instantiation
* or initialization of the writer object.
*/
public ImageWriter createWriterInstance() throws IOException {
return createWriterInstance(null);
}
/**
* Returns an instance of the <code>ImageWriter</code>
* implementation associated with this service provider.
* The returned object will initially be in an initial state
* as if its <code>reset</code> method had been called.
*
* <p> An <code>Object</code> may be supplied to the plug-in at
* construction time. The nature of the object is entirely
* plug-in specific.
*
* <p> Typically, a plug-in will implement this method using code
* such as <code>return new MyImageWriter(this)</code>.
*
* @param extension a plug-in specific extension object, which may
* be <code>null</code>.
*
* @return an <code>ImageWriter</code> instance.
*
* @exception IOException if the attempt to instantiate
* the writer fails.
* @exception IllegalArgumentException if the
* <code>ImageWriter</code>'s constructor throws an
* <code>IllegalArgumentException</code> to indicate that the
* extension object is unsuitable.
*/
public abstract ImageWriter createWriterInstance(Object extension)
throws IOException;
/**
* Returns <code>true</code> if the <code>ImageWriter</code> object
* passed in is an instance of the <code>ImageWriter</code>
* associated with this service provider.
*
* @param writer an <code>ImageWriter</code> instance.
*
* @return <code>true</code> if <code>writer</code> is recognized
*
* @exception IllegalArgumentException if <code>writer</code> is
* <code>null</code>.
*/
public boolean isOwnWriter(ImageWriter writer) {
if (writer == null) {
throw new IllegalArgumentException("writer == null!");
}
String name = writer.getClass().getName();
return name.equals(pluginClassName);
}
/**
* Returns an array of <code>String</code>s containing all the
* fully qualified names of all the <code>ImageReaderSpi</code>
* classes that can understand the internal metadata
* representation used by the <code>ImageWriter</code> associated
* with this service provider, or <code>null</code> if there are
* no such <code>ImageReaders</code> specified. If a
* non-<code>null</code> value is returned, it must have non-zero
* length.
*
* <p> The first item in the array must be the name of the service
* provider for the "preferred" reader, as it will be used to
* instantiate the <code>ImageReader</code> returned by
* <code>ImageIO.getImageReader(ImageWriter)</code>.
*
* <p> This mechanism may be used to obtain
* <code>ImageReaders</code> that will generated non-pixel
* meta-data (see <code>IIOExtraDataInfo</code>) in a structure
* understood by an <code>ImageWriter</code>. By reading the
* image and obtaining this data from one of the
* <code>ImageReaders</code> obtained with this method and passing
* it on to the <code>ImageWriter</code>, a client program can
* read an image, modify it in some way, and write it back out
* preserving all meta-data, without having to understand anything
* about the internal structure of the meta-data, or even about
* the image format.
*
* @return an array of <code>String</code>s of length at least 1
* containing names of <code>ImageReaderSpi</code>s, or
* <code>null</code>.
*
* @see javax.imageio.ImageIO#getImageReader(ImageWriter)
* @see ImageReaderSpi#getImageWriterSpiNames()
*/
public String[] getImageReaderSpiNames() {
return readerSpiNames == null ?
null : (String[])readerSpiNames.clone();
}
}