1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Anti-Grain Geometry - Version 2.3 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Permission to copy, use, modify, sell and distribute this software 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// is granted provided this copyright notice appears in all copies. 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This software is provided "as is" without express or implied 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// warranty, and with no claim as to its suitability for any purpose. 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Contact: mcseem@antigrain.com 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// mcseemagg@yahoo.com 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// http://www.antigrain.com 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_RENDERER_SCANLINE_INCLUDED 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_RENDERER_SCANLINE_INCLUDED 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_basics.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_renderer_base.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_render_scanlines.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef BaseRenderer base_ren_type; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef SpanGenerator span_gen_type; 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov renderer_scanline_aa() : m_ren(0), m_span_gen(0) {} 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) : 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren(&ren), 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_span_gen(&span_gen) 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {} 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void attach(base_ren_type& ren, span_gen_type& span_gen) 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren = &ren; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_span_gen = &span_gen; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void prepare(unsigned max_span_len) 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_span_gen->prepare(max_span_len); 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov template<class Scanline> void render(const Scanline& sl) 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int y = sl.y(); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren->first_clip_box(); 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov do { 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int xmin = m_ren->xmin(); 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int xmax = m_ren->xmax(); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(y >= m_ren->ymin() && y <= m_ren->ymax()) { 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned num_spans = sl.num_spans(); 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typename Scanline::const_iterator span = sl.begin(); 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(;;) { 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int x = span->x; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int len = span->len; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool solid = false; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const typename Scanline::cover_type* covers = span->covers; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(len < 0) { 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov solid = true; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = -len; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x < xmin) { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len -= xmin - x; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!solid) { 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov covers += xmin - x; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x = xmin; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(len > 0) { 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x + len > xmax) { 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = xmax - x + 1; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(len > 0) { 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren->blend_color_hspan_no_clip( 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x, y, len, 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_span_gen->generate(x, y, len), 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov solid ? 0 : covers, 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *covers); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(--num_spans == 0) { 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++span; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } while(m_ren->next_clip_box()); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov base_ren_type* m_ren; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SpanGenerator* m_span_gen; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 94