agg_renderer_base.h

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

H
551
字号
            {                len = xmax() - x + 1;                if(len <= 0) return;            }            m_ren->blend_solid_hspan(x, y, len, c, covers);        }        //--------------------------------------------------------------------        void blend_solid_vspan(int x, int y, int len,                                const color_type& c,                                const cover_type* covers)        {            if(x > xmax()) return;            if(x < xmin()) return;            if(y < ymin())            {                len -= ymin() - y;                if(len <= 0) return;                covers += ymin() - y;                y = ymin();            }            if(y + len > ymax())            {                len = ymax() - y + 1;                if(len <= 0) return;            }            m_ren->blend_solid_vspan(x, y, len, c, covers);        }        //--------------------------------------------------------------------        void copy_color_hspan(int x, int y, int len, const color_type* colors)        {            if(y > ymax()) return;            if(y < ymin()) return;            if(x < xmin())            {                int d = xmin() - x;                len -= d;                if(len <= 0) return;                colors += d;                x = xmin();            }            if(x + len > xmax())            {                len = xmax() - x + 1;                if(len <= 0) return;            }            m_ren->copy_color_hspan(x, y, len, colors);        }        //--------------------------------------------------------------------        void blend_color_hspan(int x, int y, int len,                                const color_type* colors,                                const cover_type* covers,                               cover_type cover = agg::cover_full)        {            if(y > ymax()) return;            if(y < ymin()) return;            if(x < xmin())            {                int d = xmin() - x;                len -= d;                if(len <= 0) return;                if(covers) covers += d;                colors += d;                x = xmin();            }            if(x + len > xmax())            {                len = xmax() - x + 1;                if(len <= 0) return;            }            m_ren->blend_color_hspan(x, y, len, colors, covers, cover);        }        //--------------------------------------------------------------------        void blend_color_vspan(int x, int y, int len,                                const color_type* colors,                                const cover_type* covers,                               cover_type cover = agg::cover_full)        {            if(x > xmax()) return;            if(x < xmin()) return;            if(y < ymin())            {                int d = ymin() - y;                len -= d;                if(len <= 0) return;                if(covers) covers += d;                colors += d;                y = ymin();            }            if(y + len > ymax())            {                len = ymax() - y + 1;                if(len <= 0) return;            }            m_ren->blend_color_vspan(x, y, len, colors, covers, cover);        }        //--------------------------------------------------------------------        rect_i clip_rect_area(rect_i& dst, rect_i& src, int wsrc, int hsrc) const        {            rect_i rc(0,0,0,0);            rect_i cb = clip_box();            ++cb.x2;            ++cb.y2;            if(src.x1 < 0)            {                dst.x1 -= src.x1;                src.x1 = 0;            }            if(src.y1 < 0)            {                dst.y1 -= src.y1;                src.y1 = 0;            }            if(src.x2 > wsrc) src.x2 = wsrc;            if(src.y2 > hsrc) src.y2 = hsrc;            if(dst.x1 < cb.x1)            {                src.x1 += cb.x1 - dst.x1;                dst.x1 = cb.x1;            }            if(dst.y1 < cb.y1)            {                src.y1 += cb.y1 - dst.y1;                dst.y1 = cb.y1;            }            if(dst.x2 > cb.x2) dst.x2 = cb.x2;            if(dst.y2 > cb.y2) dst.y2 = cb.y2;            rc.x2 = dst.x2 - dst.x1;            rc.y2 = dst.y2 - dst.y1;            if(rc.x2 > src.x2 - src.x1) rc.x2 = src.x2 - src.x1;            if(rc.y2 > src.y2 - src.y1) rc.y2 = src.y2 - src.y1;            return rc;        }        //--------------------------------------------------------------------        template<class RenBuf>        void copy_from(const RenBuf& src,                        const rect_i* rect_src_ptr = 0,                        int dx = 0,                        int dy = 0)        {            rect_i rsrc(0, 0, src.width(), src.height());            if(rect_src_ptr)            {                rsrc.x1 = rect_src_ptr->x1;                 rsrc.y1 = rect_src_ptr->y1;                rsrc.x2 = rect_src_ptr->x2 + 1;                rsrc.y2 = rect_src_ptr->y2 + 1;            }            // Version with xdst, ydst (absolute positioning)            //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1);            // Version with dx, dy (relative positioning)            rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy);            rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height());            if(rc.x2 > 0)            {                int incy = 1;                if(rdst.y1 > rsrc.y1)                {                    rsrc.y1 += rc.y2 - 1;                    rdst.y1 += rc.y2 - 1;                    incy = -1;                }                while(rc.y2 > 0)                {                    m_ren->copy_from(src,                                      rdst.x1, rdst.y1,                                     rsrc.x1, rsrc.y1,                                     rc.x2);                    rdst.y1 += incy;                    rsrc.y1 += incy;                    --rc.y2;                }            }        }        //--------------------------------------------------------------------        template<class SrcPixelFormatRenderer>        void blend_from(const SrcPixelFormatRenderer& src,                         const rect_i* rect_src_ptr = 0,                         int dx = 0,                         int dy = 0,                        cover_type cover = agg::cover_full)        {            rect_i rsrc(0, 0, src.width(), src.height());            if(rect_src_ptr)            {                rsrc.x1 = rect_src_ptr->x1;                 rsrc.y1 = rect_src_ptr->y1;                rsrc.x2 = rect_src_ptr->x2 + 1;                rsrc.y2 = rect_src_ptr->y2 + 1;            }            // Version with xdst, ydst (absolute positioning)            //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1);            // Version with dx, dy (relative positioning)            rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy);            rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height());            if(rc.x2 > 0)            {                int incy = 1;                if(rdst.y1 > rsrc.y1)                {                    rsrc.y1 += rc.y2 - 1;                    rdst.y1 += rc.y2 - 1;                    incy = -1;                }                while(rc.y2 > 0)                {                    typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1);                    if(rw.ptr)                    {                        int x1src = rsrc.x1;                        int x1dst = rdst.x1;                        int len   = rc.x2;                        if(rw.x1 > x1src)                        {                            x1dst += rw.x1 - x1src;                            len   -= rw.x1 - x1src;                            x1src  = rw.x1;                        }                        if(len > 0)                        {                            if(x1src + len-1 > rw.x2)                            {                                len -= x1src + len - rw.x2 - 1;                            }                            if(len > 0)                            {                                m_ren->blend_from(src,                                                  x1dst, rdst.y1,                                                  x1src, rsrc.y1,                                                  len,                                                  cover);                            }                        }                    }                    rdst.y1 += incy;                    rsrc.y1 += incy;                    --rc.y2;                }            }        }    private:        pixfmt_type* m_ren;        rect_i       m_clip_box;    };}#endif

⌨️ 快捷键说明

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