Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
agg::rasterizer_scanline_aa< Clip > Class Template Reference

#include <src/agg/agg_rasterizer_scanline_aa.h>

+ Collaboration diagram for agg::rasterizer_scanline_aa< Clip >:

Public Types

enum  aa_scale_e {
  aa_shift = 8 , aa_scale = 1 << aa_shift , aa_mask = aa_scale - 1 , aa_scale2 = aa_scale * 2 ,
  aa_mask2 = aa_scale2 - 1
}
 
typedef Clip clip_type
 
typedef Clip::conv_type conv_type
 
typedef Clip::coord_type coord_type
 

Public Member Functions

 rasterizer_scanline_aa ()
 
template<class GammaF >
 rasterizer_scanline_aa (const GammaF &gamma_function)
 
void reset ()
 
void reset_clipping ()
 
void clip_box (double x1, double y1, double x2, double y2)
 
void filling_rule (filling_rule_e filling_rule)
 
void auto_close (bool flag)
 
template<class GammaF >
void gamma (const GammaF &gamma_function)
 
unsigned apply_gamma (unsigned cover) const
 
void move_to (int x, int y)
 
void line_to (int x, int y)
 
void move_to_d (double x, double y)
 
void line_to_d (double x, double y)
 
void close_polygon ()
 
void add_vertex (double x, double y, unsigned cmd)
 
void edge (int x1, int y1, int x2, int y2)
 
void edge_d (double x1, double y1, double x2, double y2)
 
template<class VertexSource >
void add_path (VertexSource &&vs, unsigned path_id=0)
 
int min_x () const
 
int min_y () const
 
int max_x () const
 
int max_y () const
 
void sort ()
 
bool rewind_scanlines ()
 
bool navigate_scanline (int y)
 
AGG_INLINE unsigned calculate_alpha (int area) const
 
template<class Scanline >
bool sweep_scanline (Scanline &sl)
 
bool hit_test (int tx, int ty)
 

Private Types

enum  status { status_initial , status_move_to , status_line_to , status_closed }
 

Private Member Functions

 rasterizer_scanline_aa (const rasterizer_scanline_aa< Clip > &)
 
const rasterizer_scanline_aa< Clip > & operator= (const rasterizer_scanline_aa< Clip > &)
 

Private Attributes

rasterizer_cells_aa< cell_aam_outline
 
clip_type m_clipper
 
int m_gamma [aa_scale]
 
filling_rule_e m_filling_rule
 
bool m_auto_close
 
coord_type m_start_x
 
coord_type m_start_y
 
unsigned m_status
 
int m_scan_y
 

Detailed Description

template<class Clip = rasterizer_sl_clip_int>
class agg::rasterizer_scanline_aa< Clip >

Member Typedef Documentation

◆ clip_type

template<class Clip = rasterizer_sl_clip_int>
typedef Clip agg::rasterizer_scanline_aa< Clip >::clip_type

◆ conv_type

template<class Clip = rasterizer_sl_clip_int>
typedef Clip::conv_type agg::rasterizer_scanline_aa< Clip >::conv_type

◆ coord_type

template<class Clip = rasterizer_sl_clip_int>
typedef Clip::coord_type agg::rasterizer_scanline_aa< Clip >::coord_type

Member Enumeration Documentation

◆ aa_scale_e

template<class Clip = rasterizer_sl_clip_int>
enum agg::rasterizer_scanline_aa::aa_scale_e
Enumerator
aa_shift 
aa_scale 
aa_mask 
aa_scale2 
aa_mask2 
87 {
88 aa_shift = 8,
89 aa_scale = 1 << aa_shift,
90 aa_mask = aa_scale - 1,
91 aa_scale2 = aa_scale * 2,
93 };
@ aa_scale2
Definition agg_rasterizer_scanline_aa.h:91
@ aa_mask2
Definition agg_rasterizer_scanline_aa.h:92
@ aa_mask
Definition agg_rasterizer_scanline_aa.h:90
@ aa_scale
Definition agg_rasterizer_scanline_aa.h:89
@ aa_shift
Definition agg_rasterizer_scanline_aa.h:88

◆ status

