|
8 | 8 | blending of RGBA32 pixels does not preserve enough precision |
9 | 9 | */ |
10 | 10 |
|
11 | | -template<class ColorT, class Order> |
12 | | -struct fixed_blender_rgba_pre : agg::conv_rgba_pre<ColorT, Order> |
13 | | -{ |
14 | | - typedef ColorT color_type; |
15 | | - typedef Order order_type; |
16 | | - typedef typename color_type::value_type value_type; |
17 | | - typedef typename color_type::calc_type calc_type; |
18 | | - typedef typename color_type::long_type long_type; |
19 | | - enum base_scale_e |
20 | | - { |
21 | | - base_shift = color_type::base_shift, |
22 | | - base_mask = color_type::base_mask |
23 | | - }; |
24 | | - |
25 | | - //-------------------------------------------------------------------- |
26 | | - static AGG_INLINE void blend_pix(value_type* p, |
27 | | - value_type cr, value_type cg, value_type cb, |
28 | | - value_type alpha, agg::cover_type cover) |
29 | | - { |
30 | | - blend_pix(p, |
31 | | - color_type::mult_cover(cr, cover), |
32 | | - color_type::mult_cover(cg, cover), |
33 | | - color_type::mult_cover(cb, cover), |
34 | | - color_type::mult_cover(alpha, cover)); |
35 | | - } |
36 | | - |
37 | | - //-------------------------------------------------------------------- |
38 | | - static AGG_INLINE void blend_pix(value_type* p, |
39 | | - value_type cr, value_type cg, value_type cb, |
40 | | - value_type alpha) |
41 | | - { |
42 | | - alpha = base_mask - alpha; |
43 | | - p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); |
44 | | - p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); |
45 | | - p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); |
46 | | - p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); |
47 | | - } |
48 | | -}; |
49 | | - |
50 | | - |
51 | 11 | template<class ColorT, class Order> |
52 | 12 | struct fixed_blender_rgba_plain : agg::conv_rgba_plain<ColorT, Order> |
53 | 13 | { |
|
0 commit comments