agg_pixfmt_rgba32.h

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

H
438
字号
            {                int alpha = int(*covers++) * c.a;                if(alpha)                {                    if(alpha == 255*255)                    {                        p[Order::R] = (int8u)c.r;                        p[Order::G] = (int8u)c.g;                        p[Order::B] = (int8u)c.b;                        p[Order::A] = (int8u)c.a;                    }                    else                    {                        int r = p[Order::R];                        int g = p[Order::G];                        int b = p[Order::B];                        int a = p[Order::A];                        p[Order::R] = (int8u)((((c.r - r) * alpha) + (r << 16)) >> 16);                        p[Order::G] = (int8u)((((c.g - g) * alpha) + (g << 16)) >> 16);                        p[Order::B] = (int8u)((((c.b - b) * alpha) + (b << 16)) >> 16);                        p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8);                    }                }                p += 4;            }            while(--len);        }        //--------------------------------------------------------------------        void blend_solid_vspan(int x, int y, unsigned len,                                const color_type& c, const int8u* covers)        {            int8u* p = m_rbuf->row(y) + (x << 2);            do             {                int alpha = int(*covers++) * c.a;                if(alpha)                {                    if(alpha == 255*255)                    {                        p[Order::R] = (int8u)c.r;                        p[Order::G] = (int8u)c.g;                        p[Order::B] = (int8u)c.b;                        p[Order::A] = (int8u)c.a;                    }                    else                    {                        int r = p[Order::R];                        int g = p[Order::G];                        int b = p[Order::B];                        int a = p[Order::A];                        p[Order::R] = (int8u)((((c.r - r) * alpha) + (r << 16)) >> 16);                        p[Order::G] = (int8u)((((c.g - g) * alpha) + (g << 16)) >> 16);                        p[Order::B] = (int8u)((((c.b - b) * alpha) + (b << 16)) >> 16);                        p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8);                    }                }                p += m_rbuf->stride();            }            while(--len);        }        //--------------------------------------------------------------------        void blend_color_hspan(int x, int y, unsigned len,                                const color_type* colors, const int8u* covers)        {            int8u* p = m_rbuf->row(y) + (x << 2);            if(covers)            {                do                 {                    int alpha = int(*covers++) * colors->a;                    if(alpha)                    {                        if(alpha == 255*255)                        {                            p[Order::R] = (int8u)colors->r;                            p[Order::G] = (int8u)colors->g;                            p[Order::B] = (int8u)colors->b;                            p[Order::A] = (int8u)colors->a;                        }                        else                        {                            int r = p[Order::R];                            int g = p[Order::G];                            int b = p[Order::B];                            int a = p[Order::A];                            p[Order::R] = (int8u)((((colors->r - r) * alpha) + (r << 16)) >> 16);                            p[Order::G] = (int8u)((((colors->g - g) * alpha) + (g << 16)) >> 16);                            p[Order::B] = (int8u)((((colors->b - b) * alpha) + (b << 16)) >> 16);                            p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8);                        }                    }                    p += 4;                    ++colors;                }                while(--len);            }            else            {                do                 {                    if(colors->a)                    {                        if(colors->a == 255)                        {                            p[Order::R] = (int8u)colors->r;                            p[Order::G] = (int8u)colors->g;                            p[Order::B] = (int8u)colors->b;                            p[Order::A] = (int8u)colors->a;                        }                        else                        {                            int r = p[Order::R];                            int g = p[Order::G];                            int b = p[Order::B];                            int a = p[Order::A];                            p[Order::R] = (int8u)((((colors->r - r) * colors->a) + (r << 8)) >> 8);                            p[Order::G] = (int8u)((((colors->g - g) * colors->a) + (g << 8)) >> 8);                            p[Order::B] = (int8u)((((colors->b - b) * colors->a) + (b << 8)) >> 8);                            p[Order::A] = (int8u)((((colors->a + a) << 8) - colors->a * a) >> 8);                        }                    }                    p += 4;                    ++colors;                }                while(--len);            }        }        //--------------------------------------------------------------------        void blend_color_vspan(int x, int y, unsigned len,                                const color_type* colors, const int8u* covers)        {            int8u* p = m_rbuf->row(y) + (x << 2);            if(covers)            {                do                 {                    int alpha = int(*covers++) * colors->a;                    if(alpha)                    {                        if(alpha == 255*255)                        {                            p[Order::R] = (int8u)colors->r;                            p[Order::G] = (int8u)colors->g;                            p[Order::B] = (int8u)colors->b;                            p[Order::A] = (int8u)colors->a;                        }                        else                        {                            int r = p[Order::R];                            int g = p[Order::G];                            int b = p[Order::B];                            int a = p[Order::A];                            p[Order::R] = (int8u)((((colors->r - r) * alpha) + (r << 16)) >> 16);                            p[Order::G] = (int8u)((((colors->g - g) * alpha) + (g << 16)) >> 16);                            p[Order::B] = (int8u)((((colors->b - b) * alpha) + (b << 16)) >> 16);                            p[Order::A] = (int8u)(((alpha + (a << 8)) - ((alpha * a) >> 8)) >> 8);                        }                    }                    p += m_rbuf->stride();                    ++colors;                }                while(--len);            }            else            {                do                 {                    if(colors->a)                    {                        if(colors->a == 255)                        {                            p[Order::R] = (int8u)colors->r;                            p[Order::G] = (int8u)colors->g;                            p[Order::B] = (int8u)colors->b;                            p[Order::A] = (int8u)colors->a;                        }                        else                        {                            int r = p[Order::R];                            int g = p[Order::G];                            int b = p[Order::B];                            int a = p[Order::A];                            p[Order::R] = (int8u)((((colors->r - r) * colors->a) + (r << 8)) >> 8);                            p[Order::G] = (int8u)((((colors->g - g) * colors->a) + (g << 8)) >> 8);                            p[Order::B] = (int8u)((((colors->b - b) * colors->a) + (b << 8)) >> 8);                            p[Order::A] = (int8u)((((colors->a + a) << 8) - colors->a * a) >> 8);                        }                    }                    p += m_rbuf->stride();                    ++colors;                }                while(--len);            }        }    private:        rendering_buffer* m_rbuf;    };    typedef pixel_formats_rgba32<order_rgba32> pixfmt_rgba32; //----pixfmt_rgba32    typedef pixel_formats_rgba32<order_argb32> pixfmt_argb32; //----pixfmt_argb32    typedef pixel_formats_rgba32<order_abgr32> pixfmt_abgr32; //----pixfmt_abgr32    typedef pixel_formats_rgba32<order_bgra32> pixfmt_bgra32; //----pixfmt_bgra32}#endif

⌨️ 快捷键说明

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