diff options
author | zverevgeny <zverevgeny@yandex-team.com> | 2025-05-13 19:00:02 +0300 |
---|---|---|
committer | zverevgeny <zverevgeny@yandex-team.com> | 2025-05-13 19:13:54 +0300 |
commit | 92e06374736aa28637dc0e706455b65c8268a5e6 (patch) | |
tree | 3df370c199ae25d308e542f02af20f43eab78f8a /contrib/python/matplotlib/py3/src/agg_workaround.h | |
parent | dc63d5794da99c2ebe3f32914d0351d9707660b0 (diff) | |
download | ydb-92e06374736aa28637dc0e706455b65c8268a5e6.tar.gz |
Import matplotlib
commit_hash:d59c2338025ef8fd1e1f961ed9d8d5fd52d0bd96
Diffstat (limited to 'contrib/python/matplotlib/py3/src/agg_workaround.h')
-rw-r--r-- | contrib/python/matplotlib/py3/src/agg_workaround.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/contrib/python/matplotlib/py3/src/agg_workaround.h b/contrib/python/matplotlib/py3/src/agg_workaround.h new file mode 100644 index 00000000000..47621951928 --- /dev/null +++ b/contrib/python/matplotlib/py3/src/agg_workaround.h @@ -0,0 +1,85 @@ +#ifndef MPL_AGG_WORKAROUND_H +#define MPL_AGG_WORKAROUND_H + +#include "agg_pixfmt_rgba.h" + +/********************************************************************** + WORKAROUND: This class is to workaround a bug in Agg SVN where the + blending of RGBA32 pixels does not preserve enough precision +*/ + +template<class ColorT, class Order> +struct fixed_blender_rgba_pre : agg::conv_rgba_pre<ColorT, Order> +{ + 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, + value_type cr, value_type cg, value_type cb, + value_type alpha, agg::cover_type cover) + { + blend_pix(p, + color_type::mult_cover(cr, cover), + color_type::mult_cover(cg, cover), + color_type::mult_cover(cb, cover), + color_type::mult_cover(alpha, cover)); + } + + //-------------------------------------------------------------------- + static AGG_INLINE void blend_pix(value_type* p, + value_type cr, value_type cg, value_type cb, + value_type alpha) + { + alpha = base_mask - alpha; + p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); + p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); + p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); + p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); + } +}; + + +template<class ColorT, class Order> +struct fixed_blender_rgba_plain : agg::conv_rgba_plain<ColorT, Order> +{ + 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 }; + + //-------------------------------------------------------------------- + static AGG_INLINE void blend_pix(value_type* p, + value_type cr, value_type cg, value_type cb, value_type alpha, agg::cover_type cover) + { + blend_pix(p, cr, cg, cb, color_type::mult_cover(alpha, cover)); + } + + //-------------------------------------------------------------------- + static AGG_INLINE void blend_pix(value_type* p, + value_type cr, value_type cg, value_type cb, value_type alpha) + { + if(alpha == 0) return; + calc_type a = p[Order::A]; + calc_type r = p[Order::R] * a; + calc_type g = p[Order::G] * a; + calc_type b = p[Order::B] * a; + a = ((alpha + a) << base_shift) - alpha * a; + p[Order::A] = (value_type)(a >> base_shift); + p[Order::R] = (value_type)((((cr << base_shift) - r) * alpha + (r << base_shift)) / a); + p[Order::G] = (value_type)((((cg << base_shift) - g) * alpha + (g << base_shift)) / a); + p[Order::B] = (value_type)((((cb << base_shift) - b) * alpha + (b << base_shift)) / a); + } +}; + +#endif |