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)); }
MAPNIK_DECL void composite(image_gray32f & dst, image_gray32f const& src, composite_mode_e /*mode*/, float /*opacity*/, int dx, int dy #ifdef MAPNIK_STATS_RENDER , std::ostream * log_stream #endif ) { using const_rendering_buffer = util::rendering_buffer<image_gray32f>; using src_pixfmt_type = agg::pixfmt_alpha_blend_gray<agg::blender_gray<agg::gray32>, const_rendering_buffer, 1, 0>; using dst_pixfmt_type = agg::pixfmt_alpha_blend_gray<agg::blender_gray<agg::gray32>, agg::rendering_buffer, 1, 0>; using renderer_type = agg::renderer_base<dst_pixfmt_type>; agg::rendering_buffer dst_buffer(dst.bytes(),safe_cast<unsigned>(dst.width()),safe_cast<unsigned>(dst.height()),safe_cast<int>(dst.width())); const_rendering_buffer src_buffer(src); dst_pixfmt_type pixf(dst_buffer); src_pixfmt_type pixf_mask(src_buffer); renderer_type ren(pixf); ren.copy_from(pixf_mask,0,dx,dy); }
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 operator()(unsigned begin, unsigned end) { using color = agg::rgba8; using order = agg::order_rgba; using const_rendering_buffer = util::rendering_buffer<image_rgba8>; 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.bytes(), safe_cast<unsigned>(dst.width()), safe_cast<unsigned>(dst.height()), safe_cast<int>(dst.row_size())); const_rendering_buffer src_buffer(src); pixfmt_type pixf(dst_buffer); pixf.comp_op(static_cast<agg::comp_op_e>(mode)); agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32_pre, const_rendering_buffer, agg::pixel32_type> pixf_mask(src_buffer); renderer_type ren(pixf); agg::rect_i src_area(0, begin, src.width() - 1, end - 1); ren.blend_from(pixf_mask, &src_area, dx, dy, safe_cast<agg::cover_type>(255 * opacity)); }
void render_raster_marker(agg::trans_affine const& marker_tr, double opacity) { using pixfmt_pre = agg::pixfmt_rgba32_pre; agg::scanline_u8 sl_; double width = src_.width(); double height = src_.height(); if (std::fabs(1.0 - scale_factor_) < 0.001 && (std::fabs(1.0 - marker_tr.sx) < agg::affine_epsilon) && (std::fabs(0.0 - marker_tr.shy) < agg::affine_epsilon) && (std::fabs(0.0 - marker_tr.shx) < agg::affine_epsilon) && (std::fabs(1.0 - marker_tr.sy) < agg::affine_epsilon)) { agg::rendering_buffer src_buffer((unsigned char *)src_.getBytes(),src_.width(),src_.height(),src_.width() * 4); pixfmt_pre pixf_mask(src_buffer); if (snap_to_pixels_) { renb_.blend_from(pixf_mask, 0, std::floor(marker_tr.tx + .5), std::floor(marker_tr.ty + .5), unsigned(255*opacity)); } else { renb_.blend_from(pixf_mask, 0, marker_tr.tx, marker_tr.ty, unsigned(255*opacity)); } } else { using img_accessor_type = agg::image_accessor_clone<pixfmt_pre>; using interpolator_type = agg::span_interpolator_linear<>; //using span_gen_type = agg::span_image_filter_rgba_2x2<img_accessor_type,interpolator_type>; using span_gen_type = agg::span_image_resample_rgba_affine<img_accessor_type>; using renderer_type = agg::renderer_scanline_aa_alpha<renderer_base, agg::span_allocator<color_type>, span_gen_type>; double p[8]; p[0] = 0; p[1] = 0; p[2] = width; p[3] = 0; p[4] = width; p[5] = height; p[6] = 0; p[7] = height; marker_tr.transform(&p[0], &p[1]); marker_tr.transform(&p[2], &p[3]); marker_tr.transform(&p[4], &p[5]); marker_tr.transform(&p[6], &p[7]); agg::span_allocator<color_type> sa; agg::image_filter_lut filter; filter.calculate(agg::image_filter_bilinear(), true); agg::rendering_buffer marker_buf((unsigned char *)src_.getBytes(), src_.width(), src_.height(), src_.width()*4); pixfmt_pre pixf(marker_buf); img_accessor_type ia(pixf); agg::trans_affine final_tr(p, 0, 0, width, height); if (snap_to_pixels_) { final_tr.tx = std::floor(final_tr.tx+.5); final_tr.ty = std::floor(final_tr.ty+.5); } interpolator_type interpolator(final_tr); span_gen_type sg(ia, interpolator, filter); renderer_type rp(renb_,sa, sg, unsigned(opacity*255)); ras_.move_to_d(p[0],p[1]); ras_.line_to_d(p[2],p[3]); ras_.line_to_d(p[4],p[5]); ras_.line_to_d(p[6],p[7]); agg::render_scanlines(ras_, sl_, rp); } }
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); }
void render_raster_marker(RendererType renb, RasterizerType & ras, image_rgba8 const& src, agg::trans_affine const& tr, double opacity, float scale_factor, bool snap_to_pixels) { using color_type = agg::rgba8; using const_rendering_buffer = util::rendering_buffer<image_rgba8>; using pixfmt_pre = agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32_pre, const_rendering_buffer, agg::pixel32_type>; agg::scanline_u8 sl; double width = src.width(); double height = src.height(); if (std::fabs(1.0 - scale_factor) < 0.001 && (std::fabs(1.0 - tr.sx) < agg::affine_epsilon) && (std::fabs(0.0 - tr.shy) < agg::affine_epsilon) && (std::fabs(0.0 - tr.shx) < agg::affine_epsilon) && (std::fabs(1.0 - tr.sy) < agg::affine_epsilon)) { const_rendering_buffer src_buffer(src); pixfmt_pre pixf_mask(src_buffer); if (snap_to_pixels) { renb.blend_from(pixf_mask, 0, static_cast<int>(std::floor(tr.tx + .5)), static_cast<int>(std::floor(tr.ty + .5)), unsigned(255*opacity)); } else { renb.blend_from(pixf_mask, 0, static_cast<int>(tr.tx), static_cast<int>(tr.ty), unsigned(255*opacity)); } } else { using img_accessor_type = agg::image_accessor_clone<pixfmt_pre>; using interpolator_type = agg::span_interpolator_linear<>; //using span_gen_type = agg::span_image_filter_rgba_2x2<img_accessor_type,interpolator_type>; using span_gen_type = agg::span_image_resample_rgba_affine<img_accessor_type>; using renderer_type = agg::renderer_scanline_aa_alpha<RendererType, agg::span_allocator<color_type>, span_gen_type>; double p[8]; p[0] = 0; p[1] = 0; p[2] = width; p[3] = 0; p[4] = width; p[5] = height; p[6] = 0; p[7] = height; tr.transform(&p[0], &p[1]); tr.transform(&p[2], &p[3]); tr.transform(&p[4], &p[5]); tr.transform(&p[6], &p[7]); agg::span_allocator<color_type> sa; agg::image_filter_lut filter; filter.calculate(agg::image_filter_bilinear(), true); const_rendering_buffer src_buffer(src); pixfmt_pre pixf(src_buffer); img_accessor_type ia(pixf); agg::trans_affine final_tr(p, 0, 0, width, height); if (snap_to_pixels) { final_tr.tx = std::floor(final_tr.tx+.5); final_tr.ty = std::floor(final_tr.ty+.5); } interpolator_type interpolator(final_tr); span_gen_type sg(ia, interpolator, filter); renderer_type rp(renb, sa, sg, unsigned(opacity*255)); ras.move_to_d(p[0],p[1]); ras.line_to_d(p[2],p[3]); ras.line_to_d(p[4],p[5]); ras.line_to_d(p[6],p[7]); agg::render_scanlines(ras, sl, rp); } }