|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | // 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 |