Anti-Grain Geometry Tutorial
agg_vcgen_markers_term.cpp
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 // Terminal markers generator (arrowhead/arrowtail)
17 //
18 //----------------------------------------------------------------------------
19 
20 #include "agg_vcgen_markers_term.h"
21 
22 namespace agg
23 {
24 
25  //------------------------------------------------------------------------
26  void vcgen_markers_term::remove_all()
27  {
28  m_markers.remove_all();
29  }
30 
31 
32  //------------------------------------------------------------------------
33  void vcgen_markers_term::add_vertex(double x, double y, unsigned cmd)
34  {
35  if(is_move_to(cmd))
36  {
37  if(m_markers.size() & 1)
38  {
39  // Initial state, the first coordinate was added.
40  // If two of more calls of start_vertex() occures
41  // we just modify the last one.
42  m_markers.modify_last(coord_type(x, y));
43  }
44  else
45  {
46  m_markers.add(coord_type(x, y));
47  }
48  }
49  else
50  {
51  if(is_vertex(cmd))
52  {
53  if(m_markers.size() & 1)
54  {
55  // Initial state, the first coordinate was added.
56  // Add three more points, 0,1,1,0
57  m_markers.add(coord_type(x, y));
58  m_markers.add(m_markers[m_markers.size() - 1]);
59  m_markers.add(m_markers[m_markers.size() - 3]);
60  }
61  else
62  {
63  if(m_markers.size())
64  {
65  // Replace two last points: 0,1,1,0 -> 0,1,2,1
66  m_markers[m_markers.size() - 1] = m_markers[m_markers.size() - 2];
67  m_markers[m_markers.size() - 2] = coord_type(x, y);
68  }
69  }
70  }
71  }
72  }
73 
74 
75  //------------------------------------------------------------------------
76  void vcgen_markers_term::rewind(unsigned path_id)
77  {
78  m_curr_id = path_id * 2;
79  m_curr_idx = m_curr_id;
80  }
81 
82 
83  //------------------------------------------------------------------------
84  unsigned vcgen_markers_term::vertex(double* x, double* y)
85  {
86  if(m_curr_id > 2 || m_curr_idx >= m_markers.size())
87  {
88  return path_cmd_stop;
89  }
90  const coord_type& c = m_markers[m_curr_idx];
91  *x = c.x;
92  *y = c.y;
93  if(m_curr_idx & 1)
94  {
95  m_curr_idx += 3;
96  return path_cmd_line_to;
97  }
98  ++m_curr_idx;
99  return path_cmd_move_to;
100  }
101 
102 
103 }
Definition: agg_arc.cpp:24