
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
//          mcseemagg@yahoo.com
//          http://www.antigrain.com
//----------------------------------------------------------------------------
#ifndef AGG_RENDERER_SCANLINE_INCLUDED
#define AGG_RENDERER_SCANLINE_INCLUDED
#include "agg_basics.h"
#include "agg_renderer_base.h"
#include "agg_render_scanlines.h"
namespace pdfium
{
namespace agg
{
template<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa 
{
public:
    typedef BaseRenderer  base_ren_type;
    typedef SpanGenerator span_gen_type;
    renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}
    renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :
        m_ren(&ren),
        m_span_gen(&span_gen)
    {}
    void attach(base_ren_type& ren, span_gen_type& span_gen)
    {
        m_ren = &ren;
        m_span_gen = &span_gen;
    }
    void prepare(unsigned max_span_len)
    {
        m_span_gen->prepare(max_span_len);
    }
    template<class Scanline> void render(const Scanline& sl)
    {
        int y = sl.y();
        m_ren->first_clip_box();
        do {
            int xmin = m_ren->xmin();
            int xmax = m_ren->xmax();
            if(y >= m_ren->ymin() && y <= m_ren->ymax()) {
                unsigned num_spans = sl.num_spans();
                typename Scanline::const_iterator span = sl.begin();
                for(;;) {
                    int x = span->x;
                    int len = span->len;
                    bool solid = false;
                    const typename Scanline::cover_type* covers = span->covers;
                    if(len < 0) {
                        solid = true;
                        len = -len;
                    }
                    if(x < xmin) {
                        len -= xmin - x;
                        if(!solid) {
                            covers += xmin - x;
                        }
                        x = xmin;
                    }
                    if(len > 0) {
                        if(x + len > xmax) {
                            len = xmax - x + 1;
                        }
                        if(len > 0) {
                            m_ren->blend_color_hspan_no_clip(
                                x, y, len,
                                m_span_gen->generate(x, y, len),
                                solid ? 0 : covers,
                                *covers);
                        }
                    }
                    if(--num_spans == 0) {
                        break;
                    }
                    ++span;
                }
            }
        } while(m_ren->next_clip_box());
    }
private:
    base_ren_type* m_ren;
    SpanGenerator* m_span_gen;
};
}
}  // namespace pdfium
#endif
