1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Anti-Grain Geometry - Version 2.3 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Permission to copy, use, modify, sell and distribute this software 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// is granted provided this copyright notice appears in all copies. 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This software is provided "as is" without express or implied 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// warranty, and with no claim as to its suitability for any purpose. 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Contact: mcseem@antigrain.com 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// mcseemagg@yahoo.com 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// http://www.antigrain.com 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_VCGEN_STROKE_INCLUDED 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_VCGEN_STROKE_INCLUDED 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_math_stroke.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass vcgen_stroke 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov enum status_e { 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov initial, 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ready, 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cap1, 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cap2, 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov outline1, 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov close_first, 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov outline2, 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov out_vertices, 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov end_poly1, 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov end_poly2, 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stop 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef vertex_sequence<vertex_dist_cmd, 6> vertex_storage; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef pod_deque<point_type, 6> coord_storage; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vcgen_stroke(); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void line_cap(line_cap_e lc) 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_line_cap = lc; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void line_join(line_join_e lj) 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_line_join = lj; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void inner_join(inner_join_e ij) 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_inner_join = ij; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line_cap_e line_cap() const 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_line_cap; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line_join_e line_join() const 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_line_join; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inner_join_e inner_join() const 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_inner_join; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void width(FX_FLOAT w) 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_width = w / 2; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void miter_limit(FX_FLOAT ml) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_miter_limit = ml; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void miter_limit_theta(FX_FLOAT t); 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void inner_miter_limit(FX_FLOAT ml) 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_inner_miter_limit = ml; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void approximation_scale(FX_FLOAT as) 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_approx_scale = as; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT width() const 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_width * 2; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT miter_limit() const 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_miter_limit; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT inner_miter_limit() const 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_inner_miter_limit; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT approximation_scale() const 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_approx_scale; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void remove_all(); 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd); 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void rewind(unsigned path_id); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned vertex(FX_FLOAT* x, FX_FLOAT* y); 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vcgen_stroke(const vcgen_stroke&); 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const vcgen_stroke& operator = (const vcgen_stroke&); 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vertex_storage m_src_vertices; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coord_storage m_out_vertices; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_width; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_miter_limit; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_inner_miter_limit; 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_approx_scale; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line_cap_e m_line_cap; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line_join_e m_line_join; 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inner_join_e m_inner_join; 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned m_closed; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status_e m_status; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status_e m_prev_status; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned m_src_vertex; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned m_out_vertex; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 121