template<class Clip = rasterizer_sl_clip_int>
enum agg::rasterizer_scanline_aa::status
private
Enumerator
status_initial 
status_move_to 
status_line_to 
status_closed 
74 {
79 };
@ status_initial
Definition agg_rasterizer_scanline_aa.h:75
@ status_closed
Definition agg_rasterizer_scanline_aa.h:78
@ status_move_to
Definition agg_rasterizer_scanline_aa.h:76
@ status_line_to
Definition agg_rasterizer_scanline_aa.h:77

Constructor & Destructor Documentation

◆ rasterizer_scanline_aa() [1/3]

template<class Clip = rasterizer_sl_clip_int>
agg::rasterizer_scanline_aa< Clip >::rasterizer_scanline_aa ( )
inline
96 :
97 m_outline(),
98 m_clipper(),
100 m_auto_close(true),
101 m_start_x(0),
102 m_start_y(0),
104 {
105 int i;
106 for(i = 0; i < aa_scale; i++) m_gamma[i] = i;
107 }
filling_rule_e m_filling_rule
Definition agg_rasterizer_scanline_aa.h:275
int m_gamma[aa_scale]
Definition agg_rasterizer_scanline_aa.h:274
unsigned m_status
Definition agg_rasterizer_scanline_aa.h:279
coord_type m_start_y
Definition agg_rasterizer_scanline_aa.h:278
rasterizer_cells_aa< cell_aa > m_outline
Definition agg_rasterizer_scanline_aa.h:272
coord_type m_start_x
Definition agg_rasterizer_scanline_aa.h:277
clip_type m_clipper
Definition agg_rasterizer_scanline_aa.h:273
bool m_auto_close
Definition agg_rasterizer_scanline_aa.h:276
@ fill_non_zero
Definition agg_basics.h:263

References agg::rasterizer_scanline_aa< Clip >::aa_scale, and agg::rasterizer_scanline_aa< Clip >::m_gamma.

◆ rasterizer_scanline_aa() [2/3]

template<class Clip = rasterizer_sl_clip_int>
template<class GammaF >
agg::rasterizer_scanline_aa< Clip >::rasterizer_scanline_aa ( const GammaF &  gamma_function)
inline
111 :
112 m_outline(),
115 m_auto_close(true),
116 m_start_x(0),
117 m_start_y(0),
119 {
120 gamma(gamma_function);
121 }
void gamma(const GammaF &gamma_function)
Definition agg_rasterizer_scanline_aa.h:131

References agg::rasterizer_scanline_aa< Clip >::gamma().

+ Here is the call graph for this function:

◆ rasterizer_scanline_aa() [3/3]

template<class Clip = rasterizer_sl_clip_int>
agg::rasterizer_scanline_aa< Clip >::rasterizer_scanline_aa ( const rasterizer_scanline_aa< Clip > &  )
private

Member Function Documentation

◆ add_path()

template<class Clip = rasterizer_sl_clip_int>
template<class VertexSource >
void agg::rasterizer_scanline_aa< Clip >::add_path ( VertexSource &&  vs,
unsigned  path_id = 0 
)
inline
160 {
161 double x;
162 double y;
163
164 unsigned cmd;
165 vs.rewind(path_id);
166 if(m_outline.sorted()) reset();
167 while(!is_stop(cmd = vs.vertex(&x, &y)))
168 {
169 add_vertex(x, y, cmd);
170 }
171 }
void reset()
Definition agg_rasterizer_scanline_aa.h:296
void add_vertex(double x, double y, unsigned cmd)
Definition agg_rasterizer_scanline_aa.h:382
const Scalar & y
Definition MathFunctions.h:552
bool is_stop(unsigned c)
Definition agg_basics.h:405
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297
struct command cmd[]
Definition term.c:94

References agg::rasterizer_scanline_aa< Clip >::add_vertex(), cmd, agg::is_stop(), agg::rasterizer_scanline_aa< Clip >::m_outline, and agg::rasterizer_scanline_aa< Clip >::reset().

