27 #ifndef AGG_SCANLINE_P_INCLUDED 28 #define AGG_SCANLINE_P_INCLUDED 31 #include "agg_array.h" 47 typedef int8u cover_type;
48 typedef int16 coord_type;
55 const cover_type* covers;
71 void reset(
int min_x,
int max_x)
73 unsigned max_len = max_x - min_x + 3;
74 if(max_len > m_spans.size())
76 m_spans.resize(max_len);
77 m_covers.resize(max_len);
79 m_last_x = 0x7FFFFFF0;
80 m_cover_ptr = &m_covers[0];
81 m_cur_span = &m_spans[0];
86 void add_cell(
int x,
unsigned cover)
88 *m_cover_ptr = (cover_type)cover;
89 if(x == m_last_x+1 && m_cur_span->len > 0)
96 m_cur_span->covers = m_cover_ptr;
97 m_cur_span->x = (int16)x;
105 void add_cells(
int x,
unsigned len,
const cover_type* covers)
107 std::memcpy(m_cover_ptr, covers, len *
sizeof(cover_type));
108 if(x == m_last_x+1 && m_cur_span->len > 0)
110 m_cur_span->len += (int16)len;
115 m_cur_span->covers = m_cover_ptr;
116 m_cur_span->x = (int16)x;
117 m_cur_span->len = (int16)len;
120 m_last_x = x + len - 1;
124 void add_span(
int x,
unsigned len,
unsigned cover)
126 if(x == m_last_x+1 &&
127 m_cur_span->len < 0 &&
128 cover == *m_cur_span->covers)
130 m_cur_span->len -= (int16)len;
134 *m_cover_ptr = (cover_type)cover;
136 m_cur_span->covers = m_cover_ptr++;
137 m_cur_span->x = (int16)x;
138 m_cur_span->len = (int16)(-
int(len));
140 m_last_x = x + len - 1;
152 m_last_x = 0x7FFFFFF0;
153 m_cover_ptr = &m_covers[0];
154 m_cur_span = &m_spans[0];
159 int y()
const {
return m_y; }
160 unsigned num_spans()
const {
return unsigned(m_cur_span - &m_spans[0]); }
161 const_iterator begin()
const {
return &m_spans[1]; }
165 const self_type& operator = (
const self_type&);
170 cover_type* m_cover_ptr;
187 typedef int8u cover_type;
188 typedef int32 coord_type;
193 span(coord_type x_, coord_type len_,
const cover_type* covers_) :
194 x(x_), len(len_), covers(covers_) {}
198 const cover_type* covers;
212 const span& operator*()
const {
return m_spans[m_span_idx]; }
213 const span* operator->()
const {
return &m_spans[m_span_idx]; }
215 void operator ++ () { ++m_span_idx; }
218 const span_array_type& m_spans;
225 m_last_x(0x7FFFFFF0),
232 void reset(
int min_x,
int max_x)
234 unsigned max_len = max_x - min_x + 3;
235 if(max_len > m_covers.size())
237 m_covers.resize(max_len);
239 m_last_x = 0x7FFFFFF0;
240 m_cover_ptr = &m_covers[0];
241 m_spans.remove_all();
245 void add_cell(
int x,
unsigned cover)
247 *m_cover_ptr = cover_type(cover);
248 if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0)
250 m_spans.last().len++;
254 m_spans.add(
span(coord_type(x), 1, m_cover_ptr));
261 void add_cells(
int x,
unsigned len,
const cover_type* covers)
263 std::memcpy(m_cover_ptr, covers, len *
sizeof(cover_type));
264 if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0)
266 m_spans.last().len += coord_type(len);
270 m_spans.add(
span(coord_type(x), coord_type(len), m_cover_ptr));
273 m_last_x = x + len - 1;
277 void add_span(
int x,
unsigned len,
unsigned cover)
279 if(x == m_last_x+1 &&
281 m_spans.last().len < 0 &&
282 cover == *m_spans.last().covers)
284 m_spans.last().len -= coord_type(len);
288 *m_cover_ptr = cover_type(cover);
289 m_spans.add(
span(coord_type(x), -coord_type(len), m_cover_ptr++));
291 m_last_x = x + len - 1;
303 m_last_x = 0x7FFFFFF0;
304 m_cover_ptr = &m_covers[0];
305 m_spans.remove_all();
309 int y()
const {
return m_y; }
310 unsigned num_spans()
const {
return m_spans.size(); }
315 const self_type& operator = (
const self_type&);
321 cover_type* m_cover_ptr;
322 span_array_type m_spans;