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_RENDERER_SCANLINE_INCLUDED
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_RENDERER_SCANLINE_INCLUDED
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_basics.h"
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_renderer_base.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_render_scanlines.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef BaseRenderer  base_ren_type;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef SpanGenerator span_gen_type;
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ren(&ren),
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_span_gen(&span_gen)
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {}
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void attach(base_ren_type& ren, span_gen_type& span_gen)
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ren = &ren;
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_span_gen = &span_gen;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void prepare(unsigned max_span_len)
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_span_gen->prepare(max_span_len);
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    template<class Scanline> void render(const Scanline& sl)
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int y = sl.y();
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ren->first_clip_box();
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        do {
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int xmin = m_ren->xmin();
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int xmax = m_ren->xmax();
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(y >= m_ren->ymin() && y <= m_ren->ymax()) {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                unsigned num_spans = sl.num_spans();
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                typename Scanline::const_iterator span = sl.begin();
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for(;;) {
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    int x = span->x;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    int len = span->len;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    bool solid = false;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const typename Scanline::cover_type* covers = span->covers;
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(len < 0) {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        solid = true;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        len = -len;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(x < xmin) {
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        len -= xmin - x;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(!solid) {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            covers += xmin - x;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        x = xmin;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(len > 0) {
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(x + len > xmax) {
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            len = xmax - x + 1;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(len > 0) {
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            m_ren->blend_color_hspan_no_clip(
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                x, y, len,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                m_span_gen->generate(x, y, len),
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                solid ? 0 : covers,
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                *covers);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(--num_spans == 0) {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    ++span;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } while(m_ren->next_clip_box());
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    base_ren_type* m_ren;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SpanGenerator* m_span_gen;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
94