19 #include "agg_vcgen_stroke.h" 20 #include "agg_shorten_path.h" 26 vcgen_stroke::vcgen_stroke() :
39 void vcgen_stroke::remove_all()
41 m_src_vertices.remove_all();
48 void vcgen_stroke::add_vertex(
double x,
double y,
unsigned cmd)
53 m_src_vertices.modify_last(vertex_dist(x, y));
59 m_src_vertices.add(vertex_dist(x, y));
63 m_closed = get_close_flag(cmd);
69 void vcgen_stroke::rewind(
unsigned)
71 if(m_status == initial)
73 m_src_vertices.close(m_closed != 0);
74 shorten_path(m_src_vertices, m_shorten, m_closed);
75 if(m_src_vertices.size() < 3) m_closed = 0;
84 unsigned vcgen_stroke::vertex(
double* x,
double* y)
86 unsigned cmd = path_cmd_line_to;
95 if(m_src_vertices.size() < 2 + unsigned(m_closed != 0))
100 m_status = m_closed ? outline1 : cap1;
101 cmd = path_cmd_move_to;
107 m_stroker.calc_cap(m_out_vertices,
110 m_src_vertices[0].dist);
112 m_prev_status = outline1;
113 m_status = out_vertices;
118 m_stroker.calc_cap(m_out_vertices,
119 m_src_vertices[m_src_vertices.size() - 1],
120 m_src_vertices[m_src_vertices.size() - 2],
121 m_src_vertices[m_src_vertices.size() - 2].dist);
122 m_prev_status = outline2;
123 m_status = out_vertices;
130 if(m_src_vertex >= m_src_vertices.size())
132 m_prev_status = close_first;
133 m_status = end_poly1;
139 if(m_src_vertex >= m_src_vertices.size() - 1)
145 m_stroker.calc_join(m_out_vertices,
146 m_src_vertices.prev(m_src_vertex),
147 m_src_vertices.curr(m_src_vertex),
148 m_src_vertices.next(m_src_vertex),
149 m_src_vertices.prev(m_src_vertex).dist,
150 m_src_vertices.curr(m_src_vertex).dist);
152 m_prev_status = m_status;
153 m_status = out_vertices;
159 cmd = path_cmd_move_to;
162 if(m_src_vertex <=
unsigned(m_closed == 0))
164 m_status = end_poly2;
165 m_prev_status = stop;
170 m_stroker.calc_join(m_out_vertices,
171 m_src_vertices.next(m_src_vertex),
172 m_src_vertices.curr(m_src_vertex),
173 m_src_vertices.prev(m_src_vertex),
174 m_src_vertices.curr(m_src_vertex).dist,
175 m_src_vertices.prev(m_src_vertex).dist);
177 m_prev_status = m_status;
178 m_status = out_vertices;
183 if(m_out_vertex >= m_out_vertices.size())
185 m_status = m_prev_status;
189 const point_d& c = m_out_vertices[m_out_vertex++];
197 m_status = m_prev_status;
198 return path_cmd_end_poly | path_flags_close | path_flags_ccw;
201 m_status = m_prev_status;
202 return path_cmd_end_poly | path_flags_close | path_flags_cw;