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

#ifndef __gnu_java_awt_image_AsyncImage$AsyncImageSource__
#define __gnu_java_awt_image_AsyncImage$AsyncImageSource__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace image
        {
            class AsyncImage;
            class AsyncImage$AsyncImageSource;
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
      namespace image
      {
          class ImageConsumer;
          class ImageProducer;
      }
    }
  }
}

class gnu::java::awt::image::AsyncImage$AsyncImageSource : public ::java::lang::Object
{

  AsyncImage$AsyncImageSource(::gnu::java::awt::image::AsyncImage *);
public:
  virtual void addConsumer(::java::awt::image::ImageConsumer *);
  virtual jboolean isConsumer(::java::awt::image::ImageConsumer *);
  virtual void removeConsumer(::java::awt::image::ImageConsumer *);
  virtual void requestTopDownLeftRightResend(::java::awt::image::ImageConsumer *);
  virtual void startProduction(::java::awt::image::ImageConsumer *);
private:
  ::java::awt::image::ImageProducer * getRealSource();
public: // actually package-private
  AsyncImage$AsyncImageSource(::gnu::java::awt::image::AsyncImage *, ::gnu::java::awt::image::AsyncImage$AsyncImageSource *);
private:
  ::java::awt::image::ImageProducer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) realSource;
public: // actually package-private
  ::gnu::java::awt::image::AsyncImage * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_image_AsyncImage$AsyncImageSource__
