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 #ifndef AGG_RASTERIZER_OUTLINE_INCLUDED 16 #define AGG_RASTERIZER_OUTLINE_INCLUDED 17 18 #include "agg_basics.h" 19 20 namespace agg 21 { 22 //======================================================rasterizer_outline 23 template<class Renderer> class rasterizer_outline 24 { 25 public: rasterizer_outline(Renderer & ren)26 rasterizer_outline(Renderer& ren) : 27 m_ren(&ren), 28 m_start_x(0), 29 m_start_y(0), 30 m_vertices(0) 31 {} attach(Renderer & ren)32 void attach(Renderer& ren) { m_ren = &ren; } 33 34 35 //-------------------------------------------------------------------- move_to(int x,int y)36 void move_to(int x, int y) 37 { 38 m_vertices = 1; 39 m_ren->move_to(m_start_x = x, m_start_y = y); 40 } 41 42 //-------------------------------------------------------------------- line_to(int x,int y)43 void line_to(int x, int y) 44 { 45 ++m_vertices; 46 m_ren->line_to(x, y); 47 } 48 49 //-------------------------------------------------------------------- move_to_d(double x,double y)50 void move_to_d(double x, double y) 51 { 52 move_to(m_ren->coord(x), m_ren->coord(y)); 53 } 54 55 //-------------------------------------------------------------------- line_to_d(double x,double y)56 void line_to_d(double x, double y) 57 { 58 line_to(m_ren->coord(x), m_ren->coord(y)); 59 } 60 61 //-------------------------------------------------------------------- close()62 void close() 63 { 64 if(m_vertices > 2) 65 { 66 line_to(m_start_x, m_start_y); 67 } 68 m_vertices = 0; 69 } 70 71 //-------------------------------------------------------------------- add_vertex(double x,double y,unsigned cmd)72 void add_vertex(double x, double y, unsigned cmd) 73 { 74 if(is_move_to(cmd)) 75 { 76 move_to_d(x, y); 77 } 78 else 79 { 80 if(is_end_poly(cmd)) 81 { 82 if(is_closed(cmd)) close(); 83 } 84 else 85 { 86 line_to_d(x, y); 87 } 88 } 89 } 90 91 92 //-------------------------------------------------------------------- 93 template<class VertexSource> 94 void add_path(VertexSource& vs, unsigned path_id=0) 95 { 96 double x; 97 double y; 98 99 unsigned cmd; 100 vs.rewind(path_id); 101 while(!is_stop(cmd = vs.vertex(&x, &y))) 102 { 103 add_vertex(x, y, cmd); 104 } 105 } 106 107 108 //-------------------------------------------------------------------- 109 template<class VertexSource, class ColorStorage, class PathId> render_all_paths(VertexSource & vs,const ColorStorage & colors,const PathId & path_id,unsigned num_paths)110 void render_all_paths(VertexSource& vs, 111 const ColorStorage& colors, 112 const PathId& path_id, 113 unsigned num_paths) 114 { 115 for(unsigned i = 0; i < num_paths; i++) 116 { 117 m_ren->line_color(colors[i]); 118 add_path(vs, path_id[i]); 119 } 120 } 121 122 123 //-------------------------------------------------------------------- render_ctrl(Ctrl & c)124 template<class Ctrl> void render_ctrl(Ctrl& c) 125 { 126 unsigned i; 127 for(i = 0; i < c.num_paths(); i++) 128 { 129 m_ren->line_color(c.color(i)); 130 add_path(c, i); 131 } 132 } 133 134 135 private: 136 Renderer* m_ren; 137 int m_start_x; 138 int m_start_y; 139 unsigned m_vertices; 140 }; 141 142 143 } 144 145 146 #endif 147 148