20 #ifndef AGG_RENDERER_MARKERS_INCLUDED 21 #define AGG_RENDERER_MARKERS_INCLUDED 23 #include "agg_basics.h" 24 #include "agg_renderer_primitives.h" 35 marker_crossed_circle,
36 marker_semiellipse_left,
37 marker_semiellipse_right,
38 marker_semiellipse_up,
39 marker_semiellipse_down,
41 marker_triangle_right,
62 typedef BaseRenderer base_ren_type;
63 typedef typename base_ren_type::color_type color_type;
71 bool visible(
int x,
int y,
int r)
const 73 rect_i rc(x-r, y-r, x+y, y+r);
74 return rc.clip(base_type::ren().bounding_clip_box());
78 void square(
int x,
int y,
int r)
82 if(r) base_type::outlined_rectangle(x-r, y-r, x+r, y+r);
83 else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
88 void diamond(
int x,
int y,
int r)
98 base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full);
99 base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full);
100 base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full);
101 base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full);
105 base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full);
106 base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full);
115 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
121 void circle(
int x,
int y,
int r)
125 if(r) base_type::outlined_ellipse(x, y, r, r);
126 else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
133 void crossed_circle(
int x,
int y,
int r)
139 base_type::outlined_ellipse(x, y, r, r);
140 int r6 = r + (r >> 1);
143 base_type::ren().blend_hline(x-r6, y, x-r, base_type::line_color(), cover_full);
144 base_type::ren().blend_hline(x+r, y, x+r6, base_type::line_color(), cover_full);
145 base_type::ren().blend_vline(x, y-r6, y-r, base_type::line_color(), cover_full);
146 base_type::ren().blend_vline(x, y+r, y+r6, base_type::line_color(), cover_full);
150 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
157 void semiellipse_left(
int x,
int y,
int r)
172 base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full);
173 base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full);
177 base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
182 base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full);
186 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
193 void semiellipse_right(
int x,
int y,
int r)
208 base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full);
209 base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full);
213 base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
218 base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full);
222 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
229 void semiellipse_up(
int x,
int y,
int r)
244 base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full);
245 base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full);
249 base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full);
254 base_type::ren().blend_hline(x-dx, y-dy-1, x+dx, base_type::line_color(), cover_full);
258 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
265 void semiellipse_down(
int x,
int y,
int r)
280 base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full);
281 base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full);
285 base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full);
290 base_type::ren().blend_hline(x-dx, y+dy+1, x+dx, base_type::line_color(), cover_full);
294 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
301 void triangle_left(
int x,
int y,
int r)
313 base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full);
314 base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full);
318 base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
325 base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full);
329 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
336 void triangle_right(
int x,
int y,
int r)
348 base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full);
349 base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full);
353 base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
360 base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full);
364 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
371 void triangle_up(
int x,
int y,
int r)
383 base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full);
384 base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full);
388 base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full);
395 base_type::ren().blend_hline(x-dx, y-dy, x+dx, base_type::line_color(), cover_full);
399 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
406 void triangle_down(
int x,
int y,
int r)
418 base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full);
419 base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full);
423 base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full);
430 base_type::ren().blend_hline(x-dx, y+dy, x+dx, base_type::line_color(), cover_full);
434 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
441 void four_rays(
int x,
int y,
int r)
453 base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full);
454 base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full);
455 base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full);
456 base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full);
457 base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full);
458 base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full);
459 base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full);
460 base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full);
464 base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full);
465 base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full);
466 base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
467 base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);
474 base_type::solid_rectangle(x+r3+1, y+r3+1, x-r3-1, y-r3-1);
478 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
485 void cross(
int x,
int y,
int r)
491 base_type::ren().blend_vline(x, y-r, y+r, base_type::line_color(), cover_full);
492 base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full);
496 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
503 void xing(
int x,
int y,
int r)
509 int dy = -r * 7 / 10;
512 base_type::ren().blend_pixel(x + dy, y + dy, base_type::line_color(), cover_full);
513 base_type::ren().blend_pixel(x - dy, y + dy, base_type::line_color(), cover_full);
514 base_type::ren().blend_pixel(x + dy, y - dy, base_type::line_color(), cover_full);
515 base_type::ren().blend_pixel(x - dy, y - dy, base_type::line_color(), cover_full);
520 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
526 void dash(
int x,
int y,
int r)
530 if(r) base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full);
531 else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
537 void dot(
int x,
int y,
int r)
541 if(r) base_type::solid_ellipse(x, y, r, r);
542 else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
547 void pixel(
int x,
int y,
int)
549 base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);
553 void marker(
int x,
int y,
int r, marker_e type)
557 case marker_square: square(x, y, r);
break;
558 case marker_diamond: diamond(x, y, r);
break;
559 case marker_circle: circle(x, y, r);
break;
560 case marker_crossed_circle: crossed_circle(x, y, r);
break;
561 case marker_semiellipse_left: semiellipse_left(x, y, r);
break;
562 case marker_semiellipse_right: semiellipse_right(x, y, r);
break;
563 case marker_semiellipse_up: semiellipse_up(x, y, r);
break;
564 case marker_semiellipse_down: semiellipse_down(x, y, r);
break;
565 case marker_triangle_left: triangle_left(x, y, r);
break;
566 case marker_triangle_right: triangle_right(x, y, r);
break;
567 case marker_triangle_up: triangle_up(x, y, r);
break;
568 case marker_triangle_down: triangle_down(x, y, r);
break;
569 case marker_four_rays: four_rays(x, y, r);
break;
570 case marker_cross: cross(x, y, r);
break;
571 case marker_x: xing(x, y, r);
break;
572 case marker_dash: dash(x, y, r);
break;
573 case marker_dot: dot(x, y, r);
break;
574 case marker_pixel: pixel(x, y, r);
break;
575 case end_of_markers:
break;
582 void markers(
int n,
const T* x,
const T* y, T r, marker_e type)
589 base_type::ren().blend_pixel(
int(*x),
int(*y), base_type::fill_color(), cover_full);
599 case marker_square:
do { square (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
600 case marker_diamond:
do { diamond (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
601 case marker_circle:
do { circle (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
602 case marker_crossed_circle:
do { crossed_circle (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
603 case marker_semiellipse_left:
do { semiellipse_left (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
604 case marker_semiellipse_right:
do { semiellipse_right(
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
605 case marker_semiellipse_up:
do { semiellipse_up (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
606 case marker_semiellipse_down:
do { semiellipse_down (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
607 case marker_triangle_left:
do { triangle_left (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
608 case marker_triangle_right:
do { triangle_right (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
609 case marker_triangle_up:
do { triangle_up (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
610 case marker_triangle_down:
do { triangle_down (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
611 case marker_four_rays:
do { four_rays (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
612 case marker_cross:
do { cross (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
613 case marker_x:
do { xing (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
614 case marker_dash:
do { dash (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
615 case marker_dot:
do { dot (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
616 case marker_pixel:
do { pixel (
int(*x),
int(*y),
int(r)); ++x; ++y; }
while(--n);
break;
617 case end_of_markers:
break;
623 void markers(
int n,
const T* x,
const T* y,
const T* r, marker_e type)
628 case marker_square:
do { square (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
629 case marker_diamond:
do { diamond (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
630 case marker_circle:
do { circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
631 case marker_crossed_circle:
do { crossed_circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
632 case marker_semiellipse_left:
do { semiellipse_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
633 case marker_semiellipse_right:
do { semiellipse_right(
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
634 case marker_semiellipse_up:
do { semiellipse_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
635 case marker_semiellipse_down:
do { semiellipse_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
636 case marker_triangle_left:
do { triangle_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
637 case marker_triangle_right:
do { triangle_right (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
638 case marker_triangle_up:
do { triangle_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
639 case marker_triangle_down:
do { triangle_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
640 case marker_four_rays:
do { four_rays (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
641 case marker_cross:
do { cross (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
642 case marker_x:
do { xing (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
643 case marker_dash:
do { dash (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
644 case marker_dot:
do { dot (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
645 case marker_pixel:
do { pixel (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; }
while(--n);
break;
646 case end_of_markers:
break;
652 void markers(
int n,
const T* x,
const T* y,
const T* r,
const color_type* fc, marker_e type)
657 case marker_square:
do { base_type::fill_color(*fc); square (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
658 case marker_diamond:
do { base_type::fill_color(*fc); diamond (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
659 case marker_circle:
do { base_type::fill_color(*fc); circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
660 case marker_crossed_circle:
do { base_type::fill_color(*fc); crossed_circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
661 case marker_semiellipse_left:
do { base_type::fill_color(*fc); semiellipse_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
662 case marker_semiellipse_right:
do { base_type::fill_color(*fc); semiellipse_right(
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
663 case marker_semiellipse_up:
do { base_type::fill_color(*fc); semiellipse_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
664 case marker_semiellipse_down:
do { base_type::fill_color(*fc); semiellipse_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
665 case marker_triangle_left:
do { base_type::fill_color(*fc); triangle_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
666 case marker_triangle_right:
do { base_type::fill_color(*fc); triangle_right (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
667 case marker_triangle_up:
do { base_type::fill_color(*fc); triangle_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
668 case marker_triangle_down:
do { base_type::fill_color(*fc); triangle_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
669 case marker_four_rays:
do { base_type::fill_color(*fc); four_rays (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
670 case marker_cross:
do { base_type::fill_color(*fc); cross (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
671 case marker_x:
do { base_type::fill_color(*fc); xing (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
672 case marker_dash:
do { base_type::fill_color(*fc); dash (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
673 case marker_dot:
do { base_type::fill_color(*fc); dot (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
674 case marker_pixel:
do { base_type::fill_color(*fc); pixel (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; }
while(--n);
break;
675 case end_of_markers:
break;
681 void markers(
int n,
const T* x,
const T* y,
const T* r,
const color_type* fc,
const color_type* lc, marker_e type)
686 case marker_square:
do { base_type::fill_color(*fc); base_type::line_color(*lc); square (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
687 case marker_diamond:
do { base_type::fill_color(*fc); base_type::line_color(*lc); diamond (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
688 case marker_circle:
do { base_type::fill_color(*fc); base_type::line_color(*lc); circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
689 case marker_crossed_circle:
do { base_type::fill_color(*fc); base_type::line_color(*lc); crossed_circle (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
690 case marker_semiellipse_left:
do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
691 case marker_semiellipse_right:
do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_right(
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
692 case marker_semiellipse_up:
do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
693 case marker_semiellipse_down:
do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
694 case marker_triangle_left:
do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_left (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
695 case marker_triangle_right:
do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_right (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
696 case marker_triangle_up:
do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_up (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
697 case marker_triangle_down:
do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_down (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
698 case marker_four_rays:
do { base_type::fill_color(*fc); base_type::line_color(*lc); four_rays (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
699 case marker_cross:
do { base_type::fill_color(*fc); base_type::line_color(*lc); cross (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
700 case marker_x:
do { base_type::fill_color(*fc); base_type::line_color(*lc); xing (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
701 case marker_dash:
do { base_type::fill_color(*fc); base_type::line_color(*lc); dash (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
702 case marker_dot:
do { base_type::fill_color(*fc); base_type::line_color(*lc); dot (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
703 case marker_pixel:
do { base_type::fill_color(*fc); base_type::line_color(*lc); pixel (
int(*x),
int(*y),
int(*r)); ++x; ++y; ++r; ++fc; ++lc; }
while(--n);
break;
704 case end_of_markers:
break;