1
//----------------------------------------------------------------------------
2
// Anti-Grain Geometry - Version 2.4
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() :
40
//------------------------------------------------------------------------
41
void vcgen_contour::remove_all()
43
m_src_vertices.remove_all();
49
//------------------------------------------------------------------------
50
void vcgen_contour::add_vertex(double x, double y, unsigned cmd)
55
m_src_vertices.modify_last(vertex_dist(x, y));
61
m_src_vertices.add(vertex_dist(x, y));
67
m_closed = get_close_flag(cmd);
68
if(m_orientation == path_flags_none)
70
m_orientation = get_orientation(cmd);
77
//------------------------------------------------------------------------
78
void vcgen_contour::rewind(unsigned)
80
if(m_status == initial)
82
m_src_vertices.close(true);
85
if(!is_oriented(m_orientation))
87
m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ?
92
if(is_oriented(m_orientation))
94
m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width);
101
//------------------------------------------------------------------------
102
unsigned vcgen_contour::vertex(double* x, double* y)
104
unsigned cmd = path_cmd_line_to;
113
if(m_src_vertices.size() < 2 + unsigned(m_closed != 0))
119
cmd = path_cmd_move_to;
124
if(m_src_vertex >= m_src_vertices.size())
129
m_stroker.calc_join(m_out_vertices,
130
m_src_vertices.prev(m_src_vertex),
131
m_src_vertices.curr(m_src_vertex),
132
m_src_vertices.next(m_src_vertex),
133
m_src_vertices.prev(m_src_vertex).dist,
134
m_src_vertices.curr(m_src_vertex).dist);
136
m_status = out_vertices;
140
if(m_out_vertex >= m_out_vertices.size())
146
const point_d& c = m_out_vertices[m_out_vertex++];
154
if(!m_closed) return path_cmd_stop;
156
return path_cmd_end_poly | path_flags_close | path_flags_ccw;
159
return path_cmd_stop;