12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391 |
- /* ImageWriter.java -- Encodes raster images.
- 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.Dimension;
- import java.awt.Rectangle;
- import java.awt.image.BufferedImage;
- import java.awt.image.Raster;
- import java.awt.image.RenderedImage;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Locale;
- import java.util.ResourceBundle;
- import java.util.MissingResourceException;
- import javax.imageio.event.IIOWriteProgressListener;
- import javax.imageio.event.IIOWriteWarningListener;
- import javax.imageio.metadata.IIOMetadata;
- import javax.imageio.spi.ImageWriterSpi;
- /**
- * A class for encoding images within the ImageIO framework.
- *
- * An ImageWriter for a given format is instantiated by an
- * ImageWriterSpi for that format. ImageWriterSpis are registered
- * with the IIORegistry.
- *
- * The ImageWriter API supports writing animated images that may have
- * multiple frames; to support such images many methods take an index
- * parameter.
- *
- * Images may also be written in multiple passes, where each
- * successive pass increases the level of detail in the destination
- * image.
- */
- public abstract class ImageWriter
- implements ImageTranscoder
- {
- private boolean aborted;
- /**
- * All locales available for localization of warning messages, or
- * null if localization is not supported.
- */
- protected Locale[] availableLocales = null;
- /**
- * The current locale used to localize warning messages, or null if
- * no locale has been set.
- */
- protected Locale locale = null;
- /**
- * The image writer SPI that instantiated this writer.
- */
- protected ImageWriterSpi originatingProvider = null;
- /**
- * An ImageInputStream to which image data is written.
- */
- protected Object output = null;
- /**
- * A list of installed progress listeners. Initially null, meaning
- * no installed listeners.
- */
- protected List<IIOWriteProgressListener> progressListeners = null;
- /**
- * A list of installed warning listeners. Initially null, meaning
- * no installed listeners.
- */
- protected List<IIOWriteWarningListener> warningListeners = null;
- /**
- * A list of warning locales corresponding with the list of
- * installed warning listeners. Initially null, meaning no locales.
- */
- protected List<Locale> warningLocales = null;
- /**
- * Construct an image writer.
- *
- * @param originatingProvider the provider that is constructing this
- * image writer, or null
- */
- protected ImageWriter(ImageWriterSpi originatingProvider)
- {
- this.originatingProvider = originatingProvider;
- }
- /**
- * Throw an IllegalStateException if output is null.
- *
- * @exception IllegalStateException if output is null
- */
- private void checkOutputSet()
- {
- if (output == null)
- throw new IllegalStateException("no output set");
- }
- /**
- * Request that writing be aborted. The unwritten portions of the
- * destination image will be undefined.
- *
- * Writers should clear the abort flag before starting a write
- * operation, then poll it periodically during the write operation.
- */
- public void abort()
- {
- aborted = true;
- }
- /**
- * Check if the abort flag is set.
- *
- * @return true if the current write operation should be aborted,
- * false otherwise
- */
- protected boolean abortRequested()
- {
- return aborted;
- }
- /**
- * Install a write progress listener. This method will return
- * immediately if listener is null.
- *
- * @param listener a write progress listener or null
- */
- public void addIIOWriteProgressListener(IIOWriteProgressListener listener)
- {
- if (listener == null)
- return;
- if (progressListeners == null)
- progressListeners = new ArrayList ();
- progressListeners.add(listener);
- }
- /**
- * Install a write warning listener. This method will return
- * immediately if listener is null. Warning messages sent to this
- * listener will be localized using the current locale. If the
- * current locale is null then this writer will select a sensible
- * default.
- *
- * @param listener a write warning listener
- */
- public void addIIOWriteWarningListener (IIOWriteWarningListener listener)
- {
- if (listener == null)
- return;
- if (warningListeners == null)
- warningListeners = new ArrayList ();
- warningListeners.add(listener);
- }
- /**
- * Check whether a new empty image can be inserted at the given
- * frame index. Pixel values may be filled in later using the
- * replacePixels methods. Indices greater than the insertion index
- * will be incremented. If imageIndex is -1, the image will be
- * appended at the end of the current image list.
- *
- * @param imageIndex the frame index
- *
- * @return true if an empty image can be inserted at imageIndex,
- * false otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IndexOutOfBoundsException if imageIndex is less than
- * -1 or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public boolean canInsertEmpty(int imageIndex)
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether an image can be inserted at the given frame index.
- * Indices greater than the insertion index will be incremented. If
- * imageIndex is -1, the image will be appended at the end of the
- * current image list.
- *
- * @param imageIndex the frame index
- *
- * @return true if an image can be inserted at imageIndex, false
- * otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IndexOutOfBoundsException if imageIndex is less than
- * -1 or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public boolean canInsertImage(int imageIndex)
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether an image can be removed from the given frame index.
- * Indices greater than the removal index will be decremented.
- *
- * @param imageIndex the frame index
- *
- * @return true if an image can be removed from imageIndex, false
- * otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public boolean canRemoveImage(int imageIndex)
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether the metadata associated the image at the given
- * frame index can be replaced.
- *
- * @param imageIndex the frame index
- *
- * @return true if the metadata associated with the image at
- * imageIndex can be replaced, false otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public boolean canReplaceImageMetadata(int imageIndex)
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether the pixels within the image at the given index can
- * be replaced.
- *
- * @param imageIndex the frame index
- *
- * @return true if the pixels in the image at imageIndex can be
- * replaced, false otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public boolean canReplacePixels(int imageIndex)
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether the metadata associated the entire image stream can
- * be replaced.
- *
- * @return true if the stream metadata can be replaced, false
- * otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IOException if a write error occurs
- */
- public boolean canReplaceStreamMetadata()
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check whether an entire empty image, including empty metadata and
- * empty thumbnails, can be written to the output stream, leaving
- * pixel values to be filled in later using the replacePixels
- * methods.
- *
- * @return true if an entire empty image can be written before its
- * contents are filled in, false otherwise
- *
- * @exception IllegalStateException if output is null
- * @exception IOException if a write error occurs
- */
- public boolean canWriteEmpty()
- throws IOException
- {
- checkOutputSet();
- return false;
- }
- /**
- * Check if IIOImages containing raster data are supported.
- *
- * @return true if raster IIOImages are supported, false otherwise
- */
- public boolean canWriteRasters()
- {
- return false;
- }
- /**
- * Check if an image can be appended at the end of the current list
- * of images even if prior images have already been written.
- *
- * @return true if sequences of images can be written, false
- * otherwise
- */
- public boolean canWriteSequence()
- {
- return false;
- }
- /**
- * Clear the abort flag.
- */
- protected void clearAbortRequest()
- {
- aborted = false;
- }
- /**
- * Convert IIOMetadata from an input reader format, returning an
- * IIOMetadata suitable for use by an image writer.
- *
- * The ImageTypeSpecifier specifies the destination image type.
- *
- * An optional ImageWriteParam argument is available in case the
- * image writing parameters affect the metadata conversion.
- *
- * @param inData the metadata coming from an image reader
- * @param imageType the output image type of the writer
- * @param param the image writing parameters or null
- *
- * @return the converted metadata that should be used by the image
- * writer, or null if this ImageTranscoder has no knowledge of the
- * input metadata
- *
- * @exception IllegalArgumentException if either inData or imageType
- * is null
- */
- public abstract IIOMetadata convertImageMetadata (IIOMetadata inData,
- ImageTypeSpecifier imageType,
- ImageWriteParam param);
- /**
- * Convert IIOMetadata from an input stream format, returning an
- * IIOMetadata suitable for use by an image writer.
- *
- * An optional ImageWriteParam argument is available in case the
- * image writing parameters affect the metadata conversion.
- *
- * @param inData the metadata coming from an input image stream
- * @param param the image writing parameters or null
- *
- * @return the converted metadata that should be used by the image
- * writer, or null if this ImageTranscoder has no knowledge of the
- * input metadata
- *
- * @exception IllegalArgumentException if inData is null
- */
- public abstract IIOMetadata convertStreamMetadata (IIOMetadata inData,
- ImageWriteParam param);
- /**
- * Releases any resources allocated to this object. Subsequent
- * calls to methods on this object will produce undefined results.
- *
- * The default implementation does nothing; subclasses should use
- * this method ensure that native resources are released.
- */
- public void dispose()
- {
- // The default implementation is empty. Subclasses have to overwrite it.
- }
- /**
- * Retrieve the available locales. Return null if no locales are
- * available or a clone of availableLocales.
- *
- * @return an array of locales or null
- */
- public Locale[] getAvailableLocales()
- {
- return availableLocales;
- }
- /**
- * Get a metadata object appropriate for encoding an image specified
- * by the given image type specifier and optional image write
- * parameters.
- *
- * @param imageType an image type specifier
- * @param param image writing parameters, or null
- *
- * @return a metadata object appropriate for encoding an image of
- * the given type with the given parameters
- */
- public abstract IIOMetadata getDefaultImageMetadata (ImageTypeSpecifier imageType, ImageWriteParam param);
- /**
- * Get a metadata object appropriate for encoding the default image
- * type handled by this writer, optionally considering image write
- * parameters.
- *
- * @param param image writing parameters, or null
- *
- * @return a metadata object appropriate for encoding an image of
- * the default type with the given parameters
- */
- public abstract IIOMetadata getDefaultStreamMetadata (ImageWriteParam param);
- /**
- * Retrieve the default write parameters for this writer's image
- * format.
- *
- * The default implementation returns new ImageWriteParam().
- *
- * @return image writing parameters
- */
- public ImageWriteParam getDefaultWriteParam()
- {
- return new ImageWriteParam(getLocale());
- }
- /**
- * Get this writer's locale. null is returned if the locale has not
- * been set.
- *
- * @return this writer's locale, or null
- */
- public Locale getLocale()
- {
- return locale;
- }
- /**
- * Get the number of thumbnails supported by this image writer,
- * based on the given image type, image writing parameters, and
- * stream and image metadata. The image writing parameters are
- * optional, in case they affect the number of thumbnails supported.
- *
- * @param imageType an image type specifier, or null
- * @param param image writing parameters, or null
- * @param streamMetadata the metadata associated with this stream,
- * or null
- * @param imageMetadata the metadata associated with this image, or
- * null
- *
- * @return the number of thumbnails that this writer supports
- * writing or -1 if the given information is insufficient
- */
- public int getNumThumbnailsSupported (ImageTypeSpecifier imageType,
- ImageWriteParam param,
- IIOMetadata streamMetadata,
- IIOMetadata imageMetadata)
- {
- return 0;
- }
- /**
- * Get the ImageWriterSpi that created this writer or null.
- *
- * @return an ImageWriterSpi, or null
- */
- public ImageWriterSpi getOriginatingProvider()
- {
- return originatingProvider;
- }
- /**
- * Get this reader's image output destination. null is returned if
- * the image destination has not been set.
- *
- * @return an image output destination object, or null
- */
- public Object getOutput()
- {
- return output;
- }
- /**
- * Get the preferred sizes for thumbnails based on the given image
- * type, image writing parameters, and stream and image metadata.
- * The preferred sizes are returned in pairs of dimension values;
- * the first value in the array is a dimension object representing
- * the minimum thumbnail size, the second value is a dimension
- * object representing a maximum thumbnail size. The writer can
- * select a size within the range given by each pair, or it can
- * ignore these size hints.
- *
- * @param imageType an image type specifier, or null
- * @param param image writing parameters, or null
- * @param streamMetadata the metadata associated with this stream,
- * or null
- * @param imageMetadata the metadata associated with this image, or
- * null
- *
- * @return an array of dimension pairs whose length is a multiple of
- * 2, or null if there is no preferred size (any size is allowed) or
- * if the size is unknown (insufficient information was provided)
- */
- public Dimension[] getPreferredThumbnailSizes (ImageTypeSpecifier imageType,
- ImageWriteParam param,
- IIOMetadata streamMetadata,
- IIOMetadata imageMetadata)
- {
- return null;
- }
- /**
- * Notifies all installed write progress listeners that image
- * loading has completed by calling their imageComplete methods.
- */
- protected void processImageComplete()
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.imageComplete(this);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners that a certain
- * percentage of the image has been loaded, by calling their
- * imageProgress methods.
- *
- * @param percentageDone the percentage of image data that has been
- * loaded
- */
- protected void processImageProgress(float percentageDone)
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.imageProgress(this, percentageDone);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners, by calling their
- * imageStarted methods, that image loading has started on the given
- * image.
- *
- * @param imageIndex the frame index of the image that has started
- * loading
- */
- protected void processImageStarted(int imageIndex)
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.imageStarted(this, imageIndex);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners, by calling their
- * thumbnailComplete methods, that a thumbnail has completed
- * loading.
- */
- protected void processThumbnailComplete()
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.thumbnailComplete(this);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners that a certain
- * percentage of a thumbnail has been loaded, by calling their
- * thumbnailProgress methods.
- *
- * @param percentageDone the percentage of thumbnail data that has
- * been loaded
- */
- protected void processThumbnailProgress(float percentageDone)
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.thumbnailProgress(this, percentageDone);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners, by calling their
- * imageStarted methods, that thumbnail loading has started on the
- * given thumbnail of the given image.
- *
- * @param imageIndex the frame index of the image one of who's
- * thumbnails has started loading
- * @param thumbnailIndex the index of the thumbnail that has started
- * loading
- */
- protected void processThumbnailStarted(int imageIndex, int thumbnailIndex)
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.thumbnailStarted(this, imageIndex, thumbnailIndex);
- }
- }
- }
- /**
- * Notifies all installed warning listeners, by calling their
- * warningOccurred methods, that a warning message has been raised.
- *
- * @param imageIndex the index of the image that was being written
- * when the warning was raised
- * @param warning the warning message
- *
- * @exception IllegalArgumentException if warning is null
- */
- protected void processWarningOccurred(int imageIndex, String warning)
- {
- if (warningListeners != null)
- {
- Iterator it = warningListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteWarningListener listener =
- (IIOWriteWarningListener) it.next();
- listener.warningOccurred(this, imageIndex, warning);
- }
- }
- }
- /**
- * Notify all installed warning listeners, by calling their
- * warningOccurred methods, that a warning message has been raised.
- * The warning message is retrieved from a resource bundle, using
- * the given basename and keyword.
- *
- * @param imageIndex the index of the image that was being written
- * when the warning was raised
- * @param baseName the basename of the resource from which to
- * retrieve the warning message
- * @param keyword the keyword used to retrieve the warning from the
- * resource bundle
- *
- * @exception IllegalArgumentException if either baseName or keyword
- * is null
- * @exception IllegalArgumentException if no resource bundle is
- * found using baseName
- * @exception IllegalArgumentException if the given keyword produces
- * no results from the resource bundle
- * @exception IllegalArgumentException if the retrieved object is
- * not a String
- */
- protected void processWarningOccurred(int imageIndex,
- String baseName,
- String keyword)
- {
- if (baseName == null || keyword == null)
- throw new IllegalArgumentException ("null argument");
- ResourceBundle b = null;
- try
- {
- b = ResourceBundle.getBundle(baseName, getLocale());
- }
- catch (MissingResourceException e)
- {
- throw new IllegalArgumentException ("no resource bundle found");
- }
- Object str = null;
- try
- {
- str = b.getObject(keyword);
- }
- catch (MissingResourceException e)
- {
- throw new IllegalArgumentException ("no results found for keyword");
- }
- if (! (str instanceof String))
- throw new IllegalArgumentException ("retrieved object not a String");
- String warning = (String) str;
- if (warningListeners != null)
- {
- Iterator it = warningListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteWarningListener listener =
- (IIOWriteWarningListener) it.next();
- listener.warningOccurred(this, imageIndex, warning);
- }
- }
- }
- /**
- * Notifies all installed write progress listeners that image
- * loading has been aborted by calling their writeAborted methods.
- */
- protected void processWriteAborted()
- {
- if (progressListeners != null)
- {
- Iterator it = progressListeners.iterator();
- while (it.hasNext())
- {
- IIOWriteProgressListener listener =
- (IIOWriteProgressListener) it.next();
- listener.writeAborted(this);
- }
- }
- }
- /**
- * Uninstall all write progress listeners.
- */
- public void removeAllIIOWriteProgressListeners()
- {
- if (progressListeners != null)
- {
- progressListeners.clear();
- }
- }
- /**
- * Uninstall all write warning listeners.
- */
- public void removeAllIIOWriteWarningListeners()
- {
- if (progressListeners != null)
- {
- progressListeners.clear();
- }
- }
- /**
- * Uninstall the given write progress listener.
- *
- * @param listener the listener to remove
- */
- public void removeIIOWriteProgressListener (IIOWriteProgressListener listener)
- {
- if (listener == null)
- return;
- if (progressListeners != null)
- {
- progressListeners.remove(listener);
- }
- }
- /**
- * Uninstall the given write warning listener.
- *
- * @param listener the listener to remove
- */
- public void removeIIOWriteWarningListener (IIOWriteWarningListener listener)
- {
- if (listener == null)
- return;
- if (warningListeners != null)
- {
- warningListeners.remove(listener);
- }
- }
- /**
- * Reset this writer's internal state.
- */
- public void reset()
- {
- setOutput(null);
- setLocale(null);
- removeAllIIOWriteWarningListeners();
- removeAllIIOWriteProgressListeners();
- clearAbortRequest();
- }
- /**
- * Set the current locale or use the default locale.
- *
- * @param locale the locale to set, or null
- */
- public void setLocale(Locale locale)
- {
- if (locale != null)
- {
- // Check if its a valid locale.
- boolean found = false;
- if (availableLocales != null)
- for (int i = availableLocales.length - 1; i >= 0; --i)
- if (availableLocales[i].equals(locale))
- found = true;
- if (! found)
- throw new IllegalArgumentException("looale not available");
- }
- this.locale = locale;
- }
- /**
- * Set the output destination of the given object. The output
- * destination must be set before many methods can be called on this
- * writer. (see all ImageWriter methods that throw
- * IllegalStateException). If input is null then the current input
- * source will be removed.
- *
- * @param output the output destination object
- *
- * @exception IllegalArgumentException if input is not a valid input
- * source for this writer and is not an ImageInputStream
- */
- public void setOutput(Object output)
- {
- if (output != null)
- {
- // Check if its a valid output object.
- boolean found = false;
- Class[] types = null;
- if (originatingProvider != null)
- types = originatingProvider.getOutputTypes();
- if (types != null)
- for (int i = types.length - 1; i >= 0; --i)
- if (types[i].isInstance(output))
- found = true;
- if (! found)
- throw new IllegalArgumentException("output type not available");
- }
- this.output = output;
- }
- /**
- * Write an image stream, including thumbnails and metadata to the
- * output stream. The output must have been set prior to this
- * method being called. Metadata associated with the stream may be
- * supplied, or it can be left null. IIOImage may contain raster
- * data if this writer supports rasters, or it will contain a
- * rendered image. Thumbnails are resized if need be. Image
- * writing parameters may be specified to affect writing, or may be
- * left null.
- *
- * @param streamMetadata metadata associated with this stream, or
- * null
- * @param image an IIOImage containing image data, metadata and
- * thumbnails to be written
- * @param param image writing parameters, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if image contains raster
- * data but this writer does not support rasters
- * @exception IllegalArgumentException if image is null
- * @exception IOException if a write error occurs
- */
- public abstract void write (IIOMetadata streamMetadata, IIOImage image, ImageWriteParam param)
- throws IOException;
- /**
- * Complete inserting an empty image in the output stream.
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if inserting empty
- * images is not supported
- * @exception IllegalArgumentException if a call to
- * prepareInsertEmpty was not called previous to this method being
- * called (a sequence of prepareInsertEmpty calls must be terminated
- * by a call to endInsertEmpty)
- * @exception IllegalArgumentException if prepareWriteEmpty was
- * called before this method being called (without a terminating
- * call to endWriteEmpty)
- * @exception IllegalArgumentException if prepareReplacePixels was
- * called before this method being called (without a terminating
- * call to endReplacePixels)
- * @exception IOException if a write error occurs
- */
- public void endInsertEmpty ()
- throws IOException
- {
- if (!canInsertEmpty(0))
- throw new UnsupportedOperationException();
- }
- /**
- * Complete replacing pixels in an image in the output stream.
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing pixels is
- * not supported by this writer
- * @exception IllegalArgumentException if prepareReplacePixels was
- * not called before this method being called
- * @exception IOException if a write error occurs
- */
- public void endReplacePixels ()
- throws IOException
- {
- if (!canReplacePixels(0))
- throw new UnsupportedOperationException();
- }
- /**
- * Complete writing an empty image to the image output stream.
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if writing empty images
- * is not supported
- * @exception IllegalArgumentException if a call to
- * prepareWriteEmpty was not called previous to this method being
- * called (a sequence of prepareWriteEmpty calls must be terminated
- * by a call to endWriteEmpty)
- * @exception IllegalArgumentException if prepareInsertEmpty was
- * called before this method being called (without a terminating
- * call to endInsertEmpty)
- * @exception IllegalArgumentException if prepareReplacePixels was
- * called before this method being called (without a terminating
- * call to endReplacePixels)
- * @exception IOException if a write error occurs
- */
- public void endWriteEmpty ()
- throws IOException
- {
- if (!canWriteEmpty())
- throw new UnsupportedOperationException();
- }
- /**
- * Complete writing a sequence of images to the output stream. This
- * method may patch header data and write out footer data.
- *
- * @exception IllegalStateException if output is null
- * @exception IllegalStateException if prepareWriteSequence has not
- * been called
- * @exception UnsupportedOperationException if writing a sequence of
- * images is not supported
- * @exception IOException if a write error occurs
- */
- public void endWriteSequence ()
- throws IOException
- {
- checkOutputSet();
- if (!canWriteSequence())
- throw new UnsupportedOperationException();
- }
- /**
- * Start inserting an empty image in the image output stream. All
- * indices after the specified index are incremented. An index of
- * -1 implies that the empty image should be appended to the end of
- * the current image list.
- *
- * The insertion that this method call starts is not complete until
- * endInsertEmpty is called. prepareInsertEmpty cannot be called
- * again until endInsertEmpty is called and calls to
- * prepareWriteEmpty and prepareInsertEmpty may not be intersperced.
- *
- * @param imageIndex the image index
- * @param imageType the image type specifier
- * @param width the image width
- * @param height the image height
- * @param imageMetadata the image metadata, or null
- * @param thumbnails a list of thumbnails, or null
- * @param param image write parameters, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if inserting empty
- * images is not supported
- * @exception IndexOutOfBoundsException if imageIndex is less than
- * -1 or greater than the last index in the current image list
- * @exception IllegalStateException if a previous call to
- * prepareInsertEmpty was made (without a terminating call to
- * endInsertEmpty)
- * @exception IllegalStateException if a previous call to
- * prepareWriteEmpty was made (without a terminating call to
- * endWriteEmpty)
- * @exception IllegalArgumentException if imageType is null or
- * thumbnails contain non-BufferedImage objects
- * @exception IllegalArgumentException if either width or height is
- * less than 1
- * @exception IOException if a write error occurs
- */
- public void prepareInsertEmpty (int imageIndex, ImageTypeSpecifier imageType,
- int width, int height,
- IIOMetadata imageMetadata,
- List<? extends BufferedImage> thumbnails,
- ImageWriteParam param)
- throws IOException
- {
- if (!canInsertEmpty(imageIndex))
- throw new UnsupportedOperationException();
- }
- /**
- * Start the replacement of pixels within an image in the output
- * stream. Output pixels will be clipped to lie within region.
- *
- * @param imageIndex the index of the image in which pixels are
- * being replaced
- * @param region the rectangle to which to limit pixel replacement
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing pixels is
- * not supported
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IllegalStateException if a previous call to
- * prepareReplacePixels was made (without a terminating call to
- * endReplacePixels)
- * @exception IllegalArgumentException if either region.width or
- * region.height is less than 1, or if region is null
- * @exception IOException if a write error occurs
- */
- public void prepareReplacePixels (int imageIndex, Rectangle region)
- throws IOException
- {
- if (canReplacePixels(imageIndex))
- throw new UnsupportedOperationException();
- }
- /**
- * Start writing an empty image to the end of the image output
- * stream.
- *
- * The writing that this method call starts is not complete until
- * endWriteEmpty is called. prepareWritetEmpty cannot be called
- * again until endWriteEmpty is called and calls to
- * prepareWriteEmpty and prepareInsertEmpty may not be intersperced.
- *
- * @param streamMetadata metadata associated with the stream, or null
- * @param imageType the image type specifier
- * @param width the image width
- * @param height the image height
- * @param imageMetadata the image metadata, or null
- * @param thumbnails a list of thumbnails, or null
- * @param param image write parameters, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if writing empty images
- * is not supported
- * @exception IndexOutOfBoundsException if imageIndex is less than
- * -1 or greater than the last index in the current image list
- * @exception IllegalStateException if a previous call to
- * prepareInsertEmpty was made (without a terminating call to
- * endInsertEmpty)
- * @exception IllegalStateException if a previous call to
- * prepareWriteEmpty was made (without a terminating call to
- * endWriteEmpty)
- * @exception IllegalArgumentException if imageType is null or
- * thumbnails contain non-BufferedImage objects
- * @exception IllegalArgumentException if either width or height is
- * less than 1
- * @exception IOException if a write error occurs
- */
- public void prepareWriteEmpty (IIOMetadata streamMetadata,
- ImageTypeSpecifier imageType,
- int width, int height,
- IIOMetadata imageMetadata,
- List<? extends BufferedImage> thumbnails,
- ImageWriteParam param)
- throws IOException
- {
- if (!canWriteEmpty())
- throw new UnsupportedOperationException();
- }
- /**
- * Start the writing of a sequence of images.
- *
- * @param streamMetadata the stream metadata, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if writing sequences of
- * images is not supported
- * @exception IOException if a write error occurs
- */
- public void prepareWriteSequence (IIOMetadata streamMetadata)
- throws IOException
- {
- checkOutputSet();
- if (!canWriteSequence())
- throw new UnsupportedOperationException();
- }
- /**
- * Remove the image at the specified index from the output stream.
- *
- * @param imageIndex the frame index from which to remove the image
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if removing this image
- * is not supported
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public void removeImage (int imageIndex)
- throws IOException
- {
- if (!canRemoveImage(imageIndex))
- throw new UnsupportedOperationException();
- }
- /**
- * Replace the metadata associated with the image at the given
- * index.
- *
- * @param imageIndex the index of the image whose metadata should be
- * replaced
- * @param imageMetadata the metadata, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing this
- * image's metadata is not supported
- * @exception IndexOutOfBoundsException if imageIndex is less than 0
- * or greater than the last index in the current image list
- * @exception IOException if a write error occurs
- */
- public void replaceImageMetadata (int imageIndex, IIOMetadata imageMetadata)
- throws IOException
- {
- if (!canReplaceImageMetadata(imageIndex))
- throw new UnsupportedOperationException();
- }
- /**
- * Replace a region of an image in the output stream with a portion
- * of the given rendered image. The image data must be of the same
- * type as that in the output stream. The destination region is
- * given by the image writing parameters and the source region is
- * the one given to prepareReplacePixels.
- *
- * @param image the rendered image with which to overwrite the image
- * region in the stream
- * @param param the image writing parameters
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing pixels is
- * not supported
- * @exception IllegalStateException if prepareReplacePixels was not
- * called before this method was called
- * @exception IllegalArgumentException if image is null or if param
- * is null or if the overlap of the source and destination regions
- * contains no pixels or if the image types differ and no conversion
- * is possible
- * @exception IOException if a write error occurs
- */
- public void replacePixels (RenderedImage image,
- ImageWriteParam param)
- throws IOException
- {
- if (!canReplacePixels(0))
- throw new UnsupportedOperationException();
- }
- /**
- * Replace a region of an image in the output stream with a portion
- * of the given raster data. The image data must be of the same
- * type as that in the output stream. The destination region is
- * given by the image writing parameters and the source region is
- * the one given to prepareReplacePixels.
- *
- * @param raster the raster data with which to overwrite the image
- * region in the stream
- * @param param the image writing parameters
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing pixels is
- * not supported
- * @exception IllegalStateException if prepareReplacePixels was not
- * called before this method was called
- * @exception UnsupportedOperationException if raster data is not
- * supported
- * @exception IllegalArgumentException if raster is null or if param
- * is null or if the overlap of the source and destination regions
- * contains no pixels or if the image types differ and no conversion
- * is possible
- * @exception IOException if a write error occurs
- */
- public void replacePixels (Raster raster, ImageWriteParam param)
- throws IOException
- {
- if (!canReplacePixels(0))
- throw new UnsupportedOperationException();
- }
- /**
- * Replace the metadata associated with this image stream.
- *
- * @param streamMetadata the stream metadata, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if replacing the stream
- * metadata is not supported
- * @exception IOException if a write error occurs
- */
- public void replaceStreamMetadata (IIOMetadata streamMetadata)
- throws IOException
- {
- if (!canReplaceStreamMetadata())
- throw new UnsupportedOperationException();
- }
- /**
- * Write a rendered image to the output stream.
- *
- * @param image a rendered image containing image data to be written
- *
- * @exception IllegalStateException if output is null
- * @exception IllegalArgumentException if image is null
- * @exception IOException if a write error occurs
- */
- public void write (RenderedImage image)
- throws IOException
- {
- checkOutputSet();
- write (null, new IIOImage(image, null, null), null);
- }
- /**
- * Write a image data, metadata and thumbnails to the output stream.
- *
- * @param image image data, metadata and thumbnails to be written
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if image contains raster
- * data but this writer does not support rasters
- * @exception IllegalArgumentException if image is null
- * @exception IOException if a write error occurs
- */
- public void write (IIOImage image)
- throws IOException
- {
- checkOutputSet();
- write (null, image, null);
- }
- /**
- * Insert an image into the output stream. Indices greater than the
- * specified index are incremented accordingly. Specifying an index
- * of -1 causes the image to be appended at the end of the current
- * image list.
- *
- * @param imageIndex the frame index at which to insert the image
- * @param image the image data, metadata and thumbnails to be
- * inserted
- * @param param image write parameters, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if image insertion is
- * not supported
- * @exception IllegalArgumentException if image is null
- * @exception IndexOutOfBoundsException if imageIndex is less than
- * -1 or greater than the last index in the current image list
- * @exception UnsupportedOperationException if image contains raster
- * data but this writer does not support rasters
- * @exception IOException if a write error occurs
- */
- public void writeInsert (int imageIndex, IIOImage image, ImageWriteParam param)
- throws IOException
- {
- if (!canInsertImage(imageIndex))
- throw new UnsupportedOperationException();
- }
- /**
- * Write a sequence of images, including thumbnails and metadata, to
- * the output stream. The output must have been set prior to this
- * method being called. Metadata associated with the stream may be
- * supplied, or it can be left null. IIOImage may contain raster
- * data if this writer supports rasters, or it will contain a
- * rendered image. Thumbnails are resized if need be. Image
- * writing parameters may be specified to affect writing, or may be
- * left null.
- *
- * @param streamMetadata metadata associated with this stream, or
- * null
- * @param image an IIOImage containing image data, metadata and
- * thumbnails to be written
- * @param param image writing parameters, or null
- *
- * @exception IllegalStateException if output is null
- * @exception UnsupportedOperationException if writing sequences of
- * images is not supported
- * @exception IllegalArgumentException if image is null
- * @exception UnsupportedOperationException if image contains raster
- * data but this writer does not support rasters
- * @exception IOException if a write error occurs
- */
- public void writeToSequence (IIOImage image, ImageWriteParam param)
- throws IOException
- {
- if (!canWriteSequence())
- throw new UnsupportedOperationException();
- }
- }
|