Referenced by Slic3r::rasterize_polygons().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ add_vertex()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::add_vertex ( double  x,
double  y,
unsigned  cmd 
)
383 {
384 if(is_move_to(cmd))
385 {
386 move_to_d(x, y);
387 }
388 else
389 if(is_vertex(cmd))
390 {
391 line_to_d(x, y);
392 }
393 else
394 if(is_close(cmd))
395 {
397 }
398 }
void line_to_d(double x, double y)
Definition agg_rasterizer_scanline_aa.h:372
void close_polygon()
Definition agg_rasterizer_scanline_aa.h:329
void move_to_d(double x, double y)
Definition agg_rasterizer_scanline_aa.h:361
bool is_close(unsigned c)
Definition agg_basics.h:447
bool is_vertex(unsigned c)
Definition agg_basics.h:393
bool is_move_to(unsigned c)
Definition agg_basics.h:411

References cmd, agg::is_close(), agg::is_move_to(), and agg::is_vertex().

Referenced by agg::rasterizer_scanline_aa< Clip >::add_path().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ apply_gamma()

template<class Clip = rasterizer_sl_clip_int>
unsigned agg::rasterizer_scanline_aa< Clip >::apply_gamma ( unsigned  cover) const
inline
142 {
143 return m_gamma[cover];
144 }

References agg::rasterizer_scanline_aa< Clip >::m_gamma.

◆ auto_close()

template<class Clip = rasterizer_sl_clip_int>
void agg::rasterizer_scanline_aa< Clip >::auto_close ( bool  flag)
inline

◆ calculate_alpha()

template<class Clip = rasterizer_sl_clip_int>
AGG_INLINE unsigned agg::rasterizer_scanline_aa< Clip >::calculate_alpha ( int  area) const
inline
186 {
187 int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift);
188
189 if(cover < 0) cover = -cover;
191 {
192 cover &= aa_mask2;
193 if(cover > aa_scale)
194 {
195 cover = aa_scale2 - cover;
196 }
197 }
198 if(cover > aa_mask) cover = aa_mask;
199 return m_gamma[cover];
200 }
@ poly_subpixel_shift
Definition agg_basics.h:255
@ fill_even_odd
Definition agg_basics.h:264
Unit area(const Cntr &poly, const PathTag &)
Definition geometry_traits.hpp:971

References agg::rasterizer_scanline_aa< Clip >::aa_mask, agg::rasterizer_scanline_aa< Clip >::aa_mask2, agg::rasterizer_scanline_aa< Clip >::aa_scale, agg::rasterizer_scanline_aa< Clip >::aa_scale2, agg::rasterizer_scanline_aa< Clip >::aa_shift, agg::fill_even_odd, agg::rasterizer_scanline_aa< Clip >::m_filling_rule, agg::rasterizer_scanline_aa< Clip >::m_gamma, and agg::poly_subpixel_shift.

Referenced by agg::rasterizer_scanline_aa< Clip >::sweep_scanline().

+ Here is the caller graph for this function:

◆ clip_box()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::clip_box ( double  x1,
double  y1,
double  x2,
double  y2 
)
313 {
314 reset();
315 m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1),
316 conv_type::upscale(x2), conv_type::upscale(y2));
317 }

◆ close_polygon()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::close_polygon
330 {
332 {
335 }
336 }

◆ edge()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::edge ( int  x1,
int  y1,
int  x2,
int  y2 
)
403 {
404 if(m_outline.sorted()) reset();
405 m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1));
406 m_clipper.line_to(m_outline,
407 conv_type::downscale(x2),
408 conv_type::downscale(y2));
410 }

◆ edge_d()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::edge_d ( double  x1,
double  y1,
double  x2,
double  y2 
)
416 {
417 if(m_outline.sorted()) reset();
418 m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1));
419 m_clipper.line_to(m_outline,
420 conv_type::upscale(x2),
421 conv_type::upscale(y2));
423 }

◆ filling_rule()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::filling_rule ( filling_rule_e  filling_rule)
305 {
307 }
void filling_rule(filling_rule_e filling_rule)
Definition agg_rasterizer_scanline_aa.h:304

◆ gamma()

