
//----------------------------------------------------------------------------
// 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_RENDER_SCANLINES_INCLUDED
#define AGG_RENDER_SCANLINES_INCLUDED
#include "agg_basics.h"
namespace pdfium
{
namespace agg
{
template<class Rasterizer, class Scanline, class Renderer>
void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth)
{
    if(ras.rewind_scanlines()) {
        sl.reset(ras.min_x(), ras.max_x());
        ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2));
        while(ras.sweep_scanline(sl, no_smooth)) {
            ren.render(sl);
        }
    }
}
template<class Rasterizer, class Scanline, class Renderer,
         class VertexSource, class ColorStorage, class PathId>
void render_all_paths(Rasterizer& ras,
                      Scanline& sl,
                      Renderer& r,
                      VertexSource& vs,
                      const ColorStorage& as,
                      const PathId& path_id,
                      unsigned num_paths)
{
    for(unsigned i = 0; i < num_paths; i++) {
        ras.reset();
        ras.add_path(vs, path_id[i]);
        r.color(as[i]);
        render_scanlines(ras, sl, r);
    }
}
}
}  // namespace pdfium
#endif
