
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __javax_imageio_ImageWriter__
#define __javax_imageio_ImageWriter__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Dimension;
        class Rectangle;
      namespace image
      {
          class Raster;
          class RenderedImage;
      }
    }
  }
  namespace javax
  {
    namespace imageio
    {
        class IIOImage;
        class ImageTypeSpecifier;
        class ImageWriteParam;
        class ImageWriter;
      namespace event
      {
          class IIOWriteProgressListener;
          class IIOWriteWarningListener;
      }
      namespace metadata
      {
          class IIOMetadata;
      }
      namespace spi
      {
          class ImageWriterSpi;
      }
    }
  }
}

class javax::imageio::ImageWriter : public ::java::lang::Object
{

public: // actually protected
  ImageWriter(::javax::imageio::spi::ImageWriterSpi *);
private:
  void checkOutputSet();
public:
  virtual void abort();
public: // actually protected
  virtual jboolean abortRequested();
public:
  virtual void addIIOWriteProgressListener(::javax::imageio::event::IIOWriteProgressListener *);
  virtual void addIIOWriteWarningListener(::javax::imageio::event::IIOWriteWarningListener *);
  virtual jboolean canInsertEmpty(jint);
  virtual jboolean canInsertImage(jint);
  virtual jboolean canRemoveImage(jint);
  virtual jboolean canReplaceImageMetadata(jint);
  virtual jboolean canReplacePixels(jint);
  virtual jboolean canReplaceStreamMetadata();
  virtual jboolean canWriteEmpty();
  virtual jboolean canWriteRasters();
  virtual jboolean canWriteSequence();
public: // actually protected
  virtual void clearAbortRequest();
public:
  virtual ::javax::imageio::metadata::IIOMetadata * convertImageMetadata(::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::ImageTypeSpecifier *, ::javax::imageio::ImageWriteParam *) = 0;
  virtual ::javax::imageio::metadata::IIOMetadata * convertStreamMetadata(::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::ImageWriteParam *) = 0;
  virtual void dispose();
  virtual JArray< ::java::util::Locale * > * getAvailableLocales();
  virtual ::javax::imageio::metadata::IIOMetadata * getDefaultImageMetadata(::javax::imageio::ImageTypeSpecifier *, ::javax::imageio::ImageWriteParam *) = 0;
  virtual ::javax::imageio::metadata::IIOMetadata * getDefaultStreamMetadata(::javax::imageio::ImageWriteParam *) = 0;
  virtual ::javax::imageio::ImageWriteParam * getDefaultWriteParam();
  virtual ::java::util::Locale * getLocale();
  virtual jint getNumThumbnailsSupported(::javax::imageio::ImageTypeSpecifier *, ::javax::imageio::ImageWriteParam *, ::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::metadata::IIOMetadata *);
  virtual ::javax::imageio::spi::ImageWriterSpi * getOriginatingProvider();
  virtual ::java::lang::Object * getOutput();
  virtual JArray< ::java::awt::Dimension * > * getPreferredThumbnailSizes(::javax::imageio::ImageTypeSpecifier *, ::javax::imageio::ImageWriteParam *, ::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::metadata::IIOMetadata *);
public: // actually protected
  virtual void processImageComplete();
  virtual void processImageProgress(jfloat);
  virtual void processImageStarted(jint);
  virtual void processThumbnailComplete();
  virtual void processThumbnailProgress(jfloat);
  virtual void processThumbnailStarted(jint, jint);
  virtual void processWarningOccurred(jint, ::java::lang::String *);
  virtual void processWarningOccurred(jint, ::java::lang::String *, ::java::lang::String *);
  virtual void processWriteAborted();
public:
  virtual void removeAllIIOWriteProgressListeners();
  virtual void removeAllIIOWriteWarningListeners();
  virtual void removeIIOWriteProgressListener(::javax::imageio::event::IIOWriteProgressListener *);
  virtual void removeIIOWriteWarningListener(::javax::imageio::event::IIOWriteWarningListener *);
  virtual void reset();
  virtual void setLocale(::java::util::Locale *);
  virtual void setOutput(::java::lang::Object *);
  virtual void write(::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::IIOImage *, ::javax::imageio::ImageWriteParam *) = 0;
  virtual void endInsertEmpty();
  virtual void endReplacePixels();
  virtual void endWriteEmpty();
  virtual void endWriteSequence();
  virtual void prepareInsertEmpty(jint, ::javax::imageio::ImageTypeSpecifier *, jint, jint, ::javax::imageio::metadata::IIOMetadata *, ::java::util::List *, ::javax::imageio::ImageWriteParam *);
  virtual void prepareReplacePixels(jint, ::java::awt::Rectangle *);
  virtual void prepareWriteEmpty(::javax::imageio::metadata::IIOMetadata *, ::javax::imageio::ImageTypeSpecifier *, jint, jint, ::javax::imageio::metadata::IIOMetadata *, ::java::util::List *, ::javax::imageio::ImageWriteParam *);
  virtual void prepareWriteSequence(::javax::imageio::metadata::IIOMetadata *);
  virtual void removeImage(jint);
  virtual void replaceImageMetadata(jint, ::javax::imageio::metadata::IIOMetadata *);
  virtual void replacePixels(::java::awt::image::RenderedImage *, ::javax::imageio::ImageWriteParam *);
  virtual void replacePixels(::java::awt::image::Raster *, ::javax::imageio::ImageWriteParam *);
  virtual void replaceStreamMetadata(::javax::imageio::metadata::IIOMetadata *);
  virtual void write(::java::awt::image::RenderedImage *);
  virtual void write(::javax::imageio::IIOImage *);
  virtual void writeInsert(jint, ::javax::imageio::IIOImage *, ::javax::imageio::ImageWriteParam *);
  virtual void writeToSequence(::javax::imageio::IIOImage *, ::javax::imageio::ImageWriteParam *);
private:
  jboolean __attribute__((aligned(__alignof__( ::java::lang::Object)))) aborted;
public: // actually protected
  JArray< ::java::util::Locale * > * availableLocales;
  ::java::util::Locale * locale;
  ::javax::imageio::spi::ImageWriterSpi * originatingProvider;
  ::java::lang::Object * output;
  ::java::util::List * progressListeners;
  ::java::util::List * warningListeners;
  ::java::util::List * warningLocales;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_imageio_ImageWriter__
