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

#ifndef __java_awt_geom_Area$Segment__
#define __java_awt_geom_Area$Segment__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Shape;
      namespace geom
      {
          class AffineTransform;
          class Area;
          class Area$Intersection;
          class Area$Segment;
          class Point2D;
          class Rectangle2D;
      }
    }
  }
}

class java::awt::geom::Area$Segment : public ::java::lang::Object
{

public: // actually package-private
  Area$Segment(::java::awt::geom::Area *);
  virtual void reverseCoords() = 0;
  virtual ::java::awt::geom::Point2D * getMidPoint() = 0;
  virtual ::java::awt::geom::Rectangle2D * getBounds() = 0;
  virtual void transform(::java::awt::geom::AffineTransform *) = 0;
  virtual jint getType() = 0;
  virtual jint splitIntersections(::java::awt::geom::Area$Segment *) = 0;
  virtual jint pathIteratorFormat(JArray< jdouble > *) = 0;
  virtual jint rayCrossing(jdouble, jdouble) = 0;
  virtual void subdivideInsert(jdouble) = 0;
  virtual jdouble curveArea() = 0;
  virtual jboolean equals(::java::awt::geom::Area$Segment *) = 0;
  virtual jboolean contains(jdouble, jdouble);
  virtual void nullNodes();
  virtual void transformSegmentList(::java::awt::geom::AffineTransform *);
  virtual jboolean hasClockwiseOrientation();
public:
  virtual ::java::awt::geom::Rectangle2D * getPathBounds();
public: // actually package-private
  virtual jdouble getSignedArea();
  virtual void reverseAll();
  virtual void insert(::java::awt::geom::Area$Segment *);
  virtual jboolean isPolygonal();
  virtual ::java::awt::geom::Area$Segment * cloneSegmentList();
  virtual jint createNode(::java::awt::geom::Area$Segment *, ::java::awt::geom::Area$Intersection *);
public: // actually protected
  virtual jint createNodes(::java::awt::geom::Area$Segment *, JArray< ::java::awt::geom::Area$Intersection * > *);
public: // actually package-private
  virtual jboolean pathEquals(::java::awt::geom::Area$Segment *);
  virtual ::java::awt::geom::Area$Segment * getTopLeft();
  virtual jboolean isSegmentOutside(::java::awt::Shape *);
  ::java::awt::geom::Point2D * __attribute__((aligned(__alignof__( ::java::lang::Object)))) P1;
  ::java::awt::geom::Point2D * P2;
  ::java::awt::geom::Area$Segment * next;
  ::java::awt::geom::Area$Segment * node;
  ::java::awt::geom::Area * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_geom_Area$Segment__
