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// 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// class renderer_base 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_RENDERER_BASE_INCLUDED 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_RENDERER_BASE_INCLUDED 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_basics.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_rendering_buffer.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate<class PixelFormat> class renderer_base 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef PixelFormat pixfmt_type; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef typename pixfmt_type::color_type color_type; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef typename pixfmt_type::row_data row_data; 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef typename pixfmt_type::span_data span_data; 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {} 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov renderer_base(pixfmt_type& ren) : 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren(&ren), 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_clip_box(0, 0, ren.width() - 1, ren.height() - 1) 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {} 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void attach(pixfmt_type& ren) 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren = &ren; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1); 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const pixfmt_type& ren() const 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *m_ren; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pixfmt_type& ren() 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *m_ren; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned width() const 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_ren->width(); 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned height() const 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_ren->height(); 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void first_clip_box() {} 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bool next_clip_box() 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const rect& clip_box() const 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int xmin() const 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.x1; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ymin() const 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.y1; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int xmax() const 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.x2; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ymax() const 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.y2; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const rect& bounding_clip_box() const 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bounding_xmin() const 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.x1; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bounding_ymin() const 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.y1; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bounding_xmax() const 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.x2; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bounding_ymax() const 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_clip_box.y2; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void blend_hline(int x1, int y, int x2, 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const color_type& c, cover_type cover) 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x1 > x2) { 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int t = x2; 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x2 = x1; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x1 = t; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(y > ymax()) { 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(y < ymin()) { 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x1 > xmax()) { 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x2 < xmin()) { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x1 < xmin()) { 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x1 = xmin(); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x2 > xmax()) { 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x2 = xmax(); 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void blend_solid_hspan(int x, int y, int len, 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const color_type& c, 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const cover_type* covers) 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(y > ymax()) { 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(y < ymin()) { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x < xmin()) { 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len -= xmin() - x; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(len <= 0) { 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov covers += xmin() - x; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x = xmin(); 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x + len > xmax()) { 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = xmax() - x + 1; 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(len <= 0) { 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ren->blend_solid_hspan(x, y, len, c, covers); 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pixfmt_type* m_ren; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect m_clip_box; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 164