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

#ifndef __java_awt_geom_QuadCurve2D__
#define __java_awt_geom_QuadCurve2D__

#pragma interface

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

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

class java::awt::geom::QuadCurve2D : public ::java::lang::Object
{

public: // actually protected
  QuadCurve2D();
public:
  virtual jdouble getX1() = 0;
  virtual jdouble getY1() = 0;
  virtual ::java::awt::geom::Point2D * getP1() = 0;
  virtual jdouble getCtrlX() = 0;
  virtual jdouble getCtrlY() = 0;
  virtual ::java::awt::geom::Point2D * getCtrlPt() = 0;
  virtual jdouble getX2() = 0;
  virtual jdouble getY2() = 0;
  virtual ::java::awt::geom::Point2D * getP2() = 0;
  virtual void setCurve(jdouble, jdouble, jdouble, jdouble, jdouble, jdouble) = 0;
  virtual void setCurve(JArray< jdouble > *, jint);
  virtual void setCurve(::java::awt::geom::Point2D *, ::java::awt::geom::Point2D *, ::java::awt::geom::Point2D *);
  virtual void setCurve(JArray< ::java::awt::geom::Point2D * > *, jint);
  virtual void setCurve(::java::awt::geom::QuadCurve2D *);
  static jdouble getFlatnessSq(jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
  static jdouble getFlatness(jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
  static jdouble getFlatnessSq(JArray< jdouble > *, jint);
  static jdouble getFlatness(JArray< jdouble > *, jint);
  virtual jdouble getFlatnessSq();
  virtual jdouble getFlatness();
  virtual void subdivide(::java::awt::geom::QuadCurve2D *, ::java::awt::geom::QuadCurve2D *);
  static void subdivide(::java::awt::geom::QuadCurve2D *, ::java::awt::geom::QuadCurve2D *, ::java::awt::geom::QuadCurve2D *);
  static void subdivide(JArray< jdouble > *, jint, JArray< jdouble > *, jint, JArray< jdouble > *, jint);
  static jint solveQuadratic(JArray< jdouble > *);
  static jint solveQuadratic(JArray< jdouble > *, JArray< jdouble > *);
  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::Rectangle * getBounds();
  virtual ::java::awt::geom::PathIterator * getPathIterator(::java::awt::geom::AffineTransform *);
  virtual ::java::awt::geom::PathIterator * getPathIterator(::java::awt::geom::AffineTransform *, jdouble);
  virtual ::java::lang::Object * clone();
private:
  jint getAxisIntersections(jdouble, jdouble, jboolean, jdouble);
public:
  virtual ::java::awt::geom::Rectangle2D * getBounds2D() = 0;
private:
  static jdouble BIG_VALUE;
  static jdouble EPSILON;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_geom_QuadCurve2D__
