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