Skip to content

Commit 1c45457

Browse files
committed
Increase rendering cell limit in Agg.
svn path=/trunk/matplotlib/; revision=6169
1 parent 27e7e04 commit 1c45457

File tree

1 file changed

+57
-53
lines changed

1 file changed

+57
-53
lines changed

agg24/include/agg_rasterizer_cells_aa.h

Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
// Anti-Grain Geometry - Version 2.4
33
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
44
//
5-
// Permission to copy, use, modify, sell and distribute this software
6-
// is granted provided this copyright notice appears in all copies.
5+
// Permission to copy, use, modify, sell and distribute this software
6+
// is granted provided this copyright notice appears in all copies.
77
// This software is provided "as is" without express or implied
88
// warranty, and with no claim as to its suitability for any purpose.
99
//
1010
//----------------------------------------------------------------------------
1111
//
12-
// The author gratefully acknowleges the support of David Turner,
13-
// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
12+
// The author gratefully acknowleges the support of David Turner,
13+
// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
1414
// libray - in producing this work. See http://www.freetype.org for details.
1515
//
1616
//----------------------------------------------------------------------------
@@ -19,12 +19,12 @@
1919
// http://www.antigrain.com
2020
//----------------------------------------------------------------------------
2121
//
22-
// Adaptation for 32-bit screen coordinates has been sponsored by
22+
// Adaptation for 32-bit screen coordinates has been sponsored by
2323
// Liberty Technology Systems, Inc., visit http://lib-sys.com
2424
//
2525
// Liberty Technology Systems, Inc. is the provider of
2626
// PostScript and PDF technology for software developers.
27-
//
27+
//
2828
//----------------------------------------------------------------------------
2929
#ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED
3030
#define AGG_RASTERIZER_CELLS_AA_INCLUDED
@@ -49,7 +49,7 @@ namespace agg
4949
cell_block_size = 1 << cell_block_shift,
5050
cell_block_mask = cell_block_size - 1,
5151
cell_block_pool = 256,
52-
cell_block_limit = 1024
52+
cell_block_limit = 4096
5353
};
5454

5555
struct sorted_y
@@ -76,19 +76,19 @@ namespace agg
7676

7777
void sort_cells();
7878

79-
unsigned total_cells() const
79+
unsigned total_cells() const
8080
{
8181
return m_num_cells;
8282
}
8383