template<class Clip = rasterizer_sl_clip_int>
template<class GammaF >
void agg::rasterizer_scanline_aa< Clip >::gamma ( const GammaF &  gamma_function)
inline
132 {
133 int i;
134 for(i = 0; i < aa_scale; i++)
135 {
136 m_gamma[i] = uround(gamma_function(double(i) / aa_mask) * aa_mask);
137 }
138 }
AGG_INLINE int uround(double v)
Definition agg_basics.h:192

References agg::rasterizer_scanline_aa< Clip >::aa_mask, agg::rasterizer_scanline_aa< Clip >::aa_scale, agg::rasterizer_scanline_aa< Clip >::m_gamma, and agg::uround().

Referenced by agg::rasterizer_scanline_aa< Clip >::rasterizer_scanline_aa().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hit_test()

template<class Clip >
bool agg::rasterizer_scanline_aa< Clip >::hit_test ( int  tx,
int  ty 
)
467 {
468 if(!navigate_scanline(ty)) return false;
469 scanline_hit_test sl(tx);
470 sweep_scanline(sl);
471 return sl.hit();
472 }
bool navigate_scanline(int y)
Definition agg_rasterizer_scanline_aa.h:450
bool sweep_scanline(Scanline &sl)
Definition agg_rasterizer_scanline_aa.h:203

References agg::scanline_hit_test::hit().

+ Here is the call graph for this function:

◆ line_to()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::line_to ( int  x,
int  y 
)
352 {
353 m_clipper.line_to(m_outline,
354 conv_type::downscale(x),
355 conv_type::downscale(y));
357 }

◆ line_to_d()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::line_to_d ( double  x,
double  y 
)
373 {
374 m_clipper.line_to(m_outline,
375 conv_type::upscale(x),
376 conv_type::upscale(y));
378 }

◆ max_x()

template<class Clip = rasterizer_sl_clip_int>
int agg::rasterizer_scanline_aa< Clip >::max_x ( ) const
inline
176{ return m_outline.max_x(); }

References agg::rasterizer_scanline_aa< Clip >::m_outline.

◆ max_y()

template<class Clip = rasterizer_sl_clip_int>
int agg::rasterizer_scanline_aa< Clip >::max_y ( ) const
inline
177{ return m_outline.max_y(); }

References agg::rasterizer_scanline_aa< Clip >::m_outline.

◆ min_x()

template<class Clip = rasterizer_sl_clip_int>
int agg::rasterizer_scanline_aa< Clip >::min_x ( ) const
inline
174{ return m_outline.min_x(); }

References agg::rasterizer_scanline_aa< Clip >::m_outline.

◆ min_y()

template<class Clip = rasterizer_sl_clip_int>
int agg::rasterizer_scanline_aa< Clip >::min_y ( ) const
inline
175{ return m_outline.min_y(); }

References agg::rasterizer_scanline_aa< Clip >::m_outline.

◆ move_to()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::move_to ( int  x,
int  y 
)
341 {
342 if(m_outline.sorted()) reset();
344 m_clipper.move_to(m_start_x = conv_type::downscale(x),
345 m_start_y = conv_type::downscale(y));
347 }

◆ move_to_d()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::move_to_d ( double  x,
double  y 
)
362 {
363 if(m_outline.sorted()) reset();
365 m_clipper.move_to(m_start_x = conv_type::upscale(x),
366 m_start_y = conv_type::upscale(y));
368 }

◆ navigate_scanline()

template<class Clip >
AGG_INLINE bool agg::rasterizer_scanline_aa< Clip >::navigate_scanline ( int  y)
451 {
453 m_outline.sort_cells();
454 if(m_outline.total_cells() == 0 ||
455 y < m_outline.min_y() ||
456 y > m_outline.max_y())
457 {
458 return false;
459 }
460 m_scan_y = y;
461 return true;
462 }
int m_scan_y
Definition agg_rasterizer_scanline_aa.h:280

◆ operator=()

template<class Clip = rasterizer_sl_clip_int>
const rasterizer_scanline_aa< Clip > & agg::rasterizer_scanline_aa< Clip >::operator= ( const rasterizer_scanline_aa< Clip > &  )
private

◆ reset()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::reset
297 {
298 m_outline.reset();
300 }

