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

#ifndef __java_awt_image_BufferedImage__
#define __java_awt_image_BufferedImage__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Graphics;
        class Graphics2D;
        class Point;
        class Rectangle;
      namespace image
      {
          class BufferedImage;
          class ColorModel;
          class ImageObserver;
          class ImageProducer;
          class IndexColorModel;
          class Raster;
          class SampleModel;
          class TileObserver;
          class WritableRaster;
      }
    }
  }
}

class java::awt::image::BufferedImage : public ::java::awt::Image
{

public:
  BufferedImage(jint, jint, jint);
  BufferedImage(jint, jint, jint, ::java::awt::image::IndexColorModel *);
  BufferedImage(::java::awt::image::ColorModel *, ::java::awt::image::WritableRaster *, jboolean, ::java::util::Hashtable *);
private:
  void init(::java::awt::image::ColorModel *, ::java::awt::image::WritableRaster *, jboolean, ::java::util::Hashtable *, jint);
  ::java::awt::image::IndexColorModel * createDefaultIndexedColorModel(jboolean);
public:
  virtual void coerceData(jboolean);
  virtual ::java::awt::image::WritableRaster * copyData(::java::awt::image::WritableRaster *);
  virtual ::java::awt::Graphics2D * createGraphics();
  virtual void flush();
  virtual ::java::awt::image::WritableRaster * getAlphaRaster();
  virtual ::java::awt::image::ColorModel * getColorModel();
  virtual ::java::awt::image::Raster * getData();
  virtual ::java::awt::image::Raster * getData(::java::awt::Rectangle *);
  virtual ::java::awt::Graphics * getGraphics();
  virtual jint getHeight();
  virtual jint getHeight(::java::awt::image::ImageObserver *);
  virtual jint getMinTileX();
  virtual jint getMinTileY();
  virtual jint getMinX();
  virtual jint getMinY();
  virtual jint getNumXTiles();
  virtual jint getNumYTiles();
  virtual ::java::lang::Object * getProperty(::java::lang::String *);
  virtual ::java::lang::Object * getProperty(::java::lang::String *, ::java::awt::image::ImageObserver *);
  virtual JArray< ::java::lang::String * > * getPropertyNames();
  virtual jint getRGB(jint, jint);
  virtual JArray< jint > * getRGB(jint, jint, jint, jint, JArray< jint > *, jint, jint);
  virtual ::java::awt::image::WritableRaster * getRaster();
  virtual ::java::awt::image::SampleModel * getSampleModel();
  virtual ::java::awt::image::ImageProducer * getSource();
  virtual ::java::util::Vector * getSources();
  virtual ::java::awt::image::BufferedImage * getSubimage(jint, jint, jint, jint);
  virtual ::java::awt::image::Raster * getTile(jint, jint);
  virtual jint getTileGridXOffset();
  virtual jint getTileGridYOffset();
  virtual jint getTileHeight();
  virtual jint getTileWidth();
  virtual jint getType();
  virtual jint getWidth();
  virtual jint getWidth(::java::awt::image::ImageObserver *);
  virtual ::java::awt::image::WritableRaster * getWritableTile(jint, jint);
  virtual JArray< ::java::awt::Point * > * getWritableTileIndices();
  virtual jboolean hasTileWriters();
  virtual jboolean isAlphaPremultiplied();
  virtual jboolean isTileWritable(jint, jint);
  virtual void releaseWritableTile(jint, jint);
  virtual void setData(::java::awt::image::Raster *);
  virtual void setRGB(jint, jint, jint);
  virtual void setRGB(jint, jint, jint, jint, JArray< jint > *, jint, jint);
  virtual ::java::lang::String * toString();
  virtual void addTileObserver(::java::awt::image::TileObserver *);
  virtual void removeTileObserver(::java::awt::image::TileObserver *);
  virtual jint getTransparency();
  static const jint TYPE_CUSTOM = 0;
  static const jint TYPE_INT_RGB = 1;
  static const jint TYPE_INT_ARGB = 2;
  static const jint TYPE_INT_ARGB_PRE = 3;
  static const jint TYPE_INT_BGR = 4;
  static const jint TYPE_3BYTE_BGR = 5;
  static const jint TYPE_4BYTE_ABGR = 6;
  static const jint TYPE_4BYTE_ABGR_PRE = 7;
  static const jint TYPE_USHORT_565_RGB = 8;
  static const jint TYPE_USHORT_555_RGB = 9;
  static const jint TYPE_BYTE_GRAY = 10;
  static const jint TYPE_USHORT_GRAY = 11;
  static const jint TYPE_BYTE_BINARY = 12;
  static const jint TYPE_BYTE_INDEXED = 13;
public: // actually package-private
  ::java::util::Vector * __attribute__((aligned(__alignof__( ::java::awt::Image)))) tileObservers;
  ::java::awt::image::WritableRaster * raster;
  ::java::awt::image::ColorModel * colorModel;
  ::java::util::Hashtable * properties;
  jboolean isPremultiplied;
  jint type;
private:
  static JArray< ::java::awt::Point * > * tileIndices;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_image_BufferedImage__
