void composite(T1 & im, T2 & im2, composite_mode_e mode, float opacity, int dx, int dy, bool premultiply_src, bool premultiply_dst) { typedef agg::rgba8 color; typedef agg::order_rgba order; typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba<color, order> blender_type; typedef agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type; typedef agg::renderer_base<pixfmt_type> renderer_type; agg::rendering_buffer source(im.getBytes(),im.width(),im.height(),im.width() * 4); agg::rendering_buffer mask(im2.getBytes(),im2.width(),im2.height(),im2.width() * 4); pixfmt_type pixf(source); pixf.comp_op(static_cast<agg::comp_op_e>(mode)); agg::pixfmt_rgba32 pixf_mask(mask); if (premultiply_src) pixf_mask.premultiply(); if (premultiply_dst) pixf.premultiply(); renderer_type ren(pixf); // TODO - is this really opacity, or agg::cover? ren.blend_from(pixf_mask,0, dx,dy,unsigned(255*opacity)); }
void composite(T1 & dst, T2 & src, composite_mode_e mode, float opacity, int dx, int dy, bool premultiply_src) { using color = agg::rgba8; using order = agg::order_rgba; using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>; using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>; using renderer_type = agg::renderer_base<pixfmt_type>; agg::rendering_buffer dst_buffer(dst.getBytes(),dst.width(),dst.height(),dst.width() * 4); agg::rendering_buffer src_buffer(src.getBytes(),src.width(),src.height(),src.width() * 4); pixfmt_type pixf(dst_buffer); pixf.comp_op(static_cast<agg::comp_op_e>(mode)); agg::pixfmt_rgba32 pixf_mask(src_buffer); if (premultiply_src) pixf_mask.premultiply(); renderer_type ren(pixf); ren.blend_from(pixf_mask,0,dx,dy,unsigned(255*opacity)); }
void composite(T1 & im, T2 & im2, composite_mode_e mode) { typedef agg::rgba8 color; typedef agg::order_bgra order; typedef agg::pixel32_type pixel_type; typedef agg::comp_op_adaptor_rgba<color, order> blender_type; typedef agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type; typedef agg::renderer_base<pixfmt_type> renderer_type; typedef agg::comp_op_adaptor_rgba<color, order> blender_type; typedef agg::renderer_base<pixfmt_type> renderer_type; agg::rendering_buffer source(im.getBytes(),im.width(),im.height(),im.width() * 4); agg::rendering_buffer mask(im2.getBytes(),im2.width(),im2.height(),im2.width() * 4); agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixf(source); agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixf_mask(mask); switch(mode) { case clear : pixf.comp_op(agg::comp_op_clear); break; case src: pixf.comp_op(agg::comp_op_src); break; case dst: pixf.comp_op(agg::comp_op_dst); break; case src_over: pixf.comp_op(agg::comp_op_src_over); break; case dst_over: pixf.comp_op(agg::comp_op_dst_over); break; case src_in: pixf.comp_op(agg::comp_op_src_in); break; case dst_in: pixf.comp_op(agg::comp_op_dst_in); break; case src_out: pixf.comp_op(agg::comp_op_src_out); break; case dst_out: pixf.comp_op(agg::comp_op_dst_out); break; case src_atop: pixf.comp_op(agg::comp_op_src_atop); break; case dst_atop: pixf.comp_op(agg::comp_op_dst_atop); break; case _xor: pixf.comp_op(agg::comp_op_xor); break; case plus: pixf.comp_op(agg::comp_op_plus); break; case minus: pixf.comp_op(agg::comp_op_minus); break; case multiply: pixf.comp_op(agg::comp_op_multiply); break; case screen: pixf.comp_op(agg::comp_op_screen); break; case overlay: pixf.comp_op(agg::comp_op_overlay); break; case darken: pixf.comp_op(agg::comp_op_darken); break; case lighten: pixf.comp_op(agg::comp_op_lighten); break; case color_dodge: pixf.comp_op(agg::comp_op_color_dodge); break; case color_burn: pixf.comp_op(agg::comp_op_color_burn); break; case hard_light: pixf.comp_op(agg::comp_op_hard_light); break; case soft_light: pixf.comp_op(agg::comp_op_soft_light); break; case difference: pixf.comp_op(agg::comp_op_difference); break; case exclusion: pixf.comp_op(agg::comp_op_exclusion); break; case contrast: pixf.comp_op(agg::comp_op_contrast); break; case invert: pixf.comp_op(agg::comp_op_invert); break; case invert_rgb: pixf.comp_op(agg::comp_op_invert_rgb); break; default: break; } renderer_type ren(pixf); agg::renderer_base<pixfmt_type> rb(pixf); rb.blend_from(pixf_mask,0,0,0,255); }