1 //---------------------------------------------------------------------------- 2 // Anti-Grain Geometry - Version 2.2 3 // Copyright (C) 2002-2004 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 28 class trans_double_path 29 { 30 enum status_e 31 { 32 initial, 33 making_path, 34 ready 35 }; 36 37 public: 38 typedef vertex_sequence<vertex_dist, 6> vertex_storage; 39 40 trans_double_path(); 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 132