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

#ifndef __gnu_java_awt_peer_qt_QtImage__
#define __gnu_java_awt_peer_qt_QtImage__

#pragma interface

#include <java/awt/Image.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace peer
        {
          namespace qt
          {
              class QMatrix;
              class QtComponentPeer;
              class QtGraphics;
              class QtImage;
              class QtImageGraphics;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Color;
        class Graphics;
        class Image;
      namespace image
      {
          class ColorModel;
          class ImageObserver;
          class ImageProducer;
      }
    }
    namespace net
    {
        class URL;
    }
  }
}

class gnu::java::awt::peer::qt::QtImage : public ::java::awt::Image
{

public:
  virtual void clear();
private:
  JArray< jint > * getPixels();
  void setPixels(JArray< jint > *);
  jboolean loadImage(::java::lang::String *);
  jboolean loadImageFromData(JArray< jbyte > *);
  void createImage();
  void freeImage();
  void createScaledImage(::gnu::java::awt::peer::qt::QtImage *, jint);
public: // actually package-private
  virtual void drawPixels(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, jint, jint, jint, jboolean);
private:
  void drawPixelsScaled(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, jint, jint, jint, jint, jint, jboolean);
  void drawPixelsTransformed(::gnu::java::awt::peer::qt::QtGraphics *, ::gnu::java::awt::peer::qt::QMatrix *);
public: // actually package-private
  virtual void drawPixelsScaledFlipped(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, jint, jboolean, jboolean, jint, jint, jint, jint, jint, jint, jint, jint, jboolean);
public:
  QtImage(::java::awt::image::ImageProducer *);
  QtImage(::java::net::URL *);
  QtImage(::java::lang::String *);
  QtImage(JArray< jbyte > *);
  QtImage(jint, jint);
private:
  QtImage(::gnu::java::awt::peer::qt::QtImage *, jint, jint, jint);
public:
  virtual void setImage(jint, jint, JArray< jint > *, ::java::util::Hashtable *);
  virtual jint getWidth(::java::awt::image::ImageObserver *);
  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();
public: // actually package-private
  virtual void putPainter(::gnu::java::awt::peer::qt::QtImageGraphics *);
  virtual void removePainter(::gnu::java::awt::peer::qt::QtImageGraphics *);
public:
  virtual ::java::awt::Graphics * getGraphics();
public: // actually package-private
  virtual ::java::awt::Graphics * getDirectGraphics(::gnu::java::awt::peer::qt::QtComponentPeer *);
public:
  virtual ::java::awt::Image * getScaledInstance(jint, jint, jint);
  virtual void flush();
  virtual void finalize();
  virtual void dispose();
  virtual jint checkImage(::java::awt::image::ImageObserver *);
  virtual jboolean drawImage(::gnu::java::awt::peer::qt::QtGraphics *, ::gnu::java::awt::peer::qt::QMatrix *, ::java::awt::image::ImageObserver *);
  virtual jboolean drawImage(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, ::java::awt::Color *, ::java::awt::image::ImageObserver *);
  virtual jboolean drawImage(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, jint, jint, ::java::awt::Color *, ::java::awt::image::ImageObserver *);
  virtual jboolean drawImage(::gnu::java::awt::peer::qt::QtGraphics *, jint, jint, jint, jint, jint, jint, jint, jint, ::java::awt::Color *, ::java::awt::image::ImageObserver *);
  virtual void copyArea(jint, jint, jint, jint, jint, jint);
private:
  void deliver();
  jboolean addObserver(::java::awt::image::ImageObserver *);
public:
  virtual ::java::lang::String * toString();
public: // actually package-private
  jint __attribute__((aligned(__alignof__( ::java::awt::Image)))) width;
  jint height;
  ::java::util::Hashtable * props;
  jboolean isLoaded;
  jlong nativeObject;
  ::java::util::Vector * observers;
  jboolean errorLoading;
  ::java::awt::image::ImageProducer * source;
  static ::java::awt::image::ColorModel * nativeModel;
  ::java::util::WeakHashMap * painters;
  jboolean killFlag;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_qt_QtImage__