84-
unsigned scanline_num_cells(unsigned y) const
85-
{
86-
return m_sorted_y[y - m_min_y].num;
84+
unsigned scanline_num_cells(unsigned y) const
85+
{
86+
return m_sorted_y[y - m_min_y].num;
8787
}
8888

8989
const cell_type* const* scanline_cells(unsigned y) const
90-
{
91-
return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;
90+
{
91+
return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;
9292
}
9393

9494
bool sorted() const { return m_sorted; }
@@ -101,7 +101,7 @@ namespace agg
101101
void add_curr_cell();
102102
void render_hline(int ey, int x1, int y1, int x2, int y2);
103103
void allocate_block();
104-
104+
105105
private:
106106
unsigned m_num_blocks;
107107
unsigned m_max_blocks;
@@ -124,7 +124,7 @@ namespace agg
124124

125125

126126
//------------------------------------------------------------------------
127-
template<class Cell>
127+
template<class Cell>
128128
rasterizer_cells_aa<Cell>::~rasterizer_cells_aa()
129129
{
130130
if(m_num_blocks)
@@ -140,7 +140,7 @@ namespace agg
140140
}
141141

142142
//------------------------------------------------------------------------
143-
template<class Cell>
143+
template<class Cell>
144144
rasterizer_cells_aa<Cell>::rasterizer_cells_aa() :
145145
m_num_blocks(0),
146146
m_max_blocks(0),
@@ -161,10 +161,10 @@ namespace agg
161161
}
162162

163163
//------------------------------------------------------------------------
164-
template<class Cell>
164+
template<class Cell>
165165
void rasterizer_cells_aa<Cell>::reset()
166166
{
167-
m_num_cells = 0;
167+
m_num_cells = 0;
168168
m_curr_block = 0;
169169
m_curr_cell.initial();
170170
m_style_cell.initial();
@@ -176,7 +176,7 @@ namespace agg
176176
}
177177

178178
//------------------------------------------------------------------------
179-
template<class Cell>
179+
template<class Cell>
180180
AGG_INLINE void rasterizer_cells_aa<Cell>::add_curr_cell()
181181
{
182182
if(m_curr_cell.area | m_curr_cell.cover)
@@ -192,7 +192,7 @@ namespace agg
192192
}
193193

194194
//------------------------------------------------------------------------
195-
template<class Cell>
195+
template<class Cell>
196196
AGG_INLINE void rasterizer_cells_aa<Cell>::set_curr_cell(int x, int y)
197197
{
198198
if(m_curr_cell.not_equal(x, y, m_style_cell))
@@ -207,9 +207,9 @@ namespace agg
207207
}
208208

209209
//------------------------------------------------------------------------
210-
template<class Cell>
211-
AGG_INLINE void rasterizer_cells_aa<Cell>::render_hline(int ey,
212-
int x1, int y1,
210+
template<class Cell>
211+
AGG_INLINE void rasterizer_cells_aa<Cell>::render_hline(int ey,
212+
int x1, int y1,
213213
int x2, int y2)
214214
{
215215
int ex1 = x1 >> poly_subpixel_shift;
@@ -305,14 +305,14 @@ namespace agg
305305
}
306306

307307
//------------------------------------------------------------------------
308-
template<class Cell>
308+
template<class Cell>
309309
AGG_INLINE void rasterizer_cells_aa<Cell>::style(const cell_type& style_cell)
310-
{
311-
m_style_cell.style(style_cell);
310+
{
311+
m_style_cell.style(style_cell);
312312
}
313313

314314
//------------------------------------------------------------------------
315-
template<class Cell>
315+
template<class Cell>
316316
void rasterizer_cells_aa<Cell>::line(int x1, int y1, int x2, int y2)
317317
{
318318
enum dx_limit_e { dx_limit = 16384 << poly_subpixel_shift };
@@ -358,7 +358,7 @@ namespace agg
358358

359359
//Vertical line - we have to calculate start and end cells,
360360
//and then - the common values of the area and coverage for
361-
//all cells of the line. We know exactly there's only one
361+
//all cells of the line. We know exactly there's only one
362362
//cell, so, we don't have to call render_hline().
363363
incr = 1;
364364
if(dx == 0)
@@ -463,15 +463,15 @@ namespace agg
463463
}
464464

465465
//------------------------------------------------------------------------
466-
template<class Cell>
466+
template<class Cell>
467467
void rasterizer_cells_aa<Cell>::allocate_block()
468468
{
469469
if(m_curr_block >= m_num_blocks)
470470
{
471471
if(m_num_blocks >= m_max_blocks)
472472
{
473-
cell_type** new_cells =
474-
pod_allocator<cell_type*>::allocate(m_max_blocks +
473+
cell_type** new_cells =
474+
pod_allocator<cell_type*>::allocate(m_max_blocks +
475475
cell_block_pool);
476476

477477
if(m_cells)
@@ -483,7 +483,7 @@ namespace agg
483483
m_max_blocks += cell_block_pool;
484484
}
485485

486-
m_cells[m_num_blocks++] =
486+
m_cells[m_num_blocks++] =
487487
pod_allocator<cell_type>::allocate(cell_block_size);
488488

489489
}
@@ -513,7 +513,7 @@ namespace agg
513513
void qsort_cells(Cell** start, unsigned num)
514514
{
515515
Cell** stack[80];
516-
Cell*** top;
516+
Cell*** top;
517517
Cell** limit;
518518
Cell** base;
519519

@@ -538,7 +538,7 @@ namespace agg
538538
i = base + 1;
539539
j = limit - 1;
540540

541-
// now ensure that *i <= *base <= *j
541+
// now ensure that *i <= *base <= *j
542542
if((*j)->x < (*i)->x)
543543
{
544544
swap_cells(i, j);
@@ -619,7 +619,7 @@ namespace agg
619619

620620

621621
//------------------------------------------------------------------------
622-
template<class Cell>
622+
template<class Cell>
623623
void rasterizer_cells_aa<Cell>::sort_cells()
624624
{
625625
if(m_sorted) return; //Perform sort only the first time.
@@ -636,9 +636,9 @@ namespace agg
636636
//for(unsigned nc = 0; nc < m_num_cells; nc++)
637637
//{
638638
// cell_type* cell = m_cells[nc >> cell_block_shift] + (nc & cell_block_mask);
639-
// if(cell->x < m_min_x ||
640-
// cell->y < m_min_y ||
641-
// cell->x > m_max_x ||
639+
// if(cell->x < m_min_x ||
640+
// cell->y < m_min_y ||
641+
// cell->x > m_max_x ||
642642
// cell->y > m_max_y)
643643
// {
644644
// cell = cell; // Breakpoint here
@@ -660,19 +660,21 @@ namespace agg
660660
{
661661
cell_ptr = *block_ptr++;
662662
i = cell_block_size;
663-
while(i--)
663+
while(i--)
664664
{
665665
m_sorted_y[cell_ptr->y - m_min_y].start++;
666666
++cell_ptr;
667667
}
668668
}
669669

670-
cell_ptr = *block_ptr++;
671670
i = m_num_cells & cell_block_mask;
672-
while(i--)
673-
{
674-
m_sorted_y[cell_ptr->y - m_min_y].start++;
675-
++cell_ptr;
671+
if (i) {
672+
cell_ptr = *block_ptr++;
673+
while(i--)
674+
{
675+
m_sorted_y[cell_ptr->y - m_min_y].start++;
676+
++cell_ptr;
677+
}
676678
}
677679

678680
// Convert the Y-histogram into the array of starting indexes
@@ -691,23 +693,25 @@ namespace agg
691693
{
692694
cell_ptr = *block_ptr++;
693695
i = cell_block_size;
694-
while(i--)
696+
while(i--)
695697
{
696698
sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y];
697699
m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr;
698700
++curr_y.num;
699701
++cell_ptr;
700702
}
701703
}
702-
703-
cell_ptr = *block_ptr++;
704+
704705
i = m_num_cells & cell_block_mask;
705-
while(i--)
706-
{
707-
sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y];
708-
m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr;
709-
++curr_y.num;
710-
++cell_ptr;
706+
if (i) {
707+
cell_ptr = *block_ptr++;
708+
while(i--)
709+
{
710+
sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y];
711+
m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr;
712+
++curr_y.num;
713+
++cell_ptr;
714+
}
711715
}
712716

713717
// Finally arrange the X-arrays

0 commit comments

Comments
 (0)