24 #ifndef AGG_SCANLINE_U_INCLUDED 25 #define AGG_SCANLINE_U_INCLUDED 28 #include "agg_array.h" 114 typedef int8u cover_type;
115 typedef int16 coord_type;
131 m_last_x(0x7FFFFFF0),
136 void reset(
int min_x,
int max_x)
138 unsigned max_len = max_x - min_x + 2;
139 if(max_len > m_spans.size())
141 m_spans.resize(max_len);
142 m_covers.resize(max_len);
144 m_last_x = 0x7FFFFFF0;
146 m_cur_span = &m_spans[0];
150 void add_cell(
int x,
unsigned cover)
153 m_covers[x] = (cover_type)cover;
161 m_cur_span->x = (coord_type)(x + m_min_x);
163 m_cur_span->covers = &m_covers[x];
169 void add_cells(
int x,
unsigned len,
const cover_type* covers)
172 std::memcpy(&m_covers[x], covers, len *
sizeof(cover_type));
175 m_cur_span->len += (coord_type)len;
180 m_cur_span->x = (coord_type)(x + m_min_x);
181 m_cur_span->len = (coord_type)len;
182 m_cur_span->covers = &m_covers[x];
184 m_last_x = x + len - 1;
188 void add_span(
int x,
unsigned len,
unsigned cover)
191 std::memset(&m_covers[x], cover, len);
194 m_cur_span->len += (coord_type)len;
199 m_cur_span->x = (coord_type)(x + m_min_x);
200 m_cur_span->len = (coord_type)len;
201 m_cur_span->covers = &m_covers[x];
203 m_last_x = x + len - 1;
215 m_last_x = 0x7FFFFFF0;
216 m_cur_span = &m_spans[0];
220 int y()
const {
return m_y; }
221 unsigned num_spans()
const {
return unsigned(m_cur_span - &m_spans[0]); }
222 const_iterator begin()
const {
return &m_spans[1]; }
223 iterator begin() {
return &m_spans[1]; }
227 const self_type& operator = (
const self_type&);
246 template<
class AlphaMask>
251 typedef AlphaMask alpha_mask_type;
252 typedef base_type::cover_type cover_type;
253 typedef base_type::coord_type coord_type;
259 void finalize(
int span_y)
261 base_type::finalize(span_y);
265 unsigned count = base_type::num_spans();
268 m_alpha_mask->combine_hspan(span->x,
279 AlphaMask* m_alpha_mask;
290 typedef int8u cover_type;
291 typedef int32 coord_type;
297 span(coord_type x_, coord_type len_, cover_type* covers_) :
298 x(x_), len(len_), covers(covers_) {}
316 const span& operator*()
const {
return m_spans[m_span_idx]; }
317 const span* operator->()
const {
return &m_spans[m_span_idx]; }
319 void operator ++ () { ++m_span_idx; }
322 const span_array_type& m_spans;
335 span& operator*() {
return m_spans[m_span_idx]; }
336 span* operator->() {
return &m_spans[m_span_idx]; }
338 void operator ++ () { ++m_span_idx; }
341 span_array_type& m_spans;
350 m_last_x(0x7FFFFFF0),
355 void reset(
int min_x,
int max_x)
357 unsigned max_len = max_x - min_x + 2;
358 if(max_len > m_covers.size())
360 m_covers.resize(max_len);
362 m_last_x = 0x7FFFFFF0;
364 m_spans.remove_all();
368 void add_cell(
int x,
unsigned cover)
371 m_covers[x] = cover_type(cover);
374 m_spans.last().len++;
378 m_spans.add(
span(coord_type(x + m_min_x), 1, &m_covers[x]));
384 void add_cells(
int x,
unsigned len,
const cover_type* covers)
387 std::memcpy(&m_covers[x], covers, len *
sizeof(cover_type));
390 m_spans.last().len += coord_type(len);
394 m_spans.add(
span(coord_type(x + m_min_x),
398 m_last_x = x + len - 1;
402 void add_span(
int x,
unsigned len,
unsigned cover)
405 std::memset(&m_covers[x], cover, len);
408 m_spans.last().len += coord_type(len);
412 m_spans.add(
span(coord_type(x + m_min_x),
416 m_last_x = x + len - 1;
428 m_last_x = 0x7FFFFFF0;
429 m_spans.remove_all();
433 int y()
const {
return m_y; }
434 unsigned num_spans()
const {
return m_spans.size(); }
440 const self_type& operator = (
const self_type&);
447 span_array_type m_spans;
458 template<
class AlphaMask>
463 typedef AlphaMask alpha_mask_type;
464 typedef base_type::cover_type cover_type;
465 typedef base_type::coord_type coord_type;
472 void finalize(
int span_y)
474 base_type::finalize(span_y);
478 unsigned count = base_type::num_spans();
481 m_alpha_mask->combine_hspan(span->x,
492 AlphaMask* m_alpha_mask;