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

#ifndef __gnu_java_awt_image_AsyncImage__
#define __gnu_java_awt_image_AsyncImage__

#pragma interface

#include <java/awt/Image.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace image
        {
            class AsyncImage;
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Image;
      namespace image
      {
          class ImageObserver;
          class ImageProducer;
      }
    }
  }
}

class gnu::java::awt::image::AsyncImage : public ::java::awt::Image
{

public: // actually package-private
  AsyncImage();
public:
  virtual void flush();
  virtual ::java::awt::Graphics * getGraphics();
  virtual jboolean isComplete();
  virtual jint getHeight(::java::awt::image::ImageObserver *);
  virtual ::java::lang::Object * getProperty(::java::lang::String *, ::java::awt::image::ImageObserver *);
  virtual ::java::awt::image::ImageProducer * getSource();
  virtual jint getWidth(::java::awt::image::ImageObserver *);
  virtual void addObserver(::java::awt::image::ImageObserver *);
  virtual jboolean prepareImage(jint, jint, ::java::awt::image::ImageObserver *);
  virtual jint checkImage(jint, jint, ::java::awt::image::ImageObserver *);
  virtual ::java::awt::Image * getRealImage();
  virtual void setRealImage(::java::awt::Image *);
  virtual void notifyObservers(jint, jint, jint, jint, jint);
  virtual void waitForImage(::java::awt::image::ImageObserver *);
public: // actually package-private
  static ::java::awt::Image * access$0(::gnu::java::awt::image::AsyncImage *);
private:
  ::java::awt::Image * volatile __attribute__((aligned(__alignof__( ::java::awt::Image)))) realImage;
public: // actually package-private
  ::java::util::HashSet * observers;
private:
  jboolean volatile complete;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_image_AsyncImage__
