1//----------------------------------------------------------------------------
2// Anti-Grain Geometry - Version 2.4
3// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4//
5// Permission to copy, use, modify, sell and distribute this software
6// is granted provided this copyright notice appears in all copies.
7// This software is provided "as is" without express or implied
8// warranty, and with no claim as to its suitability for any purpose.
9//
10//----------------------------------------------------------------------------
11// Contact: mcseem@antigrain.com
12//          mcseemagg@yahoo.com
13//          http://www.antigrain.com
14//----------------------------------------------------------------------------
15
16#ifndef AGG_VPGEN_CLIP_POLYGON_INCLUDED
17#define AGG_VPGEN_CLIP_POLYGON_INCLUDED
18
19#include "agg_basics.h"
20
21namespace agg
22{
23
24    //======================================================vpgen_clip_polygon
25    //
26    // See Implementation agg_vpgen_clip_polygon.cpp
27    //
28    class vpgen_clip_polygon
29    {
30    public:
31        vpgen_clip_polygon() :
32            m_clip_box(0, 0, 1, 1),
33            m_x1(0),
34            m_y1(0),
35            m_clip_flags(0),
36            m_num_vertices(0),
37            m_vertex(0),
38            m_cmd(path_cmd_move_to)
39        {
40        }
41
42        void clip_box(double x1, double y1, double x2, double y2)
43        {
44            m_clip_box.x1 = x1;
45            m_clip_box.y1 = y1;
46            m_clip_box.x2 = x2;
47            m_clip_box.y2 = y2;
48            m_clip_box.normalize();
49        }
50
51
52        double x1() const { return m_clip_box.x1; }
53        double y1() const { return m_clip_box.y1; }
54        double x2() const { return m_clip_box.x2; }
55        double y2() const { return m_clip_box.y2; }
56
57        static bool auto_close()   { return true;  }
58        static bool auto_unclose() { return false; }
59
60        void     reset();
61        void     move_to(double x, double y);
62        void     line_to(double x, double y);
63        unsigned vertex(double* x, double* y);
64
65    private:
66        unsigned clipping_flags(double x, double y);
67
68    private:
69        rect_d        m_clip_box;
70        double        m_x1;
71        double        m_y1;
72        unsigned      m_clip_flags;
73        double        m_x[4];
74        double        m_y[4];
75        unsigned      m_num_vertices;
76        unsigned      m_vertex;
77        unsigned      m_cmd;
78    };
79
80}
81
82
83#endif
84