agg_pixfmt_rgba.h

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

H
1,565
字号
                sb = (sb * cover + 255) >> 8;                sa = (sa * cover + 255) >> 8;            }            calc_type d1a  = base_mask - p[Order::A];            calc_type s1a  = base_mask - sa;            calc_type dr   = p[Order::R];            calc_type dg   = p[Order::G];            calc_type db   = p[Order::B];            calc_type da   = p[Order::A];            long_type drsa = dr * sa;            long_type dgsa = dg * sa;            long_type dbsa = db * sa;            long_type srda = sr * da;            long_type sgda = sg * da;            long_type sbda = sb * da;            long_type sada = sa * da;            p[Order::R] = (value_type)((srda + drsa >= sada) ?                 (sada + sr * d1a + dr * s1a) >> base_shift :                drsa / (base_mask - (sr << base_shift) / sa) + ((sr * d1a + dr * s1a) >> base_shift));            p[Order::G] = (value_type)((sgda + dgsa >= sada) ?                 (sada + sg * d1a + dg * s1a) >> base_shift :                dgsa / (base_mask - (sg << base_shift) / sa) + ((sg * d1a + dg * s1a) >> base_shift));            p[Order::B] = (value_type)((sbda + dbsa >= sada) ?                 (sada + sb * d1a + db * s1a) >> base_shift :                dbsa / (base_mask - (sb << base_shift) / sa) + ((sb * d1a + db * s1a) >> base_shift));            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_color_burn    template<class ColorT, class Order> struct comp_op_rgba_color_burn    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // if Sca.Da + Dca.Sa <= Sa.Da        //   Dca' = Sca.(1 - Da) + Dca.(1 - Sa)        // otherwise        //   Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + 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 d1a  = base_mask - p[Order::A];            calc_type s1a  = base_mask - sa;            calc_type dr   = p[Order::R];            calc_type dg   = p[Order::G];            calc_type db   = p[Order::B];            calc_type da   = p[Order::A];            long_type drsa = dr * sa;            long_type dgsa = dg * sa;            long_type dbsa = db * sa;            long_type srda = sr * da;            long_type sgda = sg * da;            long_type sbda = sb * da;            long_type sada = sa * da;            p[Order::R] = (value_type)(((srda + drsa <= sada) ?                 sr * d1a + dr * s1a :                sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a) >> base_shift);            p[Order::G] = (value_type)(((sgda + dgsa <= sada) ?                 sg * d1a + dg * s1a :                sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a) >> base_shift);            p[Order::B] = (value_type)(((sbda + dbsa <= sada) ?                 sb * d1a + db * s1a :                sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a) >> base_shift);            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_hard_light    template<class ColorT, class Order> struct comp_op_rgba_hard_light    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // if 2.Sca < Sa        //    Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa)        // otherwise        //    Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + 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 d1a  = base_mask - p[Order::A];            calc_type s1a  = base_mask - sa;            calc_type dr   = p[Order::R];            calc_type dg   = p[Order::G];            calc_type db   = p[Order::B];            calc_type da   = p[Order::A];            calc_type sada = sa * da;            p[Order::R] = (value_type)(((2*sr < sa) ?                 2*sr*dr + sr*d1a + dr*s1a :                 sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a) >> base_shift);            p[Order::G] = (value_type)(((2*sg < sa) ?                 2*sg*dg + sg*d1a + dg*s1a :                 sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a) >> base_shift);            p[Order::B] = (value_type)(((2*sb < sa) ?                 2*sb*db + sb*d1a + db*s1a :                 sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a) >> base_shift);            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_soft_light    template<class ColorT, class Order> struct comp_op_rgba_soft_light    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // if 2.Sca < Sa        //   Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa)        // otherwise if 8.Dca <= Da        //   Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa).(3 - 8.Dca/Da)) + Sca.(1 - Da) + Dca.(1 - Sa)        // otherwise        //   Dca' = (Dca.Sa + ((Dca/Da)^(0.5).Da - Dca).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa)        //         // Da'  = Sa + Da - Sa.Da         static AGG_INLINE void blend_pix(value_type* p,                                          unsigned r, unsigned g, unsigned b,                                          unsigned a, unsigned cover)        {            double sr = double(r * cover) / (base_mask * 255);            double sg = double(g * cover) / (base_mask * 255);            double sb = double(b * cover) / (base_mask * 255);            double sa = double(a * cover) / (base_mask * 255);            double dr = double(p[Order::R]) / base_mask;            double dg = double(p[Order::G]) / base_mask;            double db = double(p[Order::B]) / base_mask;            double da = double(p[Order::A] ? p[Order::A] : 1) / base_mask;            if(cover < 255)            {                a = (a * cover + 255) >> 8;            }            if(2*sr < sa)       dr = dr*(sa + (1 - dr/da)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa);            else if(8*dr <= da) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)*(3 - 8*dr/da)) + sr*(1 - da) + dr*(1 - sa);            else                dr = (dr*sa + (sqrt(dr/da)*da - dr)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa);            if(2*sg < sa)       dg = dg*(sa + (1 - dg/da)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa);            else if(8*dg <= da) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)*(3 - 8*dg/da)) + sg*(1 - da) + dg*(1 - sa);            else                dg = (dg*sa + (sqrt(dg/da)*da - dg)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa);            if(2*sb < sa)       db = db*(sa + (1 - db/da)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa);            else if(8*db <= da) db = db*(sa + (1 - db/da)*(2*sb - sa)*(3 - 8*db/da)) + sb*(1 - da) + db*(1 - sa);            else                db = (db*sa + (sqrt(db/da)*da - db)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa);            p[Order::R] = (value_type)uround(dr * base_mask);            p[Order::G] = (value_type)uround(dg * base_mask);            p[Order::B] = (value_type)uround(db * base_mask);            p[Order::A] = (value_type)(a + p[Order::A] - ((a * p[Order::A] + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_difference    template<class ColorT, class Order> struct comp_op_rgba_difference    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = Sca + Dca - 2.min(Sca.Da, Dca.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 dr = p[Order::R];            calc_type dg = p[Order::G];            calc_type db = p[Order::B];            calc_type da = p[Order::A];            p[Order::R] = (value_type)(sr + dr - ((2 * sd_min(sr*da, dr*sa)) >> base_shift));            p[Order::G] = (value_type)(sg + dg - ((2 * sd_min(sg*da, dg*sa)) >> base_shift));            p[Order::B] = (value_type)(sb + db - ((2 * sd_min(sb*da, db*sa)) >> base_shift));            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_exclusion    template<class ColorT, class Order> struct comp_op_rgba_exclusion    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        // Dca' = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + 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 d1a = base_mask - p[Order::A];            calc_type s1a = base_mask - sa;            calc_type dr = p[Order::R];            calc_type dg = p[Order::G];            calc_type db = p[Order::B];            calc_type da = p[Order::A];            p[Order::R] = (value_type)((sr*da + dr*sa - 2*sr*dr + sr*d1a + dr*s1a) >> base_shift);            p[Order::G] = (value_type)((sg*da + dg*sa - 2*sg*dg + sg*d1a + dg*s1a) >> base_shift);            p[Order::B] = (value_type)((sb*da + db*sa - 2*sb*db + sb*d1a + db*s1a) >> base_shift);            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_contrast    template<class ColorT, class Order> struct comp_op_rgba_contrast    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        typedef typename color_type::long_type long_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        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;            }            long_type dr = p[Order::R];

⌨️ 快捷键说明

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