|  | 
 | //---------------------------------------------------------------------------- | 
 | // 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 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; | 
 | }; | 
 | } | 
 | #endif |