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

#ifndef __java_awt_BasicStroke__
#define __java_awt_BasicStroke__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace java2d
        {
            class Segment;
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class BasicStroke;
        class Shape;
      namespace geom
      {
          class GeneralPath;
          class PathIterator;
          class Point2D;
      }
    }
  }
}

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

public:
  BasicStroke(jfloat, jint, jint, jfloat, JArray< jfloat > *, jfloat);
  BasicStroke(jfloat, jint, jint, jfloat);
  BasicStroke(jfloat, jint, jint);
  BasicStroke(jfloat);
  BasicStroke();
  virtual ::java::awt::Shape * createStrokedShape(::java::awt::Shape *);
  virtual jfloat getLineWidth();
  virtual jint getEndCap();
  virtual jint getLineJoin();
  virtual jfloat getMiterLimit();
  virtual JArray< jfloat > * getDashArray();
  virtual jfloat getDashPhase();
  virtual jint hashCode();
  virtual jboolean equals(::java::lang::Object *);
private:
  ::java::awt::Shape * solidStroke(::java::awt::geom::PathIterator *);
  ::java::awt::Shape * dashedStroke(::java::awt::geom::PathIterator *);
  void capEnds();
  void convertPath(::java::awt::geom::GeneralPath *, ::gnu::java::awt::java2d::Segment *);
  void addSegments(JArray< ::gnu::java::awt::java2d::Segment * > *);
  void joinSegments(JArray< ::gnu::java::awt::java2d::Segment * > *);
  void capEnd(::gnu::java::awt::java2d::Segment *, ::gnu::java::awt::java2d::Segment *);
  ::java::awt::geom::Point2D * lineIntersection(jdouble, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble, jboolean);
  void joinOuterSegments(::gnu::java::awt::java2d::Segment *, ::gnu::java::awt::java2d::Segment *, ::java::awt::geom::Point2D *);
  void joinInnerSegments(::gnu::java::awt::java2d::Segment *, ::gnu::java::awt::java2d::Segment *, ::java::awt::geom::Point2D *);
public:
  static const jint JOIN_MITER = 0;
  static const jint JOIN_ROUND = 1;
  static const jint JOIN_BEVEL = 2;
  static const jint CAP_BUTT = 0;
  static const jint CAP_ROUND = 1;
  static const jint CAP_SQUARE = 2;
private:
  jfloat __attribute__((aligned(__alignof__( ::java::lang::Object)))) width;
  jint cap;
  jint join;
  jfloat limit;
  JArray< jfloat > * dash;
  jfloat phase;
  ::gnu::java::awt::java2d::Segment * start;
  ::gnu::java::awt::java2d::Segment * end;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_BasicStroke__