Referenced by agg::rasterizer_scanline_aa< Clip >::add_path(), and Slic3r::rasterize_polygons().

+ Here is the caller graph for this function:

◆ reset_clipping()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::reset_clipping
322 {
323 reset();
324 m_clipper.reset_clipping();
325 }

◆ rewind_scanlines()

template<class Clip >
AGG_INLINE bool agg::rasterizer_scanline_aa< Clip >::rewind_scanlines
436 {
438 m_outline.sort_cells();
439 if(m_outline.total_cells() == 0)
440 {
441 return false;
442 }
443 m_scan_y = m_outline.min_y();
444 return true;
445 }

◆ sort()

template<class Clip >
void agg::rasterizer_scanline_aa< Clip >::sort
428 {
430 m_outline.sort_cells();
431 }

◆ sweep_scanline()

template<class Clip = rasterizer_sl_clip_int>
template<class Scanline >
bool agg::rasterizer_scanline_aa< Clip >::sweep_scanline ( Scanline &  sl)
inline
204 {
205 for(;;)
206 {
207 if(m_scan_y > m_outline.max_y()) return false;
208 sl.reset_spans();
209 unsigned num_cells = m_outline.scanline_num_cells(m_scan_y);
210 const cell_aa* const* cells = m_outline.scanline_cells(m_scan_y);
211 int cover = 0;
212
213 while(num_cells)
214 {
215 const cell_aa* cur_cell = *cells;
216 int x = cur_cell->x;
217 int area = cur_cell->area;
218 unsigned alpha;
219
220 cover += cur_cell->cover;
221
222 //accumulate all cells with the same X
223 while(--num_cells)
224 {
225 cur_cell = *++cells;
226 if(cur_cell->x != x) break;
227 area += cur_cell->area;
228 cover += cur_cell->cover;
229 }
230
231 if(area)
232 {
233 alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area);
234 if(alpha)
235 {
236 sl.add_cell(x, alpha);
237 }
238 x++;
239 }
240
241 if(num_cells && cur_cell->x > x)
242 {
243 alpha = calculate_alpha(cover << (poly_subpixel_shift + 1));
244 if(alpha)
245 {
246 sl.add_span(x, cur_cell->x - x, alpha);
247 }
248 }
249 }
250
251 if(sl.num_spans()) break;
252 ++m_scan_y;
253 }
254
255 sl.finalize(m_scan_y);
256 ++m_scan_y;
257 return true;
258 }
AGG_INLINE unsigned calculate_alpha(int area) const
Definition agg_rasterizer_scanline_aa.h:185

References agg::cell_aa::area, agg::rasterizer_scanline_aa< Clip >::calculate_alpha(), agg::cell_aa::cover, agg::rasterizer_scanline_aa< Clip >::m_outline, agg::rasterizer_scanline_aa< Clip >::m_scan_y, agg::poly_subpixel_shift, and agg::cell_aa::x.

+ Here is the call graph for this function:

Member Data Documentation

◆ m_auto_close

template<class Clip = rasterizer_sl_clip_int>
bool agg::rasterizer_scanline_aa< Clip >::m_auto_close
private

◆ m_clipper

template<class Clip = rasterizer_sl_clip_int>
clip_type agg::rasterizer_scanline_aa< Clip >::m_clipper
private

◆ m_filling_rule

template<class Clip = rasterizer_sl_clip_int>
filling_rule_e agg::rasterizer_scanline_aa< Clip >::m_filling_rule
private

◆ m_gamma

◆ m_outline

◆ m_scan_y

template<class Clip = rasterizer_sl_clip_int>
int agg::rasterizer_scanline_aa< Clip >::m_scan_y
private

◆ m_start_x

template<class Clip = rasterizer_sl_clip_int>
coord_type agg::rasterizer_scanline_aa< Clip >::m_start_x
private

◆ m_start_y

template<class Clip = rasterizer_sl_clip_int>
coord_type agg::rasterizer_scanline_aa< Clip >::m_start_y
private

◆ m_status

template<class Clip = rasterizer_sl_clip_int>
unsigned agg::rasterizer_scanline_aa< Clip >::m_status
private

The documentation for this class was generated from the following file: