agg_renderer_markers.h

来自「这是VCF框架的代码」· C头文件 代码 · 共 707 行 · 第 1/3 页

H
707
字号
//----------------------------------------------------------------------------// Anti-Grain Geometry - Version 2.4// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)//// Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied// warranty, and with no claim as to its suitability for any purpose.////----------------------------------------------------------------------------// Contact: mcseem@antigrain.com//          mcseemagg@yahoo.com//          http://www.antigrain.com//----------------------------------------------------------------------------//// class renderer_markers////----------------------------------------------------------------------------#ifndef AGG_RENDERER_MARKERS_INCLUDED#define AGG_RENDERER_MARKERS_INCLUDED#include "agg_basics.h"#include "agg_renderer_primitives.h"namespace agg{    //---------------------------------------------------------------marker_e    enum marker_e    {        marker_square,        marker_diamond,        marker_circle,        marker_crossed_circle,        marker_semiellipse_left,        marker_semiellipse_right,        marker_semiellipse_up,        marker_semiellipse_down,        marker_triangle_left,        marker_triangle_right,        marker_triangle_up,        marker_triangle_down,        marker_four_rays,        marker_cross,        marker_x,        marker_dash,        marker_dot,        marker_pixel,                end_of_markers    };    //--------------------------------------------------------renderer_markers    template<class BaseRenderer> class renderer_markers :    public renderer_primitives<BaseRenderer>    {    public:        typedef renderer_primitives<BaseRenderer> base_type;        typedef BaseRenderer base_ren_type;        typedef typename base_ren_type::color_type color_type;        //--------------------------------------------------------------------        renderer_markers(base_ren_type& rbuf) :            base_type(rbuf)        {}        //--------------------------------------------------------------------        bool visible(int x, int y, int r) const        {            rect_i rc(x-r, y-r, x+y, y+r);            return rc.clip(base_type::ren().bounding_clip_box());          }        //--------------------------------------------------------------------        void square(int x, int y, int r)        {            if(visible(x, y, r))             {                  if(r) base_type::outlined_rectangle(x-r, y-r, x+r, y+r);                else  base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);            }        }        //--------------------------------------------------------------------        void diamond(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r)                {                    int dy = -r;                    int dx = 0;                    do                    {                        base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full);                        base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full);                        base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full);                        base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full);                                                if(dx)                        {                            base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full);                            base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full);                        }                        ++dy;                        ++dx;                    }                    while(dy <= 0);                }                else                {                    base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);                }            }        }        //--------------------------------------------------------------------        void circle(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r) base_type::outlined_ellipse(x, y, r, r);                else  base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);            }        }        //--------------------------------------------------------------------        void crossed_circle(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r)                {                    base_type::outlined_ellipse(x, y, r, r);                    int r6 = r + (r >> 1);                    if(r <= 2) r6++;                    r >>= 1;                    base_type::ren().blend_hline(x-r6, y, x-r,  base_type::line_color(), cover_full);                    base_type::ren().blend_hline(x+r,  y, x+r6, base_type::line_color(), cover_full);                    base_type::ren().blend_vline(x, y-r6, y-r,  base_type::line_color(), cover_full);                    base_type::ren().blend_vline(x, y+r,  y+r6, base_type::line_color(), cover_full);                }                else                {                    base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);                }            }        }        //------------------------------------------------------------------------        void semiellipse_left(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r)                {                    int r8 = r * 4 / 5;                    int dy = -r;                    int dx = 0;                    ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8);                    do                    {                        dx += ei.dx();                        dy += ei.dy();                                                base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full);                        base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full);                                                if(ei.dy() && dx)                        {                            base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);                        }                        ++ei;                    }                    while(dy < r8);                    base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full);                }                else                {                    base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);                }            }        }        //--------------------------------------------------------------------        void semiellipse_right(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r)                {                    int r8 = r * 4 / 5;                    int dy = -r;                    int dx = 0;                    ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8);                    do                    {                        dx += ei.dx();                        dy += ei.dy();                                                base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full);                        base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full);                                                if(ei.dy() && dx)                        {                            base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full);                        }                        ++ei;                    }                    while(dy < r8);                    base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full);                }                else                {                    base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full);                }            }        }        //--------------------------------------------------------------------        void semiellipse_up(int x, int y, int r)        {            if(visible(x, y, r))            {                if(r)                {                    int r8 = r * 4 / 5;                    int dy = -r;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?