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_VCGEN_STROKE_INCLUDED 17 #define AGG_VCGEN_STROKE_INCLUDED 18 19 #include "agg_math_stroke.h" 20 21 22 namespace agg 23 { 24 25 //============================================================vcgen_stroke 26 // 27 // See Implementation agg_vcgen_stroke.cpp 28 // Stroke generator 29 // 30 //------------------------------------------------------------------------ 31 class vcgen_stroke 32 { 33 enum status_e 34 { 35 initial, 36 ready, 37 cap1, 38 cap2, 39 outline1, 40 close_first, 41 outline2, 42 out_vertices, 43 end_poly1, 44 end_poly2, 45 stop 46 }; 47 48 public: 49 typedef vertex_sequence<vertex_dist, 6> vertex_storage; 50 typedef pod_bvector<point_d, 6> coord_storage; 51 52 vcgen_stroke(); 53 line_cap(line_cap_e lc)54 void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } line_join(line_join_e lj)55 void line_join(line_join_e lj) { m_stroker.line_join(lj); } inner_join(inner_join_e ij)56 void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } 57 line_cap()58 line_cap_e line_cap() const { return m_stroker.line_cap(); } line_join()59 line_join_e line_join() const { return m_stroker.line_join(); } inner_join()60 inner_join_e inner_join() const { return m_stroker.inner_join(); } 61 width(double w)62 void width(double w) { m_stroker.width(w); } miter_limit(double ml)63 void miter_limit(double ml) { m_stroker.miter_limit(ml); } miter_limit_theta(double t)64 void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } inner_miter_limit(double ml)65 void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } approximation_scale(double as)66 void approximation_scale(double as) { m_stroker.approximation_scale(as); } 67 width()68 double width() const { return m_stroker.width(); } miter_limit()69 double miter_limit() const { return m_stroker.miter_limit(); } inner_miter_limit()70 double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } approximation_scale()71 double approximation_scale() const { return m_stroker.approximation_scale(); } 72 shorten(double s)73 void shorten(double s) { m_shorten = s; } shorten()74 double shorten() const { return m_shorten; } 75 76 // Vertex Generator Interface 77 void remove_all(); 78 void add_vertex(double x, double y, unsigned cmd); 79 80 // Vertex Source Interface 81 void rewind(unsigned path_id); 82 unsigned vertex(double* x, double* y); 83 84 private: 85 vcgen_stroke(const vcgen_stroke&); 86 const vcgen_stroke& operator = (const vcgen_stroke&); 87 88 math_stroke<coord_storage> m_stroker; 89 vertex_storage m_src_vertices; 90 coord_storage m_out_vertices; 91 double m_shorten; 92 unsigned m_closed; 93 status_e m_status; 94 status_e m_prev_status; 95 unsigned m_src_vertex; 96 unsigned m_out_vertex; 97 }; 98 99 100 } 101 102 #endif 103