You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.2 KiB
93 lines
3.2 KiB
|
|
//---------------------------------------------------------------------------- |
|
// 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
|
|
|