// @(#)PolyShape.h	3.9	7/28/92

#ifndef PolyShape_First

#ifdef __GNUG__
#pragma interface
#endif

#define PolyShape_First

#include "LineShape.h"
#include "GeoPos.h"

//---- Polygons ----------------------------------------------------------------

int Inside_2D_Polygon(Point p, int numpoints, Point *data);

class PolyShape : public Shape {
protected:
public:
    GrPolyType type;
    int npts, size;
    Point *pts;
    GeoPos *gpts;

public:
    MetaDef(PolyShape);
    
    PolyShape();
    ~PolyShape();
    
    void AreaChanged();
    void Moveby(Point delta);

    int AddPt(Point ps, GeoPos *gp= 0);
    void InsPoint(int handle, Point del_point, GeoPos *del_gpoint);
    void DelPoint(int handle, Point *del_point, GeoPos *del_gpoint);
    bool InjectPoint(Point p);
    
    short *GetImage();
    Point *GetPts()
	{ return pts; }
    Point GetPt(int i);
    int GetPtCnt()
	{ return npts; }
    void SetSpan(Rectangle r);
    void CalcBBox();
    void MovePoint(int, Point, bool redraw= TRUE, GeoPos *gp= 0);
    void Draw(Rectangle);
    void Outline(Point, Point);
    bool ContainsPoint(Point p);
    void StrokePartial(int s, int l);
    Point *MakeHandles(int *);
    ShapeSketcher *NewSketcher(DrawView*, SketchModes);
    ShapeStretcher *NewStretcher(DrawView*, int handle);
    void ScalePts(int, Point*, Point*, Point, Point);
    bool CanSplit();
#ifdef ET25
    OStream& PrintOn(OStream&);    
    IStream& ReadFrom(IStream&);
#else
    ostream& PrintOn(ostream&);    
    istream& ReadFrom(istream&);
#endif

    float GetLength() const;
};

class PolySketcher: public ShapeSketcher {
    Point firstp;
public:
    PolySketcher(DrawView *, Shape *, SketchModes);
    void TrackFeedback(Point, Point pp, bool turniton);
    Command *TrackMouse(TrackPhase, Point, Point, Point);
    PolyShape *Poly()
	{ return ((PolyShape*) newshape); }
};

class SplineStretcher: public ShapeStretcher {
    class PolyShape *lsp;
    Point	    del_point;
    GeoPos	    del_gpoint;
    GeoPos	    gp;
    bool	    matched_point;
public:
    SplineStretcher(DrawView*, Shape*, int);
    void DoIt();
    void UndoIt();
    Command *TrackMouse(TrackPhase, Point, Point, Point);
    void TrackFeedback(Point, Point, bool);
    void TrackConstrain(Point, Point, Point*);
};

#endif PolyShape_First
