1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.3
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
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.
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
18 //----------------------------------------------------------------------------
21 #include "agg_vcgen_contour.h"
26 //------------------------------------------------------------------------
27 vcgen_contour::vcgen_contour() :
31 m_line_join(bevel_join
),
32 m_inner_line_join(miter_join_revert
),
37 m_inner_miter_limit(1.0 + 1.0/64.0),
47 //------------------------------------------------------------------------
48 void vcgen_contour::remove_all()
50 m_src_vertices
.remove_all();
53 m_abs_width
= fabs(m_width
);
54 m_signed_width
= m_width
;
59 //------------------------------------------------------------------------
60 void vcgen_contour::miter_limit_theta(double t
)
62 m_miter_limit
= 1.0 / sin(t
* 0.5) ;
66 //------------------------------------------------------------------------
67 void vcgen_contour::add_vertex(double x
, double y
, unsigned cmd
)
72 m_src_vertices
.modify_last(vertex_dist(x
, y
));
78 m_src_vertices
.add(vertex_dist(x
, y
));
84 m_closed
= get_close_flag(cmd
);
85 if(m_orientation
== path_flags_none
)
87 m_orientation
= get_orientation(cmd
);
95 //------------------------------------------------------------------------
96 void vcgen_contour::rewind(unsigned)
98 if(m_status
== initial
)
100 m_src_vertices
.close(true);
101 m_signed_width
= m_width
;
104 if(!is_oriented(m_orientation
))
106 m_orientation
= (calc_polygon_area(m_src_vertices
) > 0.0) ?
111 if(is_oriented(m_orientation
))
113 m_signed_width
= is_ccw(m_orientation
) ? m_width
: -m_width
;
121 //------------------------------------------------------------------------
122 unsigned vcgen_contour::vertex(double* x
, double* y
)
124 unsigned cmd
= path_cmd_line_to
;
133 if(m_src_vertices
.size() < 2 + unsigned(m_closed
!= 0))
139 cmd
= path_cmd_move_to
;
144 if(m_src_vertex
>= m_src_vertices
.size())
149 stroke_calc_join(m_out_vertices
,
150 m_src_vertices
.prev(m_src_vertex
),
151 m_src_vertices
.curr(m_src_vertex
),
152 m_src_vertices
.next(m_src_vertex
),
153 m_src_vertices
.prev(m_src_vertex
).dist
,
154 m_src_vertices
.curr(m_src_vertex
).dist
,
162 m_status
= out_vertices
;
166 if(m_out_vertex
>= m_out_vertices
.size())
172 const point_type
& c
= m_out_vertices
[m_out_vertex
++];
180 if(!m_closed
) return path_cmd_stop
;
182 return (unsigned)path_cmd_end_poly
| (unsigned)path_flags_close
| (unsigned)path_flags_ccw
;
185 return path_cmd_stop
;