int operator() (mapnik::marker_svg const& marker) { using pixfmt = agg::pixfmt_rgba32_pre; using renderer_base = agg::renderer_base<pixfmt>; using renderer_solid = agg::renderer_scanline_aa_solid<renderer_base>; agg::rasterizer_scanline_aa<> ras_ptr; agg::scanline_u8 sl; double opacity = 1; int w = marker.width(); int h = marker.height(); if (verbose_) { std::clog << "found width of '" << w << "' and height of '" << h << "'\n"; } // 10 pixel buffer to avoid edge clipping of 100% svg's mapnik::image_rgba8 im(w+0,h+0); agg::rendering_buffer buf(im.bytes(), im.width(), im.height(), im.row_size()); pixfmt pixf(buf); renderer_base renb(pixf); mapnik::box2d<double> const& bbox = marker.get_data()->bounding_box(); mapnik::coord<double,2> c = bbox.center(); // center the svg marker on '0,0' agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y); // render the marker at the center of the marker box mtx.translate(0.5 * im.width(), 0.5 * im.height()); mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage(marker.get_data()->source()); mapnik::svg::svg_path_adapter svg_path(stl_storage); mapnik::svg::svg_renderer_agg<mapnik::svg::svg_path_adapter, agg::pod_bvector<mapnik::svg::path_attributes>, renderer_solid, agg::pixfmt_rgba32_pre > svg_renderer_this(svg_path, marker.get_data()->attributes()); svg_renderer_this.render(ras_ptr, sl, renb, mtx, opacity, bbox); std::string png_name(svg_name_); boost::algorithm::ireplace_last(png_name,".svg",".png"); demultiply_alpha(im); mapnik::save_to_file<mapnik::image_rgba8>(im,png_name,"png"); int status = 0; if (auto_open_) { std::ostringstream s; #ifdef DARWIN s << "open " << png_name; #else s << "xdg-open " << png_name; #endif int ret = std::system(s.str().c_str()); if (ret != 0) status = ret; } std::clog << "rendered to: " << png_name << "\n"; return status; }
std::shared_ptr<cairo_pattern> operator() (mapnik::marker_svg const& marker) { double opacity = get<value_double, keys::opacity>(sym_, feature_, common_.vars_); mapnik::rasterizer ras; agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_); auto image_transform = get_optional<transform_type>(sym_, keys::image_transform); if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform); mapnik::box2d<double> const& bbox_image = marker.get_data()->bounding_box() * image_tr; mapnik::image_rgba8 image(bbox_image.width(), bbox_image.height()); render_pattern<image_rgba8>(ras, marker, image_tr, 1.0, image); width_ = image.width(); height_ = image.height(); return std::make_shared<cairo_pattern>(image, opacity); }