Anti-Grain Geometry Tutorial
agg_trans_double_path.h
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_TRANS_DOUBLE_PATH_INCLUDED
17 #define AGG_TRANS_DOUBLE_PATH_INCLUDED
18 
19 #include "agg_basics.h"
20 #include "agg_vertex_sequence.h"
21 
22 namespace agg
23 {
24 
25  // See also: agg_trans_double_path.cpp
26  //
27  //-------------------------------------------------------trans_double_path
29  {
30  enum status_e
31  {
32  initial,
33  making_path,
34  ready
35  };
36 
37  public:
39 
41 
42  //--------------------------------------------------------------------
43  void base_length(double v) { m_base_length = v; }
44  double base_length() const { return m_base_length; }
45 
46  //--------------------------------------------------------------------
47  void base_height(double v) { m_base_height = v; }
48  double base_height() const { return m_base_height; }
49 
50  //--------------------------------------------------------------------
51  void preserve_x_scale(bool f) { m_preserve_x_scale = f; }
52  bool preserve_x_scale() const { return m_preserve_x_scale; }
53 
54  //--------------------------------------------------------------------
55  void reset();
56  void move_to1(double x, double y);
57  void line_to1(double x, double y);
58  void move_to2(double x, double y);
59  void line_to2(double x, double y);
60  void finalize_paths();
61 
62  //--------------------------------------------------------------------
63  template<class VertexSource1, class VertexSource2>
64  void add_paths(VertexSource1& vs1, VertexSource2& vs2,
65  unsigned path1_id=0, unsigned path2_id=0)
66  {
67  double x;
68  double y;
69 
70  unsigned cmd;
71 
72  vs1.rewind(path1_id);
73  while(!is_stop(cmd = vs1.vertex(&x, &y)))
74  {
75  if(is_move_to(cmd))
76  {
77  move_to1(x, y);
78  }
79  else
80  {
81  if(is_vertex(cmd))
82  {
83  line_to1(x, y);
84  }
85  }
86  }
87 
88  vs2.rewind(path2_id);
89  while(!is_stop(cmd = vs2.vertex(&x, &y)))
90  {
91  if(is_move_to(cmd))
92  {
93  move_to2(x, y);
94  }
95  else
96  {
97  if(is_vertex(cmd))
98  {
99  line_to2(x, y);
100  }
101  }
102  }
103  finalize_paths();
104  }
105 
106  //--------------------------------------------------------------------
107  double total_length1() const;
108  double total_length2() const;
109  void transform(double *x, double *y) const;
110 
111  private:
112  double finalize_path(vertex_storage& vertices);
113  void transform1(const vertex_storage& vertices,
114  double kindex, double kx,
115  double *x, double* y) const;
116 
117  vertex_storage m_src_vertices1;
118  vertex_storage m_src_vertices2;
119  double m_base_length;
120  double m_base_height;
121  double m_kindex1;
122  double m_kindex2;
123  status_e m_status1;
124  status_e m_status2;
125  bool m_preserve_x_scale;
126  };
127 
128 }
129 
130 
131 #endif
Definition: agg_arc.cpp:24