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

#ifndef __gnu_java_awt_peer_gtk_GdkPixbufDecoder__
#define __gnu_java_awt_peer_gtk_GdkPixbufDecoder__

#pragma interface

#include <gnu/java/awt/image/ImageDecoder.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace classpath
    {
        class Pointer;
    }
    namespace java
    {
      namespace awt
      {
        namespace peer
        {
          namespace gtk
          {
              class GdkPixbufDecoder;
              class GdkPixbufDecoder$GdkPixbufReaderSpi;
              class GdkPixbufDecoder$GdkPixbufWriter;
              class GdkPixbufDecoder$GdkPixbufWriterSpi;
              class GdkPixbufDecoder$ImageFormatSpec;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
      namespace image
      {
          class ColorModel;
      }
    }
    namespace net
    {
        class URL;
    }
  }
  namespace javax
  {
    namespace imageio
    {
      namespace spi
      {
          class IIORegistry;
      }
    }
  }
}

class gnu::java::awt::peer::gtk::GdkPixbufDecoder : public ::gnu::java::awt::image::ImageDecoder
{

public: // actually package-private
  static void initStaticState();
  virtual void initState();
  virtual void pumpBytes(JArray< jbyte > *, jint);
  virtual void pumpDone();
  virtual void finish(jboolean);
  static void streamImage(JArray< jint > *, ::java::lang::String *, jint, jint, jboolean, ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$GdkPixbufWriter *);
public:
  GdkPixbufDecoder(::java::io::DataInput *);
  GdkPixbufDecoder(::java::io::InputStream *);
  GdkPixbufDecoder(::java::lang::String *);
  GdkPixbufDecoder(::java::net::URL *);
  GdkPixbufDecoder(JArray< jbyte > *, jint, jint);
public: // actually package-private
  virtual void areaPrepared(jint, jint);
  virtual void areaUpdated(jint, jint, jint, jint, JArray< jint > *, jint);
public:
  virtual void produce(::java::util::Vector *, ::java::io::InputStream *);
  virtual void finalize();
  static ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$ImageFormatSpec * registerFormat(::java::lang::String *, jboolean);
public: // actually package-private
  static JArray< ::java::lang::String * > * getFormatNames(jboolean);
  static JArray< ::java::lang::String * > * getFormatExtensions(jboolean);
  static JArray< ::java::lang::String * > * getFormatMimeTypes(jboolean);
  static ::java::lang::String * findFormatName(::java::lang::Object *, jboolean);
public:
  static ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$GdkPixbufReaderSpi * getReaderSpi();
  static ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$GdkPixbufWriterSpi * getWriterSpi();
  static void registerSpis(::javax::imageio::spi::IIORegistry *);
public: // actually package-private
  static ::java::lang::Object * pixbufLock;
private:
  jint __attribute__((aligned(__alignof__( ::gnu::java::awt::image::ImageDecoder)))) native_state;
  jboolean needsClose;
public: // actually package-private
  ::java::util::Vector * curr;
private:
  ::gnu::classpath::Pointer * nativeDecoder;
public: // actually package-private
  static ::java::awt::image::ColorModel * cm;
  static ::java::util::ArrayList * imageFormatSpecs;
private:
  static ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$GdkPixbufReaderSpi * readerSpi;
  static ::gnu::java::awt::peer::gtk::GdkPixbufDecoder$GdkPixbufWriterSpi * writerSpi;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_gtk_GdkPixbufDecoder__
