agg_renderer_outline_aa.h

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

H
1,846
字号
                        dist1_start -= m_di.dx_start();                        dist2_start += m_di.dx_start();                        if(dist1_start < 0) ++npix;                        if(dist2_start < 0) ++npix;                        ++dy;                    }                    while(base_type::m_dist[dy] <= base_type::m_width);                    --base_type::m_step;                    if(npix == 0) break;                    npix = 0;                }                while(base_type::m_step >= -base_type::m_max_extent);            }            base_type::m_li.adjust_forward();        }        //---------------------------------------------------------------------        bool step_hor()        {            int dist_start;            int dist;            int dy;            int s1 = base_type::step_hor_base(m_di);            dist_start = m_di.dist_start();            cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2;            cover_type* p1 = p0;            *p1 = 0;            if(dist_start <= 0)            {                *p1 = (cover_type)base_type::m_ren.cover(s1);            }            ++p1;            dy = 1;            while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width)            {                dist_start -= m_di.dx_start();                *p1 = 0;                if(dist_start <= 0)                {                       *p1 = (cover_type)base_type::m_ren.cover(dist);                }                ++p1;                ++dy;            }            dy = 1;            dist_start = m_di.dist_start();            while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width)            {                dist_start += m_di.dx_start();                *--p0 = 0;                if(dist_start <= 0)                {                       *p0 = (cover_type)base_type::m_ren.cover(dist);                }                ++dy;            }            base_type::m_ren.blend_solid_vspan(base_type::m_x,                                                base_type::m_y - dy + 1,                                               unsigned(p1 - p0),                                                p0);            return ++base_type::m_step < base_type::m_count;        }        //---------------------------------------------------------------------        bool step_ver()        {            int dist_start;            int dist;            int dx;            int s1 = base_type::step_ver_base(m_di);            cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2;            cover_type* p1 = p0;            dist_start = m_di.dist_start();            *p1 = 0;            if(dist_start <= 0)            {                *p1 = (cover_type)base_type::m_ren.cover(s1);            }            ++p1;            dx = 1;            while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width)            {                dist_start += m_di.dy_start();                *p1 = 0;                if(dist_start <= 0)                {                       *p1 = (cover_type)base_type::m_ren.cover(dist);                }                ++p1;                ++dx;            }            dx = 1;            dist_start = m_di.dist_start();            while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width)            {                dist_start -= m_di.dy_start();                *--p0 = 0;                if(dist_start <= 0)                {                       *p0 = (cover_type)base_type::m_ren.cover(dist);                }                ++dx;            }            base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1,                                                base_type::m_y,                                               unsigned(p1 - p0),                                                p0);            return ++base_type::m_step < base_type::m_count;        }    private:        line_interpolator_aa1(const line_interpolator_aa1<Renderer>&);        const line_interpolator_aa1<Renderer>&             operator = (const line_interpolator_aa1<Renderer>&);        //---------------------------------------------------------------------        distance_interpolator2 m_di;     };    //====================================================line_interpolator_aa2    template<class Renderer> class line_interpolator_aa2 :    public line_interpolator_aa_base<Renderer>    {    public:        typedef Renderer renderer_type;        typedef typename Renderer::color_type color_type;        typedef line_interpolator_aa_base<Renderer> base_type;        //---------------------------------------------------------------------        line_interpolator_aa2(renderer_type& ren, const line_parameters& lp,                               int ex, int ey) :            line_interpolator_aa_base<Renderer>(ren, lp),            m_di(lp.x1, lp.y1, lp.x2, lp.y2, ex, ey,                  lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask,                 0)        {            base_type::m_li.adjust_forward();            base_type::m_step -= base_type::m_max_extent;        }        //---------------------------------------------------------------------        bool step_hor()        {            int dist_end;            int dist;            int dy;            int s1 = base_type::step_hor_base(m_di);            cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2;            cover_type* p1 = p0;            dist_end = m_di.dist_end();            int npix = 0;            *p1 = 0;            if(dist_end > 0)            {                *p1 = (cover_type)base_type::m_ren.cover(s1);                ++npix;            }            ++p1;            dy = 1;            while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width)            {                dist_end -= m_di.dx_end();                *p1 = 0;                if(dist_end > 0)                {                       *p1 = (cover_type)base_type::m_ren.cover(dist);                    ++npix;                }                ++p1;                ++dy;            }            dy = 1;            dist_end = m_di.dist_end();            while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width)            {                dist_end += m_di.dx_end();                *--p0 = 0;                if(dist_end > 0)                {                       *p0 = (cover_type)base_type::m_ren.cover(dist);                    ++npix;                }                ++dy;            }            base_type::m_ren.blend_solid_vspan(base_type::m_x,                                               base_type::m_y - dy + 1,                                                unsigned(p1 - p0),                                                p0);            return npix && ++base_type::m_step < base_type::m_count;        }        //---------------------------------------------------------------------        bool step_ver()        {            int dist_end;            int dist;            int dx;            int s1 = base_type::step_ver_base(m_di);            cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2;            cover_type* p1 = p0;            dist_end = m_di.dist_end();            int npix = 0;            *p1 = 0;            if(dist_end > 0)            {                *p1 = (cover_type)base_type::m_ren.cover(s1);                ++npix;            }            ++p1;            dx = 1;            while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width)            {                dist_end += m_di.dy_end();                *p1 = 0;                if(dist_end > 0)                {                       *p1 = (cover_type)base_type::m_ren.cover(dist);                    ++npix;                }                ++p1;                ++dx;            }            dx = 1;            dist_end = m_di.dist_end();            while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width)            {                dist_end -= m_di.dy_end();                *--p0 = 0;                if(dist_end > 0)                {                       *p0 = (cover_type)base_type::m_ren.cover(dist);                    ++npix;                }                ++dx;            }            base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1,                                               base_type::m_y,                                                unsigned(p1 - p0),                                                p0);            return npix && ++base_type::m_step < base_type::m_count;        }    private:        line_interpolator_aa2(const line_interpolator_aa2<Renderer>&);        const line_interpolator_aa2<Renderer>&             operator = (const line_interpolator_aa2<Renderer>&);        //---------------------------------------------------------------------        distance_interpolator2 m_di;     };    //====================================================line_interpolator_aa3    template<class Renderer> class line_interpolator_aa3 :    public line_interpolator_aa_base<Renderer>    {    public:        typedef Renderer renderer_type;        typedef typename Renderer::color_type color_type;        typedef line_interpolator_aa_base<Renderer> base_type;        //---------------------------------------------------------------------        line_interpolator_aa3(renderer_type& ren, const line_parameters& lp,                               int sx, int sy, int ex, int ey) :            line_interpolator_aa_base<Renderer>(ren, lp),            m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, ex, ey,                  lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask)        {            int dist1_start;            int dist2_start;            int npix = 1;            if(lp.vertical)            {                do                {                    --base_type::m_li;                    base_type::m_y -= lp.inc;                    base_type::m_x = (base_type::m_lp->x1 + base_type::m_li.y()) >> line_subpixel_shift;                    if(lp.inc > 0) m_di.dec_y(base_type::m_x - base_type::m_old_x);                    else           m_di.inc_y(base_type::m_x - base_type::m_old_x);                    base_type::m_old_x = base_type::m_x;                    dist1_start = dist2_start = m_di.dist_start();                     int dx = 0;                    if(dist1_start < 0) ++npix;                    do                    {                        dist1_start += m_di.dy_start();                        dist2_start -= m_di.dy_start();                        if(dist1_start < 0) ++npix;                        if(dist2_start < 0) ++npix;                        ++dx;                    }                    while(base_type::m_dist[dx] <= base_type::m_width);                    if(npix == 0) break;                    npix = 0;                }                while(--base_type::m_step >= -base_type::m_max_extent);            }            else            {                do                {                    --base_type::m_li;                    base_type::m_x -= lp.inc;                    base_type::m_y = (base_type::m_lp->y1 + base_type::m_li.y()) >> line_subpixel_shift;                    if(lp.inc > 0) m_di.dec_x(base_type::m_y - base_type::m_old_y);                    else           m_di.inc_x(base_type::m_y - base_type::m_old_y);                    base_type::m_old_y = base_type::m_y;                    dist1_start = dist2_start = m_di.dist_start();                     int dy = 0;                    if(dist1_start < 0) ++npix;                    do                    {                        dist1_start -= m_di.dx_start();                        dist2_start += m_di.dx_start();                        if(dist1_start < 0) ++npix;                        if(dist2_start < 0) ++npix;                        ++dy;                    }                    while(base_type::m_dist[dy] <= base_type::m_width);                    if(npix == 0) break;                    npix = 0;                }                while(--base_type::m_step >= -base_type::m_max_extent);            }            base_type::m_li.adjust_forward();

⌨️ 快捷键说明

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