agg_pixfmt_gray.h

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

H
586
字号
        }        //--------------------------------------------------------------------        void blend_vline(int x, int y,                         unsigned len,                          const color_type& c,                         int8u cover)        {            if (c.a)            {                value_type* p;                calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;                if(alpha == base_mask)                {                    do                    {                        p = (value_type*)                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                        *p = c.v;                     }                    while(--len);                }                else                {                    do                    {                        p = (value_type*)                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                        Blender::blend_pix(p, c.v, alpha, cover);                    }                    while(--len);                }            }        }        //--------------------------------------------------------------------        void blend_solid_hspan(int x, int y,                               unsigned len,                                const color_type& c,                               const int8u* covers)        {            if (c.a)            {                value_type* p = (value_type*)                    m_rbuf->row_ptr(x, y, len) + x * Step + Offset;                do                 {                    calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;                    if(alpha == base_mask)                    {                        *p = c.v;                    }                    else                    {                        Blender::blend_pix(p, c.v, alpha, *covers);                    }                    p += Step;                    ++covers;                }                while(--len);            }        }        //--------------------------------------------------------------------        void blend_solid_vspan(int x, int y,                               unsigned len,                                const color_type& c,                               const int8u* covers)        {            if (c.a)            {                do                 {                    calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;                    value_type* p = (value_type*)                        m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                    if(alpha == base_mask)                    {                        *p = c.v;                    }                    else                    {                        Blender::blend_pix(p, c.v, alpha, *covers);                    }                    ++covers;                }                while(--len);            }        }        //--------------------------------------------------------------------        void copy_color_hspan(int x, int y,                              unsigned len,                               const color_type* colors)        {            value_type* p = (value_type*)                m_rbuf->row_ptr(x, y, len) + x * Step + Offset;            do             {                *p++ = colors->v;                ++colors;            }            while(--len);        }        //--------------------------------------------------------------------        void blend_color_hspan(int x, int y,                               unsigned len,                                const color_type* colors,                               const int8u* covers,                               int8u cover)        {            value_type* p = (value_type*)                m_rbuf->row_ptr(x, y, len) + x * Step + Offset;            if(covers)            {                do                 {                    copy_or_blend_pix(p, *colors++, *covers++);                    p += Step;                }                while(--len);            }            else            {                if(cover == 255)                {                    do                     {                        if(colors->a == base_mask)                        {                            *p = colors->v;                        }                        else                        {                            copy_or_blend_pix(p, *colors);                        }                        p += Step;                        ++colors;                    }                    while(--len);                }                else                {                    do                     {                        copy_or_blend_pix(p, *colors++, cover);                        p += Step;                    }                    while(--len);                }            }        }        //--------------------------------------------------------------------        void blend_color_vspan(int x, int y,                               unsigned len,                                const color_type* colors,                               const int8u* covers,                               int8u cover)        {            value_type* p;            if(covers)            {                do                 {                    p = (value_type*)                        m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                    copy_or_blend_pix(p, *colors++, *covers++);                }                while(--len);            }            else            {                if(cover == 255)                {                    do                     {                        p = (value_type*)                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                        if(colors->a == base_mask)                        {                            *p = colors->v;                        }                        else                        {                            copy_or_blend_pix(p, *colors);                        }                        ++colors;                    }                    while(--len);                }                else                {                    do                     {                        p = (value_type*)                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;                        copy_or_blend_pix(p, *colors++, cover);                    }                    while(--len);                }            }        }        //--------------------------------------------------------------------        template<class Function> void for_each_pixel(Function f)        {            unsigned y;            for(y = 0; y < height(); ++y)            {                row_data r = m_rbuf->row(y);                if(r.ptr)                {                    unsigned len = r.x2 - r.x1 + 1;                    value_type* p = (value_type*)                        m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset;                    do                    {                        f(p);                        p += Step;                    }                    while(--len);                }            }        }        //--------------------------------------------------------------------        template<class GammaLut> void apply_gamma_dir(const GammaLut& g)        {            for_each_pixel(apply_gamma_dir_gray<color_type, GammaLut>(g));        }        //--------------------------------------------------------------------        template<class GammaLut> void apply_gamma_inv(const GammaLut& g)        {            for_each_pixel(apply_gamma_inv_gray<color_type, GammaLut>(g));        }        //--------------------------------------------------------------------        template<class RenBuf2>        void copy_from(const RenBuf2& from,                        int xdst, int ydst,                       int xsrc, int ysrc,                       unsigned len)        {            const int8u* p = from.row_ptr(ysrc);            if(p)            {                memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,                         p + xsrc * pix_width,                         len * pix_width);            }        }    private:        rbuf_type* m_rbuf;    };    typedef blender_gray<gray8>      blender_gray8;    typedef blender_gray_pre<gray8>  blender_gray8_pre;    typedef blender_gray<gray16>     blender_gray16;    typedef blender_gray_pre<gray16> blender_gray16_pre;    typedef pixfmt_alpha_blend_gray<blender_gray8,      rendering_buffer> pixfmt_gray8;      //----pixfmt_gray8    typedef pixfmt_alpha_blend_gray<blender_gray8_pre,  rendering_buffer> pixfmt_gray8_pre;  //----pixfmt_gray8_pre    typedef pixfmt_alpha_blend_gray<blender_gray16,     rendering_buffer> pixfmt_gray16;     //----pixfmt_gray16    typedef pixfmt_alpha_blend_gray<blender_gray16_pre, rendering_buffer> pixfmt_gray16_pre; //----pixfmt_gray16_pre}#endif

⌨️ 快捷键说明

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