void operator() (marker_rgba8 const& mark) { using namespace mapnik::svg; bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_); double offset = get<value_double, keys::offset>(sym_, feature_, common_.vars_); double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_); double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_); agg::trans_affine geom_tr; auto transform = get_optional<transform_type>(sym_, keys::geometry_transform); if (transform) evaluate_transform(geom_tr, feature_, common_.vars_, *transform, common_.scale_factor_); agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_); setup_transform_scaling(image_tr, mark.width(), mark.height(), feature_, common_.vars_, sym_); auto image_transform = get_optional<transform_type>(sym_, keys::image_transform); if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform); box2d<double> const& bbox = mark.bounding_box(); mapnik::image_rgba8 const& marker = mark.get_data(); // - clamp sizes to > 4 pixels of interactivity coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine marker_trans = recenter * image_tr; raster_dispatch_type rasterizer_dispatch(marker, marker_trans, sym_, *common_.detector_, common_.scale_factor_, feature_, common_.vars_, renderer_context_); vertex_converter_type converter(clip_box_, sym_, common_.t_, prj_trans_, geom_tr, feature_, common_.vars_, common_.scale_factor_); if (clip) // optional clip (default: true) { geometry::geometry_types type = geometry::geometry_type(feature_.get_geometry()); if (type == geometry::geometry_types::Polygon || type == geometry::geometry_types::MultiPolygon) converter.template set<clip_poly_tag>(); else if (type == geometry::geometry_types::LineString || type == geometry::geometry_types::MultiLineString) converter.template set<clip_line_tag>(); } converter.template set<transform_tag>(); //always transform if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset converter.template set<affine_transform_tag>(); // optional affine transform if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter apply_markers_multi(feature_, common_.vars_, converter, rasterizer_dispatch, sym_); }
cairo_surface_ptr operator()(marker_rgba8 const& marker) const { box2d<double> bbox(marker.bounding_box()); agg::trans_affine tr(transform(bbox)); cairo_rectangle_t extent { 0, 0, bbox.width(), bbox.height() }; cairo_surface_ptr surface( cairo_recording_surface_create( CAIRO_CONTENT_COLOR_ALPHA, &extent), cairo_surface_closer()); cairo_ptr cairo = create_context(surface); cairo_context context(cairo); context.add_image(tr, marker.get_data(), opacity_); return surface; }
void operator() (marker_rgba8 const& mark) const { agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_); setup_transform_scaling(image_tr, mark.width(), mark.height(), feature_, common_.vars_, sym_); auto image_transform = get_optional<transform_type>(sym_, keys::image_transform); if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform, common_.scale_factor_); box2d<double> const& bbox = mark.bounding_box(); mapnik::image_rgba8 const& marker = mark.get_data(); // - clamp sizes to > 4 pixels of interactivity coord2d center = bbox.center(); agg::trans_affine_translation recenter(-center.x, -center.y); agg::trans_affine marker_trans = recenter * image_tr; raster_dispatch_type rasterizer_dispatch(marker, marker_trans, sym_, *common_.detector_, common_.scale_factor_, feature_, common_.vars_, renderer_context_); render_marker(mark, rasterizer_dispatch); }