diff options
Diffstat (limited to 'third_party/agg23/agg_renderer_scanline.h')
-rw-r--r-- | third_party/agg23/agg_renderer_scanline.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/third_party/agg23/agg_renderer_scanline.h b/third_party/agg23/agg_renderer_scanline.h new file mode 100644 index 0000000000..62d104f7f2 --- /dev/null +++ b/third_party/agg23/agg_renderer_scanline.h @@ -0,0 +1,93 @@ + +//---------------------------------------------------------------------------- +// 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 |