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

#ifndef __java_awt_image_Raster__
#define __java_awt_image_Raster__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Point;
        class Rectangle;
      namespace image
      {
          class DataBuffer;
          class Raster;
          class SampleModel;
          class WritableRaster;
      }
    }
  }
}

class java::awt::image::Raster : public ::java::lang::Object
{

public: // actually protected
  Raster(::java::awt::image::SampleModel *, ::java::awt::Point *);
  Raster(::java::awt::image::SampleModel *, ::java::awt::image::DataBuffer *, ::java::awt::Point *);
  Raster(::java::awt::image::SampleModel *, ::java::awt::image::DataBuffer *, ::java::awt::Rectangle *, ::java::awt::Point *, ::java::awt::image::Raster *);
public:
  static ::java::awt::image::WritableRaster * createInterleavedRaster(jint, jint, jint, jint, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createInterleavedRaster(jint, jint, jint, jint, jint, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createBandedRaster(jint, jint, jint, jint, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createBandedRaster(jint, jint, jint, jint, JArray< jint > *, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createPackedRaster(jint, jint, jint, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createPackedRaster(jint, jint, jint, jint, jint, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createInterleavedRaster(::java::awt::image::DataBuffer *, jint, jint, jint, jint, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createBandedRaster(::java::awt::image::DataBuffer *, jint, jint, jint, JArray< jint > *, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createPackedRaster(::java::awt::image::DataBuffer *, jint, jint, jint, JArray< jint > *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createPackedRaster(::java::awt::image::DataBuffer *, jint, jint, jint, ::java::awt::Point *);
  static ::java::awt::image::Raster * createRaster(::java::awt::image::SampleModel *, ::java::awt::image::DataBuffer *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createWritableRaster(::java::awt::image::SampleModel *, ::java::awt::Point *);
  static ::java::awt::image::WritableRaster * createWritableRaster(::java::awt::image::SampleModel *, ::java::awt::image::DataBuffer *, ::java::awt::Point *);
  virtual ::java::awt::image::Raster * getParent();
  virtual jint getSampleModelTranslateX();
  virtual jint getSampleModelTranslateY();
  virtual ::java::awt::image::WritableRaster * createCompatibleWritableRaster();
  virtual ::java::awt::image::WritableRaster * createCompatibleWritableRaster(jint, jint);
  virtual ::java::awt::image::WritableRaster * createCompatibleWritableRaster(::java::awt::Rectangle *);
  virtual ::java::awt::image::WritableRaster * createCompatibleWritableRaster(jint, jint, jint, jint);
  virtual ::java::awt::image::Raster * createTranslatedChild(jint, jint);
  virtual ::java::awt::image::Raster * createChild(jint, jint, jint, jint, jint, jint, JArray< jint > *);
  virtual ::java::awt::Rectangle * getBounds();
  virtual jint getMinX();
  virtual jint getMinY();
  virtual jint getWidth();
  virtual jint getHeight();
  virtual jint getNumBands();
  virtual jint getNumDataElements();
  virtual jint getTransferType();
  virtual ::java::awt::image::DataBuffer * getDataBuffer();
  virtual ::java::awt::image::SampleModel * getSampleModel();
  virtual ::java::lang::Object * getDataElements(jint, jint, ::java::lang::Object *);
  virtual ::java::lang::Object * getDataElements(jint, jint, jint, jint, ::java::lang::Object *);
  virtual JArray< jint > * getPixel(jint, jint, JArray< jint > *);
  virtual JArray< jfloat > * getPixel(jint, jint, JArray< jfloat > *);
  virtual JArray< jdouble > * getPixel(jint, jint, JArray< jdouble > *);
  virtual JArray< jint > * getPixels(jint, jint, jint, jint, JArray< jint > *);
  virtual JArray< jfloat > * getPixels(jint, jint, jint, jint, JArray< jfloat > *);
  virtual JArray< jdouble > * getPixels(jint, jint, jint, jint, JArray< jdouble > *);
  virtual jint getSample(jint, jint, jint);
  virtual jfloat getSampleFloat(jint, jint, jint);
  virtual jdouble getSampleDouble(jint, jint, jint);
  virtual JArray< jint > * getSamples(jint, jint, jint, jint, jint, JArray< jint > *);
  virtual JArray< jfloat > * getSamples(jint, jint, jint, jint, jint, JArray< jfloat > *);
  virtual JArray< jdouble > * getSamples(jint, jint, jint, jint, jint, JArray< jdouble > *);
  virtual ::java::lang::String * toString();
private:
  static jint getTypeBits(jint);
public: // actually protected
  ::java::awt::image::SampleModel * __attribute__((aligned(__alignof__( ::java::lang::Object)))) sampleModel;
  ::java::awt::image::DataBuffer * dataBuffer;
  jint minX;
  jint minY;
  jint width;
  jint height;
  jint sampleModelTranslateX;
  jint sampleModelTranslateY;
  jint numBands;
  jint numDataElements;
  ::java::awt::image::Raster * parent;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_image_Raster__
