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

#ifndef __gnu_awt_xlib_XGraphicsConfiguration__
#define __gnu_awt_xlib_XGraphicsConfiguration__

#pragma interface

#include <java/awt/GraphicsConfiguration.h>
extern "Java"
{
  namespace gnu
  {
    namespace awt
    {
      namespace xlib
      {
          class XFontMetrics;
          class XGraphicsConfiguration;
          class XGraphicsConfiguration$FontMetricsCache;
      }
    }
    namespace gcj
    {
      namespace xlib
      {
          class Colormap;
          class Visual;
          class XImage;
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Color;
        class Font;
        class GraphicsDevice;
        class Point;
        class Rectangle;
      namespace geom
      {
          class AffineTransform;
      }
      namespace image
      {
          class BufferedImage;
          class ColorModel;
          class DataBuffer;
          class VolatileImage;
          class WritableRaster;
      }
    }
  }
}

class gnu::awt::xlib::XGraphicsConfiguration : public ::java::awt::GraphicsConfiguration
{

public:
  XGraphicsConfiguration(::gnu::gcj::xlib::Visual *);
  virtual ::java::awt::image::BufferedImage * createCompatibleImage(jint, jint);
public: // actually package-private
  virtual ::java::awt::image::WritableRaster * createRasterForXImage(::gnu::gcj::xlib::XImage *, ::java::awt::Point *);
  static void attachData(::gnu::gcj::xlib::XImage *, ::java::awt::image::DataBuffer *, jint);
  virtual void prepareColorModel(::gnu::gcj::xlib::XImage *);
  virtual void calcZPixmapModels(jint);
  virtual void calcDecomposedRGBModels(jint);
  virtual void calcPseudoColorModels(jint);
public:
  virtual ::java::awt::GraphicsDevice * getDevice();
  virtual ::java::awt::image::BufferedImage * createCompatibleImage(jint, jint, jint);
  virtual ::java::awt::image::VolatileImage * createCompatibleVolatileImage(jint, jint);
  virtual ::java::awt::image::ColorModel * getColorModel();
public: // actually package-private
  virtual void preparePixelCM();
public:
  virtual ::java::awt::image::ColorModel * getColorModel(jint);
  virtual ::java::awt::geom::AffineTransform * getDefaultTransform();
  virtual ::java::awt::geom::AffineTransform * getNormalizingTransform();
  virtual ::java::awt::Rectangle * getBounds();
public: // actually package-private
  virtual ::gnu::gcj::xlib::Visual * getVisual();
  virtual ::gnu::awt::xlib::XFontMetrics * getXFontMetrics(::java::awt::Font *);
  virtual jint getPixel(::java::awt::Color *);
public:
  virtual ::java::awt::image::VolatileImage * createCompatibleVolatileImage(jint, jint, jint);
public: // actually package-private
  ::gnu::gcj::xlib::Visual * __attribute__((aligned(__alignof__( ::java::awt::GraphicsConfiguration)))) visual;
  jint format;
  ::gnu::gcj::xlib::Colormap * colormap;
  ::java::awt::image::ColorModel * imageCM;
  ::java::awt::image::ColorModel * pixelCM;
private:
  static const jint CACHE_SIZE_PER_DISPLAY = 10;
public: // actually package-private
  static ::gnu::awt::xlib::XGraphicsConfiguration$FontMetricsCache * fontMetricsCache;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_awt_xlib_XGraphicsConfiguration__
