agg_pixfmt_rgba.h

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

H
1,565
字号
        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        //   Dca' = Sca + Dca.(1 - Sa)        //   Da'  = Sa + Da - Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sr = (sr * cover + 255) >> 8;                sg = (sg * cover + 255) >> 8;                sb = (sb * cover + 255) >> 8;                sa = (sa * cover + 255) >> 8;            }            calc_type s1a = base_mask - sa;            p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift));            p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift));            p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift));            p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));        }    };    //======================================================comp_op_rgba_dst_over    template<class ColorT, class Order> struct comp_op_rgba_dst_over    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Dca + Sca.(1 - Da)        // Da'  = Sa + Da - Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sr = (sr * cover + 255) >> 8;                sg = (sg * cover + 255) >> 8;                sb = (sb * cover + 255) >> 8;                sa = (sa * cover + 255) >> 8;            }            calc_type d1a = base_mask - p[Order::A];            p[Order::R] = (value_type)(p[Order::R] + ((sr * d1a + base_mask) >> base_shift));            p[Order::G] = (value_type)(p[Order::G] + ((sg * d1a + base_mask) >> base_shift));            p[Order::B] = (value_type)(p[Order::B] + ((sb * d1a + base_mask) >> base_shift));            p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));        }    };    //======================================================comp_op_rgba_src_in    template<class ColorT, class Order> struct comp_op_rgba_src_in    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Sca.Da        // Da'  = Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            calc_type da = p[Order::A];            if(cover < 255)            {                unsigned alpha = 255 - cover;                p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8));            }            else            {                p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift);                p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift);                p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift);                p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift);            }        }    };    //======================================================comp_op_rgba_dst_in    template<class ColorT, class Order> struct comp_op_rgba_dst_in    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Dca.Sa        // Da'  = Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned, unsigned, unsigned,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sa = base_mask - ((cover * (base_mask - sa) + 255) >> 8);            }            p[Order::R] = (value_type)((p[Order::R] * sa + base_mask) >> base_shift);            p[Order::G] = (value_type)((p[Order::G] * sa + base_mask) >> base_shift);            p[Order::B] = (value_type)((p[Order::B] * sa + base_mask) >> base_shift);            p[Order::A] = (value_type)((p[Order::A] * sa + base_mask) >> base_shift);        }    };    //======================================================comp_op_rgba_src_out    template<class ColorT, class Order> struct comp_op_rgba_src_out    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Sca.(1 - Da)        // Da'  = Sa.(1 - Da)         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            calc_type da = base_mask - p[Order::A];            if(cover < 255)            {                unsigned alpha = 255 - cover;                p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8));                p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8));            }            else            {                p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift);                p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift);                p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift);                p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift);            }        }    };    //======================================================comp_op_rgba_dst_out    template<class ColorT, class Order> struct comp_op_rgba_dst_out    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Dca.(1 - Sa)         // Da'  = Da.(1 - Sa)         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned, unsigned, unsigned,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sa = (sa * cover + 255) >> 8;            }            sa = base_mask - sa;            p[Order::R] = (value_type)((p[Order::R] * sa + base_shift) >> base_shift);            p[Order::G] = (value_type)((p[Order::G] * sa + base_shift) >> base_shift);            p[Order::B] = (value_type)((p[Order::B] * sa + base_shift) >> base_shift);            p[Order::A] = (value_type)((p[Order::A] * sa + base_shift) >> base_shift);        }    };    //=====================================================comp_op_rgba_src_atop    template<class ColorT, class Order> struct comp_op_rgba_src_atop    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Sca.Da + Dca.(1 - Sa)        // Da'  = Da        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sr = (sr * cover + 255) >> 8;                sg = (sg * cover + 255) >> 8;                sb = (sb * cover + 255) >> 8;                sa = (sa * cover + 255) >> 8;            }            calc_type da = p[Order::A];            sa = base_mask - sa;            p[Order::R] = (value_type)((sr * da + p[Order::R] * sa + base_mask) >> base_shift);            p[Order::G] = (value_type)((sg * da + p[Order::G] * sa + base_mask) >> base_shift);            p[Order::B] = (value_type)((sb * da + p[Order::B] * sa + base_mask) >> base_shift);        }    };    //=====================================================comp_op_rgba_dst_atop    template<class ColorT, class Order> struct comp_op_rgba_dst_atop    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Dca.Sa + Sca.(1 - Da)        // Da'  = Sa         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            calc_type da = base_mask - p[Order::A];            if(cover < 255)            {                unsigned alpha = 255 - cover;                sr = (p[Order::R] * sa + sr * da + base_mask) >> base_shift;                sg = (p[Order::G] * sa + sg * da + base_mask) >> base_shift;                sb = (p[Order::B] * sa + sb * da + base_mask) >> base_shift;                p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8));                p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8));                p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8));                p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8));            }            else            {                p[Order::R] = (value_type)((p[Order::R] * sa + sr * da + base_mask) >> base_shift);                p[Order::G] = (value_type)((p[Order::G] * sa + sg * da + base_mask) >> base_shift);                p[Order::B] = (value_type)((p[Order::B] * sa + sb * da + base_mask) >> base_shift);                p[Order::A] = (value_type)sa;            }        }    };    //=========================================================comp_op_rgba_xor    template<class ColorT, class Order> struct comp_op_rgba_xor    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Sca.(1 - Da) + Dca.(1 - Sa)        // Da'  = Sa + Da - 2.Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                sr = (sr * cover + 255) >> 8;                sg = (sg * cover + 255) >> 8;                sb = (sb * cover + 255) >> 8;                sa = (sa * cover + 255) >> 8;            }            calc_type s1a = base_mask - sa;            calc_type d1a = base_mask - p[Order::A];            p[Order::R] = (value_type)((p[Order::R] * s1a + sr * d1a + base_mask) >> base_shift);            p[Order::G] = (value_type)((p[Order::G] * s1a + sg * d1a + base_mask) >> base_shift);            p[Order::B] = (value_type)((p[Order::B] * s1a + sb * d1a + base_mask) >> base_shift);            p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask/2) >> (base_shift - 1)));        }    };    //=========================================================comp_op_rgba_plus

⌨️ 快捷键说明

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