agg_pixfmt_rgba.h

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

H
1,565
字号
    template<class ColorT, class Order> struct comp_op_rgba_plus    {        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 + Dca        // 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] + sr;            calc_type dg = p[Order::G] + sg;            calc_type db = p[Order::B] + sb;            calc_type da = p[Order::A] + sa;            p[Order::R] = (dr > base_mask) ? base_mask : dr;            p[Order::G] = (dg > base_mask) ? base_mask : dg;            p[Order::B] = (db > base_mask) ? base_mask : db;            p[Order::A] = (da > base_mask) ? base_mask : da;        }    };    //========================================================comp_op_rgba_minus    template<class ColorT, class Order> struct comp_op_rgba_minus    {        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        // Da' = 1 - (1 - Sa).(1 - 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] - sr;            calc_type dg = p[Order::G] - sg;            calc_type db = p[Order::B] - sb;            p[Order::R] = (dr > base_mask) ? 0 : dr;            p[Order::G] = (dg > base_mask) ? 0 : dg;            p[Order::B] = (db > base_mask) ? 0 : db;            p[Order::A] = (value_type)(base_mask - (((base_mask - sa) * (base_mask - p[Order::A]) + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_multiply    template<class ColorT, class Order> struct comp_op_rgba_multiply    {        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.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 s1a = base_mask - sa;            calc_type d1a = base_mask - p[Order::A];            calc_type dr = p[Order::R];            calc_type dg = p[Order::G];            calc_type db = p[Order::B];            p[Order::R] = (value_type)((sr * dr + sr * d1a + dr * s1a + base_mask) >> base_shift);            p[Order::G] = (value_type)((sg * dg + sg * d1a + dg * s1a + base_mask) >> base_shift);            p[Order::B] = (value_type)((sb * db + sb * d1a + db * 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_screen    template<class ColorT, class Order> struct comp_op_rgba_screen    {        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 + Dca - Sca.Dca        // 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 - ((sr * dr + base_mask) >> base_shift));            p[Order::G] = (value_type)(sg + dg - ((sg * dg + base_mask) >> base_shift));            p[Order::B] = (value_type)(sb + db - ((sb * db + base_mask) >> base_shift));            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_overlay    template<class ColorT, class Order> struct comp_op_rgba_overlay    {        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        };        // if 2.Dca < Da        //   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 * p[Order::A];            p[Order::R] = (value_type)(((2*dr < da) ?                 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*dg < da) ?                 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*db < da) ?                 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));        }    };    template<class T> inline T sd_min(T a, T b) { return (a < b) ? a : b; }    template<class T> inline T sd_max(T a, T b) { return (a > b) ? a : b; }    //=====================================================comp_op_rgba_darken    template<class ColorT, class Order> struct comp_op_rgba_darken    {        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' = min(Sca.Da, Dca.Sa) + 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)((sd_min(sr * da, dr * sa) + sr * d1a + dr * s1a) >> base_shift);            p[Order::G] = (value_type)((sd_min(sg * da, dg * sa) + sg * d1a + dg * s1a) >> base_shift);            p[Order::B] = (value_type)((sd_min(sb * da, db * sa) + sb * d1a + db * s1a) >> base_shift);            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_lighten    template<class ColorT, class Order> struct comp_op_rgba_lighten    {        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' = max(Sca.Da, Dca.Sa) + 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)((sd_max(sr * da, dr * sa) + sr * d1a + dr * s1a) >> base_shift);            p[Order::G] = (value_type)((sd_max(sg * da, dg * sa) + sg * d1a + dg * s1a) >> base_shift);            p[Order::B] = (value_type)((sd_max(sb * da, db * sa) + sb * d1a + db * s1a) >> base_shift);            p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));        }    };    //=====================================================comp_op_rgba_color_dodge    template<class ColorT, class Order> struct comp_op_rgba_color_dodge    {        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' = Sa.Da + Sca.(1 - Da) + Dca.(1 - Sa)        // otherwise        //   Dca' = Dca.Sa/(1-Sca/Sa) + 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;

⌨️ 快捷键说明

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