+/////////////////////////////////////////////////////////////////////////////
+// Name: polygon.h
+// Author: Klaas Holwerda
+// Created: XX/XX/XX
+// Copyright: 2000 (c) Klaas Holwerda
+// Licence: wxWindows Licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __WXPOLYGON_H__
+#define __WXPOLYGON_H__
+
+#ifdef __GNUG__
+ #pragma interface "polygon.cpp"
+#endif
+
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#include "wx/matrix.h"
+#include "wx/geometry.h"
+#include "bbox.h"
+#include "canvas.h"
+
+enum INOUTPOLY {OUTSIDE_POLY,INSIDE_POLY,ON_POLY};
+
+//----------------------------------------------------------------------------
+// wxCanvasPolygon
+//----------------------------------------------------------------------------
+
+class wxCanvasPolygon: public wxCanvasObject
+{
+public:
+ wxCanvasPolygon( int n, wxPoint2DDouble points[], bool spline = FALSE );
+ ~wxCanvasPolygon();
+ void SetBrush( const wxBrush& brush) { m_brush = brush; }
+ void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }
+
+ //set colour 1
+ //being the background color if filling with a monochrome bitmap
+ //or in case of gradient filling the starting colour for the fill
+ void SetColour1( const wxColour& fg) { m_textfg=fg;}
+ //set colour 1
+ //being the foreground color if filling with a monochrome bitmap
+ //or in case of gradient filling the ending colour for the fill
+ void SetColour2( const wxColour& bg) { m_textbg=bg;}
+ //transparent filling when bitmapbrush is monochrome
+ void SetTransParent(bool transp) { m_transp=transp;}
+ //gradient filling using lines chnging in colour from colour1 to colour2
+ void SetGradient(bool gradient, const wxPen& gpen, double distance)
+ { m_gradient=gradient;
+ m_gpen=gpen;
+ m_gdistance=distance;
+ }
+
+ double GetPosX() { return m_points[0].m_x; }
+ double GetPosY() { return m_points[0].m_y; }
+ void SetPosXY( double x, double y);
+
+ void TransLate( double x, double y );
+ void CalcBoundingBox();
+
+ virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
+ virtual void WriteSVG( wxTextOutputStream &stream );
+
+ wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
+
+ INOUTPOLY PointInPolygon(const wxPoint2DDouble& P, double marge);
+
+private:
+
+ bool MoveUp(double horline, int& index, int direction);
+ void DetectCriticalPoints();
+ void FillPolygon(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
+ wxList m_CRlist;
+ wxList m_AETlist;
+
+
+ wxBrush m_brush;
+ wxPen m_pen;
+ wxColour m_textbg;
+ wxColour m_textfg;
+
+ //if brush is of type bitmap with a mask fill with mask transparent
+ bool m_transp;
+ bool m_gradient;
+ wxPen m_gpen;
+ double m_gdistance;
+
+ bool m_spline;
+
+ int m_n;
+ wxPoint2DDouble* m_points;
+};
+
+//----------------------------------------------------------------------------
+// wxCanvasPolyline
+//----------------------------------------------------------------------------
+
+class wxCanvasPolyline: public wxCanvasObject
+{
+public:
+ wxCanvasPolyline(int n, wxPoint2DDouble points[]);
+ ~wxCanvasPolyline();
+ void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }
+
+ double GetPosX() { return m_points[0].m_x; }
+ double GetPosY() { return m_points[0].m_y; }
+ void SetPosXY( double x, double y);
+
+ void TransLate( double x, double y );
+ void CalcBoundingBox();
+
+ virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
+ virtual void WriteSVG( wxTextOutputStream &stream );
+
+ wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
+
+ bool PointOnPolyline(const wxPoint2DDouble& P, double marge);
+
+private:
+
+ wxPen m_pen;
+
+ int m_n;
+ wxPoint2DDouble* m_points;
+};
+
+//----------------------------------------------------------------------------
+// wxCanvasPolygon
+//----------------------------------------------------------------------------
+
+class wxCanvasPolygonL: public wxCanvasObject
+{
+public:
+ wxCanvasPolygonL(wxList* points, bool spline = FALSE);
+ ~wxCanvasPolygonL();
+ void SetBrush( const wxBrush& brush) { m_brush = brush; }
+ void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }
+ void SetColour1( const wxColour& fg) { m_textfg=fg;}
+ void SetColour2( const wxColour& bg) { m_textbg=bg;}
+ void SetTransParent(bool transp) { m_transp=transp;}
+
+ double GetPosX();
+ double GetPosY();
+ void SetPosXY( double x, double y);
+ void TransLate( double x, double y );
+ void CalcBoundingBox();
+
+ virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
+ virtual void WriteSVG( wxTextOutputStream &stream );
+
+ wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
+
+ INOUTPOLY PointInPolygon(const wxPoint2DDouble& P, double marge);
+
+private:
+
+ wxBrush m_brush;
+ wxPen m_pen;
+ bool m_spline;
+ wxColour m_textbg;
+ wxColour m_textfg;
+ //if brush is of type bitmap with a mask fill with mask transparent
+ bool m_transp;
+
+ wxList* m_lpoints;
+};
+
+//----------------------------------------------------------------------------
+// wxCanvasPolyline
+//----------------------------------------------------------------------------
+
+class wxCanvasPolylineL: public wxCanvasObject
+{
+public:
+ wxCanvasPolylineL(wxList* points, bool spline );
+ ~wxCanvasPolylineL();
+ void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }
+
+ double GetPosX();
+ double GetPosY();
+ void SetPosXY( double x, double y);
+
+ void TransLate( double x, double y );
+ void CalcBoundingBox();
+
+ virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
+ virtual void WriteSVG( wxTextOutputStream &stream );
+
+ wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
+
+ bool PointOnPolyline(const wxPoint2DDouble& P, double marge);
+
+private:
+ wxPen m_pen;
+ bool m_spline;
+
+ wxList* m_lpoints;
+};
+
+//active edge table
+class wxAET
+{
+public:
+ inline void CalculateLineParameters( const wxPoint2DDouble& p1 , const wxPoint2DDouble& p2 );
+ inline void CalculateXs( double y );
+
+ //line paramters
+ bool m_horizontal;
+ double m_BdivA;
+ double m_CdivA;
+ int m_index;
+ int m_direction;
+ //intersection point with scanline;
+ double m_xs;
+};
+
+#endif
+