agg_renderer_outline_aa.h

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

H
1,846
字号
            while(dy < 0);            semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y+dy0, x+dx0);        }        //-------------------------------------------------------------------------        void pie_hline(int xc, int yc, int xp1, int yp1, int xp2, int yp2,                        int xh1, int yh1, int xh2)        {            if(m_clipping && clipping_flags(xc, yc, m_clip_box)) return;                       cover_type covers[line_interpolator_aa_base<self_type>::max_half_width * 2 + 4];            cover_type* p0 = covers;            cover_type* p1 = covers;            int x = xh1 << line_subpixel_shift;            int y = yh1 << line_subpixel_shift;            int w = subpixel_width();            distance_interpolator00 di(xc, yc, xp1, yp1, xp2, yp2, x, y);            x += line_subpixel_scale/2;            y += line_subpixel_scale/2;            int xh0 = xh1;            int dx = x - xc;            int dy = y - yc;            do            {                int d = int(fast_sqrt(dx*dx + dy*dy));                *p1 = 0;                if(di.dist1() <= 0 && di.dist2() > 0 && d <= w)                {                    *p1 = (cover_type)cover(d);                }                ++p1;                dx += line_subpixel_scale;                di.inc_x();            }            while(++xh1 <= xh2);            m_ren->blend_solid_hspan(xh0, yh1,                                      unsigned(p1 - p0),                                      color(),                                      p0);        }        //-------------------------------------------------------------------------        void pie(int xc, int yc, int x1, int y1, int x2, int y2)        {            int r = ((subpixel_width() + line_subpixel_mask) >> line_subpixel_shift);            if(r < 1) r = 1;            ellipse_bresenham_interpolator ei(r, r);            int dx = 0;            int dy = -r;            int dy0 = dy;            int dx0 = dx;            int x = xc >> line_subpixel_shift;            int y = yc >> line_subpixel_shift;            do            {                dx += ei.dx();                dy += ei.dy();                if(dy != dy0)                {                    pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0);                    pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y-dy0, x+dx0);                }                dx0 = dx;                dy0 = dy;                ++ei;            }            while(dy < 0);            pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0);        }        //-------------------------------------------------------------------------        void line0_no_clip(const line_parameters& lp)        {            if(lp.len > line_max_length)            {                line_parameters lp1, lp2;                lp.divide(lp1, lp2);                line0_no_clip(lp1);                line0_no_clip(lp2);                return;            }            line_interpolator_aa0<self_type> li(*this, lp);            if(li.count())            {                if(li.vertical())                {                    while(li.step_ver());                }                else                {                    while(li.step_hor());                }            }        }        //-------------------------------------------------------------------------        void line0(const line_parameters& lp)        {            if(m_clipping)            {                int x1 = lp.x1;                int y1 = lp.y1;                int x2 = lp.x2;                int y2 = lp.y2;                unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box);                if((flags & 4) == 0)                {                    if(flags)                    {                        line_parameters lp2(x1, y1, x2, y2,                                            uround(calc_distance(x1, y1, x2, y2)));                        line0_no_clip(lp2);                    }                    else                    {                        line0_no_clip(lp);                    }                }            }            else            {                line0_no_clip(lp);            }        }        //-------------------------------------------------------------------------        void line1_no_clip(const line_parameters& lp, int sx, int sy)        {            if(lp.len > line_max_length)            {                line_parameters lp1, lp2;                lp.divide(lp1, lp2);                line1_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1);                line1_no_clip(lp2, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1));                return;            }            fix_degenerate_bisectrix_start(lp, &sx, &sy);            line_interpolator_aa1<self_type> li(*this, lp, sx, sy);            if(li.vertical())            {                while(li.step_ver());            }            else            {                while(li.step_hor());            }        }        //-------------------------------------------------------------------------        void line1(const line_parameters& lp, int sx, int sy)        {            if(m_clipping)            {                int x1 = lp.x1;                int y1 = lp.y1;                int x2 = lp.x2;                int y2 = lp.y2;                unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box);                if((flags & 4) == 0)                {                    if(flags)                    {                        line_parameters lp2(x1, y1, x2, y2,                                            uround(calc_distance(x1, y1, x2, y2)));                        if(flags & 1)                        {                            sx = x1 + (y2 - y1);                             sy = y1 - (x2 - x1);                        }                        else                        {                            while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)                            {                                sx = (lp.x1 + sx) >> 1;                                sy = (lp.y1 + sy) >> 1;                            }                        }                        line1_no_clip(lp2, sx, sy);                    }                    else                    {                        line1_no_clip(lp, sx, sy);                    }                }            }            else            {                line1_no_clip(lp, sx, sy);            }        }        //-------------------------------------------------------------------------        void line2_no_clip(const line_parameters& lp, int ex, int ey)        {            if(lp.len > line_max_length)            {                line_parameters lp1, lp2;                lp.divide(lp1, lp2);                line2_no_clip(lp1, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1));                line2_no_clip(lp2, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1);                return;            }            fix_degenerate_bisectrix_end(lp, &ex, &ey);            line_interpolator_aa2<self_type> li(*this, lp, ex, ey);            if(li.vertical())            {                while(li.step_ver());            }            else            {                while(li.step_hor());            }        }        //-------------------------------------------------------------------------        void line2(const line_parameters& lp, int ex, int ey)        {            if(m_clipping)            {                int x1 = lp.x1;                int y1 = lp.y1;                int x2 = lp.x2;                int y2 = lp.y2;                unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box);                if((flags & 4) == 0)                {                    if(flags)                    {                        line_parameters lp2(x1, y1, x2, y2,                                            uround(calc_distance(x1, y1, x2, y2)));                        if(flags & 2)                        {                            ex = x2 + (y2 - y1);                             ey = y2 - (x2 - x1);                        }                        else                        {                            while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len)                            {                                ex = (lp.x2 + ex) >> 1;                                ey = (lp.y2 + ey) >> 1;                            }                        }                        line2_no_clip(lp2, ex, ey);                    }                    else                    {                        line2_no_clip(lp, ex, ey);                    }                }            }            else            {                line2_no_clip(lp, ex, ey);            }        }        //-------------------------------------------------------------------------        void line3_no_clip(const line_parameters& lp,                            int sx, int sy, int ex, int ey)        {            if(lp.len > line_max_length)            {                line_parameters lp1, lp2;                lp.divide(lp1, lp2);                int mx = lp1.x2 + (lp1.y2 - lp1.y1);                int my = lp1.y2 - (lp1.x2 - lp1.x1);                line3_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1, mx, my);                line3_no_clip(lp2, mx, my, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1);                return;            }            fix_degenerate_bisectrix_start(lp, &sx, &sy);            fix_degenerate_bisectrix_end(lp, &ex, &ey);            line_interpolator_aa3<self_type> li(*this, lp, sx, sy, ex, ey);            if(li.vertical())            {                while(li.step_ver());            }            else            {                while(li.step_hor());            }        }        //-------------------------------------------------------------------------        void line3(const line_parameters& lp,                    int sx, int sy, int ex, int ey)        {            if(m_clipping)            {                int x1 = lp.x1;                int y1 = lp.y1;                int x2 = lp.x2;                int y2 = lp.y2;                unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box);                if((flags & 4) == 0)                {                    if(flags)                    {                        line_parameters lp2(x1, y1, x2, y2,                                            uround(calc_distance(x1, y1, x2, y2)));                        if(flags & 1)                        {                            sx = x1 + (y2 - y1);                             sy = y1 - (x2 - x1);                        }                        else                        {                            while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)                            {                                sx = (lp.x1 + sx) >> 1;                                sy = (lp.y1 + sy) >> 1;                            }                        }                        if(flags & 2)                        {                            ex = x2 + (y2 - y1);                             ey = y2 - (x2 - x1);                        }                        else                        {                            while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len)                            {                                ex = (lp.x2 + ex) >> 1;                                ey = (lp.y2 + ey) >> 1;                            }                        }                        line3_no_clip(lp2, sx, sy, ex, ey);                    }                    else                    {                        line3_no_clip(lp, sx, sy, ex, ey);                    }                }            }            else            {                line3_no_clip(lp, sx, sy, ex, ey);            }        }    private:        base_ren_type*         m_ren;        const line_profile_aa* m_profile;         color_type             m_color;        rect_i                 m_clip_box;        bool                   m_clipping;    };}#endif

⌨️ 快捷键说明

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