diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp index b7642a7b3..651f33e32 100644 --- a/src/agg/agg_renderer.cpp +++ b/src/agg/agg_renderer.cpp @@ -272,8 +272,11 @@ void agg_renderer::end_style_processing(feature_type_style const& st) } template -void agg_renderer::render_marker(pixel_position const& pos, marker const& marker, agg::trans_affine const& tr, - double opacity, composite_mode_e comp_op) +void agg_renderer::render_marker(pixel_position const& pos, + marker const& marker, + agg::trans_affine const& tr, + double opacity, + composite_mode_e comp_op) { typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index 32d38bcf0..2ef9506ec 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -54,6 +54,7 @@ // boost #include #include +#include // agg #include "agg_conv_clip_polyline.h" @@ -1212,7 +1213,13 @@ void cairo_renderer_base::render_marker(pixel_position const& pos, marker const& else if (marker.is_bitmap()) { agg::trans_affine matrix = tr; - matrix *= agg::trans_affine_translation(pos.x, pos.y); + double width = (*marker.get_bitmap_data())->width(); + double height = (*marker.get_bitmap_data())->height(); + double cx = 0.5 * width; + double cy = 0.5 * height; + matrix *= agg::trans_affine_translation( + boost::math::iround(pos.x - cx), + boost::math::iround(pos.y - cy)); context.add_image(matrix, **marker.get_bitmap_data(), opacity); } } @@ -1294,14 +1301,16 @@ void cairo_renderer_base::process(shield_symbolizer const& sym, placements_type const& placements = helper.placements(); for (unsigned int ii = 0; ii < placements.size(); ++ii) { - pixel_position marker_pos = helper.get_marker_position(placements[ii]); + pixel_position pos = helper.get_marker_position(placements[ii]); + pos.x += 0.5 * helper.get_marker_width(); + pos.y += 0.5 * helper.get_marker_height(); double dx = 0.5 * helper.get_marker_width(); double dy = 0.5 * helper.get_marker_height(); agg::trans_affine marker_tr = agg::trans_affine_translation(-dx,-dy); marker_tr *= agg::trans_affine_scaling(scale_factor_); marker_tr *= agg::trans_affine_translation(dx,dy); marker_tr *= helper.get_image_transform(); - render_marker(marker_pos, + render_marker(pos, helper.get_marker(), marker_tr, sym.get_opacity());