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// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Liberty Technology Systems, Inc., visit http://lib-sys.com 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Liberty Technology Systems, Inc. is the provider of 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PostScript and PDF technology for software developers. 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_SCANLINE_U_INCLUDED 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_SCANLINE_U_INCLUDED 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_array.h" 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate<class CoverT> class scanline_u : public CFX_Object 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef scanline_u<CoverT> self_type; 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef CoverT cover_type; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef int16 coord_type; 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct span : public CFX_Object { 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coord_type x; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coord_type len; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cover_type* covers; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef span* iterator; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef const span* const_iterator; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~scanline_u() 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_spans); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_covers); 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scanline_u() : 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_min_x(0), 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_max_len(0), 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x(0x7FFFFFF0), 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_covers(0), 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_spans(0), 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span(0) 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {} 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void reset(int min_x, int max_x) 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned max_len = max_x - min_x + 2; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(max_len > m_max_len) { 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_spans); 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_covers); 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_covers = FX_Alloc( cover_type , max_len); 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_spans = FX_Alloc( span , max_len); 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_max_len = max_len; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x = 0x7FFFFFF0; 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_min_x = min_x; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span = m_spans; 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void add_cell(int x, unsigned cover) 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x -= m_min_x; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_covers[x] = (cover_type)cover; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x == m_last_x + 1) { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len++; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span++; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->x = (coord_type)(x + m_min_x); 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len = 1; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->covers = m_covers + x; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x = x; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void add_cells(int x, unsigned len, const CoverT* covers) 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x -= m_min_x; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT)); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x == m_last_x + 1) { 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len += (coord_type)len; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span++; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->x = (coord_type)(x + m_min_x); 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len = (coord_type)len; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->covers = m_covers + x; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x = x + len - 1; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void add_span(int x, unsigned len, unsigned cover) 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x -= m_min_x; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset8(m_covers + x, cover, len); 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(x == m_last_x + 1) { 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len += (coord_type)len; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span++; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->x = (coord_type)(x + m_min_x); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->len = (coord_type)len; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span->covers = m_covers + x; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x = x + len - 1; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void finalize(int y) 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_y = y; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void reset_spans() 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_last_x = 0x7FFFFFF0; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_cur_span = m_spans; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int y() const 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_y; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned num_spans() const 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return unsigned(m_cur_span - m_spans); 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const_iterator begin() const 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_spans + 1; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov iterator begin() 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_spans + 1; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scanline_u(const self_type&); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const self_type& operator = (const self_type&); 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_min_x; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned m_max_len; 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_last_x; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_y; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cover_type* m_covers; 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov span* m_spans; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov span* m_cur_span; 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef scanline_u<int8u> scanline_u8; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 151