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

#ifndef __java_awt_Polygon__
#define __java_awt_Polygon__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Point;
        class Polygon;
        class Rectangle;
      namespace geom
      {
          class AffineTransform;
          class PathIterator;
          class Point2D;
          class Rectangle2D;
      }
    }
  }
}

class java::awt::Polygon : public ::java::lang::Object
{

public:
  Polygon();
  Polygon(JArray< jint > *, JArray< jint > *, jint);
  virtual void reset();
  virtual void invalidate();
  virtual void translate(jint, jint);
  virtual void addPoint(jint, jint);
  virtual ::java::awt::Rectangle * getBounds();
  virtual ::java::awt::Rectangle * getBoundingBox();
  virtual jboolean contains(::java::awt::Point *);
  virtual jboolean contains(jint, jint);
  virtual jboolean inside(jint, jint);
  virtual ::java::awt::geom::Rectangle2D * getBounds2D();
  virtual jboolean contains(jdouble, jdouble);
  virtual jboolean contains(::java::awt::geom::Point2D *);
  virtual jboolean intersects(jdouble, jdouble, jdouble, jdouble);
  virtual jboolean intersects(::java::awt::geom::Rectangle2D *);
  virtual jboolean contains(jdouble, jdouble, jdouble, jdouble);
  virtual jboolean contains(::java::awt::geom::Rectangle2D *);
  virtual ::java::awt::geom::PathIterator * getPathIterator(::java::awt::geom::AffineTransform *);
  virtual ::java::awt::geom::PathIterator * getPathIterator(::java::awt::geom::AffineTransform *, jdouble);
private:
  jint evaluateCrossings(jdouble, jdouble, jboolean, jdouble);
  static const jlong serialVersionUID = -6460061437900069969LL;
public:
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) npoints;
  JArray< jint > * xpoints;
  JArray< jint > * ypoints;
public: // actually protected
  ::java::awt::Rectangle * bounds;
private:
  static jdouble BIG_VALUE;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_Polygon__
