25 #ifndef AGG_SCANLINE_STORAGE_BIN_INCLUDED 26 #define AGG_SCANLINE_STORAGE_BIN_INCLUDED 30 #include "agg_array.h" 67 m_storage(sl->m_storage),
68 m_span_idx(sl->m_scanline.start_span)
70 m_span = m_storage->span_by_index(m_span_idx);
73 const span_data& operator*()
const {
return m_span; }
74 const span_data* operator->()
const {
return &m_span; }
79 m_span = m_storage->span_by_index(m_span_idx);
99 void reset(
int,
int) {}
100 unsigned num_spans()
const {
return m_scanline.num_spans; }
101 int y()
const {
return m_scanline.y; }
105 void setup(
unsigned scanline_idx)
107 m_scanline_idx = scanline_idx;
108 m_scanline = m_storage->scanline_by_index(m_scanline_idx);
114 unsigned m_scanline_idx;
122 m_min_x(std::numeric_limits<int>::max()),
123 m_min_y(std::numeric_limits<int>::max()),
124 m_max_x(std::numeric_limits<int>::min()),
125 m_max_y(std::numeric_limits<int>::min()),
128 m_fake_scanline.y = 0;
129 m_fake_scanline.num_spans = 0;
130 m_fake_scanline.start_span = 0;
139 m_scanlines.remove_all();
140 m_spans.remove_all();
141 m_min_x = std::numeric_limits<int>::max();
142 m_min_y = std::numeric_limits<int>::max();
143 m_max_x = std::numeric_limits<int>::min();
144 m_max_y = std::numeric_limits<int>::min();
149 template<
class Scanline>
void render(
const Scanline& sl)
154 if(y < m_min_y) m_min_y = y;
155 if(y > m_max_y) m_max_y = y;
158 sl_this.num_spans = sl.num_spans();
159 sl_this.start_span = m_spans.size();
160 typename Scanline::const_iterator span_iterator = sl.begin();
162 unsigned num_spans = sl_this.num_spans;
166 sp.x = span_iterator->x;
167 sp.len = (int32)std::abs((
int)(span_iterator->len));
170 int x2 = sp.x + sp.len - 1;
171 if(x1 < m_min_x) m_min_x = x1;
172 if(x2 > m_max_x) m_max_x = x2;
173 if(--num_spans == 0)
break;
176 m_scanlines.add(sl_this);
182 int min_x()
const {
return m_min_x; }
183 int min_y()
const {
return m_min_y; }
184 int max_x()
const {
return m_max_x; }
185 int max_y()
const {
return m_max_y; }
188 bool rewind_scanlines()
191 return m_scanlines.size() > 0;
196 template<
class Scanline>
bool sweep_scanline(Scanline& sl)
201 if(m_cur_scanline >= m_scanlines.size())
return false;
204 unsigned num_spans = sl_this.num_spans;
205 unsigned span_idx = sl_this.start_span;
208 const span_data& sp = m_spans[span_idx++];
209 sl.add_span(sp.x, sp.len, cover_full);
216 sl.finalize(sl_this.y);
230 if(m_cur_scanline >= m_scanlines.size())
return false;
231 sl.setup(m_cur_scanline);
234 while(sl.num_spans() == 0);
240 unsigned byte_size()
const 243 unsigned size =
sizeof(int32) * 4;
245 for(i = 0; i < m_scanlines.size(); ++i)
247 size +=
sizeof(int32) * 2 +
248 unsigned(m_scanlines[i].num_spans) *
sizeof(int32) * 2;
255 static void write_int32(int8u* dst, int32 val)
257 dst[0] = ((
const int8u*)&val)[0];
258 dst[1] = ((
const int8u*)&val)[1];
259 dst[2] = ((
const int8u*)&val)[2];
260 dst[3] = ((
const int8u*)&val)[3];
265 void serialize(int8u* data)
const 269 write_int32(data, min_x());
270 data +=
sizeof(int32);
271 write_int32(data, min_y());
272 data +=
sizeof(int32);
273 write_int32(data, max_x());
274 data +=
sizeof(int32);
275 write_int32(data, max_y());
276 data +=
sizeof(int32);
278 for(i = 0; i < m_scanlines.size(); ++i)
282 write_int32(data, sl_this.y);
283 data +=
sizeof(int32);
285 write_int32(data, sl_this.num_spans);
286 data +=
sizeof(int32);
288 unsigned num_spans = sl_this.num_spans;
289 unsigned span_idx = sl_this.start_span;
292 const span_data& sp = m_spans[span_idx++];
294 write_int32(data, sp.x);
295 data +=
sizeof(int32);
297 write_int32(data, sp.len);
298 data +=
sizeof(int32);
308 return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline;
312 const span_data& span_by_index(
unsigned i)
const 314 return (i < m_spans.size()) ? m_spans[i] : m_fake_span;
327 unsigned m_cur_scanline;
346 typedef bool cover_type;
368 m_span.x = read_int32() + m_dx;
369 m_span.len = read_int32();
372 const span& operator*()
const {
return m_span; }
373 const span* operator->()
const {
return &m_span; }
377 m_span.x = read_int32() + m_dx;
378 m_span.len = read_int32();
385 ((int8u*)&val)[0] = *m_ptr++;
386 ((int8u*)&val)[1] = *m_ptr++;
387 ((int8u*)&val)[2] = *m_ptr++;
388 ((int8u*)&val)[3] = *m_ptr++;
404 void reset(
int,
int) {}
405 unsigned num_spans()
const {
return m_num_spans; }
406 int y()
const {
return m_y; }
415 ((int8u*)&val)[0] = *m_ptr++;
416 ((int8u*)&val)[1] = *m_ptr++;
417 ((int8u*)&val)[2] = *m_ptr++;
418 ((int8u*)&val)[3] = *m_ptr++;
424 void init(
const int8u* ptr,
int dx,
int dy)
427 m_y = read_int32() + dy;
428 m_num_spans = unsigned(read_int32());
435 unsigned m_num_spans;
449 m_min_x(std::numeric_limits<int>::max()),
450 m_min_y(std::numeric_limits<int>::max()),
451 m_max_x(std::numeric_limits<int>::min()),
452 m_max_y(std::numeric_limits<int>::min())
457 double dx,
double dy) :
463 m_min_x(std::numeric_limits<int>::max()),
464 m_min_y(std::numeric_limits<int>::max()),
465 m_max_x(std::numeric_limits<int>::min()),
466 m_max_y(std::numeric_limits<int>::min())
470 void init(
const int8u* data,
unsigned size,
double dx,
double dy)
477 m_min_x = std::numeric_limits<int>::max();
478 m_min_y = std::numeric_limits<int>::max();
479 m_max_x = std::numeric_limits<int>::min();
480 m_max_y = std::numeric_limits<int>::min();
488 ((int8u*)&val)[0] = *m_ptr++;
489 ((int8u*)&val)[1] = *m_ptr++;
490 ((int8u*)&val)[2] = *m_ptr++;
491 ((int8u*)&val)[3] = *m_ptr++;
498 bool rewind_scanlines()
503 m_min_x = read_int32() + m_dx;
504 m_min_y = read_int32() + m_dy;
505 m_max_x = read_int32() + m_dx;
506 m_max_y = read_int32() + m_dy;
508 return m_ptr < m_end;
512 int min_x()
const {
return m_min_x; }
513 int min_y()
const {
return m_min_y; }
514 int max_x()
const {
return m_max_x; }
515 int max_y()
const {
return m_max_y; }
518 template<
class Scanline>
bool sweep_scanline(Scanline& sl)
523 if(m_ptr >= m_end)
return false;
525 int y = read_int32() + m_dy;
526 unsigned num_spans = read_int32();
530 int x = read_int32() + m_dx;
531 int len = read_int32();
533 if(len < 0) len = -len;
534 sl.add_span(x,
unsigned(len), cover_full);
554 if(m_ptr >= m_end)
return false;
556 sl.init(m_ptr, m_dx, m_dy);
561 int num_spans = read_int32();
562 m_ptr += num_spans *
sizeof(int32) * 2;
564 while(sl.num_spans() == 0);