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_VCGEN_STROKE_INCLUDED
17 #define AGG_VCGEN_STROKE_INCLUDED
18 
19 #include "agg_math_stroke.h"
20 
21 
22 namespace mapserver
23 {
24 
25     //============================================================vcgen_stroke
26     //
27     // See Implementation agg_vcgen_stroke.cpp
28     // Stroke generator
29     //
30     //------------------------------------------------------------------------
31     class vcgen_stroke
32     {
33         enum status_e
34         {
35             initial,
36             ready,
37             cap1,
38             cap2,
39             outline1,
40             close_first,
41             outline2,
42             out_vertices,
43             end_poly1,
44             end_poly2,
45             stop
46         };
47 
48     public:
49         typedef vertex_sequence<vertex_dist, 6> vertex_storage;
50         typedef pod_bvector<point_d, 6>         coord_storage;
51 
52         vcgen_stroke();
53 
line_cap(line_cap_e lc)54         void line_cap(line_cap_e lc)     { m_stroker.line_cap(lc); }
line_join(line_join_e lj)55         void line_join(line_join_e lj)   { m_stroker.line_join(lj); }
inner_join(inner_join_e ij)56         void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); }
57 
line_cap()58         line_cap_e   line_cap()   const { return m_stroker.line_cap(); }
line_join()59         line_join_e  line_join()  const { return m_stroker.line_join(); }
inner_join()60         inner_join_e inner_join() const { return m_stroker.inner_join(); }
61 
width(double w)62         void width(double w) { m_stroker.width(w); }
miter_limit(double ml)63         void miter_limit(double ml) { m_stroker.miter_limit(ml); }
miter_limit_theta(double t)64         void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); }
inner_miter_limit(double ml)65         void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); }
approximation_scale(double as)66         void approximation_scale(double as) { m_stroker.approximation_scale(as); }
67 
width()68         double width() const { return m_stroker.width(); }
miter_limit()69         double miter_limit() const { return m_stroker.miter_limit(); }
inner_miter_limit()70         double inner_miter_limit() const { return m_stroker.inner_miter_limit(); }
approximation_scale()71         double approximation_scale() const { return m_stroker.approximation_scale(); }
72 
shorten(double s)73         void shorten(double s) { m_shorten = s; }
shorten()74         double shorten() const { return m_shorten; }
75 
76         // Vertex Generator Interface
77         void remove_all();
78         void add_vertex(double x, double y, unsigned cmd);
79 
80         // Vertex Source Interface
81         void     rewind(unsigned path_id);
82         unsigned vertex(double* x, double* y);
83 
84     private:
85         vcgen_stroke(const vcgen_stroke&);
86         const vcgen_stroke& operator = (const vcgen_stroke&);
87 
88         math_stroke<coord_storage> m_stroker;
89         vertex_storage             m_src_vertices;
90         coord_storage              m_out_vertices;
91         double                     m_shorten;
92         unsigned                   m_closed;
93         status_e                   m_status;
94         status_e                   m_prev_status;
95         unsigned                   m_src_vertex;
96         unsigned                   m_out_vertex;
97     };
98 
99 
100 }
101 
102 #endif
103