diff --git a/src/cairo/cairo_renderer.cpp b/src/cairo/cairo_renderer.cpp index 8befa09a0..41d5eab85 100644 --- a/src/cairo/cairo_renderer.cpp +++ b/src/cairo/cairo_renderer.cpp @@ -50,7 +50,7 @@ #include #include #include -#include +#include // todo - only need some of this expensive header #include #include #include @@ -839,10 +839,10 @@ struct markers_dispatch : mapnik::noncopyable cairo_context & ctx_; }; -template +template struct raster_markers_dispatch : mapnik::noncopyable { - raster_markers_dispatch(ImageMarker & marker, + raster_markers_dispatch(mapnik::image_data_32 & src, agg::trans_affine const& marker_trans, markers_symbolizer const& sym, Detector & detector, @@ -850,10 +850,9 @@ struct raster_markers_dispatch : mapnik::noncopyable feature_impl const& feature, mapnik::attributes const& vars, RendererContext const& renderer_context) - :marker_(marker), + : src_(src), detector_(detector), sym_(sym), - bbox_(std::get<1>(renderer_context)), marker_trans_(marker_trans), scale_factor_(scale_factor), feature_(feature), @@ -869,6 +868,7 @@ struct raster_markers_dispatch : mapnik::noncopyable double max_error = get(sym_, keys::max_error, feature_, vars_, 0.2); bool allow_overlap = get(sym_, keys::allow_overlap, feature_, vars_, false); bool ignore_placement = get(sym_, keys::ignore_placement, feature_, vars_, false); + box2d bbox_(0,0, src_.width(),src_.height()); markers_placement_finder placement_finder( placement_method, path, @@ -881,20 +881,16 @@ struct raster_markers_dispatch : mapnik::noncopyable double x, y, angle = .0; while (placement_finder.get_point(x, y, angle, ignore_placement)) { - coord2d center = bbox_.center(); - agg::trans_affine matrix = agg::trans_affine_translation( - -center.x, -center.y); - matrix *= marker_trans_; - matrix *= agg::trans_affine_rotation(angle); - matrix *= agg::trans_affine_translation(x, y); - ctx_.add_image(matrix, marker_, opacity); + agg::trans_affine matrix = marker_trans_; + matrix.rotate(angle); + matrix.translate(x, y); + ctx_.add_image(matrix, src_, opacity); } } - ImageMarker & marker_; + image_data_32 & src_; Detector & detector_; markers_symbolizer const& sym_; - box2d const& bbox_; agg::trans_affine const& marker_trans_; double scale_factor_; feature_impl const& feature_; @@ -914,14 +910,14 @@ void cairo_renderer_base::process(markers_symbolizer const& sym, context_.set_operator(comp_op); box2d clip_box = common_.query_extent_; - auto renderer_context = std::tie(context_, clip_box); + auto renderer_context = std::tie(context_); using RendererContextType = decltype(renderer_context); using vector_dispatch_type = detail::markers_dispatch >, svg_attribute_type,label_collision_detector4>; - using raster_dispatch_type = detail::raster_markers_dispatch; diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png index 3cdbd4c9c..eb8cb98f1 100644 Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png and b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png differ diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png index 3576689e5..a16bd4114 100644 Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png and b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png differ