Add new blender and use in by default

This commit is contained in:
Oleg Korshul
2023-06-11 00:36:45 +03:00
parent 7a36d76298
commit b5e84edbe7
3 changed files with 54 additions and 9 deletions

View File

@ -170,6 +170,52 @@ namespace agg
}
};
//=============================================================blender_rgba_src_over
template<class ColorT, class Order> struct blender_rgba_unpre
{
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
};
//--------------------------------------------------------------------
static AGG_INLINE void blend_pix(value_type* p,
unsigned cr, unsigned cg, unsigned cb,
unsigned alpha,
unsigned cover=0)
{
calc_type r = p[Order::R];
calc_type g = p[Order::G];
calc_type b = p[Order::B];
calc_type a = p[Order::A];
p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift));
p[Order::R] = (value_type)((alpha * cr + a * r - ((a * r * alpha + base_mask) >> base_shift)) / p[Order::A]);
p[Order::G] = (value_type)((alpha * cg + a * r - ((a * g * alpha + base_mask) >> base_shift)) / p[Order::A]);
p[Order::B] = (value_type)((alpha * cb + a * r - ((a * b * alpha + base_mask) >> base_shift)) / p[Order::A]);
}
static AGG_INLINE void blend_pix_subpix(value_type* p,
unsigned cr, unsigned cg, unsigned cb,
unsigned* covers,
unsigned cover=0)
{
calc_type r = p[Order::R];
calc_type g = p[Order::G];
calc_type b = p[Order::B];
//calc_type a = p[Order::A];
p[Order::R] = (value_type)(((cr - r) * covers[Order::R] + (r << base_shift)) >> base_shift);
p[Order::G] = (value_type)(((cg - g) * covers[Order::G] + (g << base_shift)) >> base_shift);
p[Order::B] = (value_type)(((cb - b) * covers[Order::B] + (b << base_shift)) >> base_shift);
//p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift));
}
};
//=========================================================blender_rgba_pre
template<class ColorT, class Order> struct blender_rgba_pre
{

View File

@ -11,10 +11,11 @@ namespace agg
namespace svg
{
//---------------------------------------------------------------------------
template<class Blender=agg::blender_rgba<color_type, component_order>>
class frame_buffer_rgba
{
public:
typedef agg::blender_rgba<color_type, component_order> blender_type;
typedef Blender blender_type;
typedef agg::pixfmt_alpha_blend_rgba<blender_type, agg::rendering_buffer, pixel_type> pixfmt_type;
typedef agg::renderer_base<pixfmt_type> renderer_base_type;
typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderer_solid_type;

View File

@ -127,10 +127,10 @@ namespace Aggplus
typedef agg::rendering_buffer rendering_buffer_type;
typedef agg::pixfmt_bgra32 pixformat_type;
typedef agg::blender_rgba< agg::svg::color_type, agg::svg::component_order > blender_type;
typedef agg::comp_op_adaptor_rgba< agg::svg::color_type, agg::svg::component_order > blender_type_comp;
typedef agg::pixfmt_alpha_blend_rgba< blender_type, agg::rendering_buffer, agg::svg::pixel_type > pixfmt_type;
typedef agg::pixfmt_custom_blend_rgba< blender_type_comp, agg::rendering_buffer> pixfmt_type_comp;
typedef agg::blender_rgba_unpre< agg::svg::color_type, agg::svg::component_order > blender_type;
typedef agg::comp_op_adaptor_rgba< agg::svg::color_type, agg::svg::component_order > blender_type_comp;
typedef agg::pixfmt_alpha_blend_rgba< blender_type, agg::rendering_buffer, agg::svg::pixel_type > pixfmt_type;
typedef agg::pixfmt_custom_blend_rgba< blender_type_comp, agg::rendering_buffer> pixfmt_type_comp;
typedef agg::renderer_base<pixfmt_type> base_renderer_type;
typedef agg::renderer_base<pixfmt_type_comp> comp_renderer_type;
@ -278,8 +278,8 @@ protected:
CClipMulti m_oClip;
agg::svg::frame_buffer_rgba m_frame_buffer;
agg::svg::rasterizer m_rasterizer;
agg::svg::frame_buffer_rgba<blender_type> m_frame_buffer;
agg::svg::rasterizer m_rasterizer;
#ifdef _WINDOW_GRAPHIS_USE_
// для отрисовки картинок - используем Gdiplus
@ -292,8 +292,6 @@ protected:
CDIB* m_pDib;
public:
agg::svg::frame_buffer_rgba& get_frame_buffer();
agg::svg::rasterizer& get_rasterizer();
bool m_bIntegerGrid;
double m_dGlobalAlpha;