diff --git a/include/mapnik/vertex_cache.hpp b/include/mapnik/vertex_cache.hpp index e557d4b30..094101a85 100644 --- a/include/mapnik/vertex_cache.hpp +++ b/include/mapnik/vertex_cache.hpp @@ -208,7 +208,7 @@ vertex_cache::vertex_cache(T & path) current_subpath_->add_segment(new_x, new_y, 0); first = false; } - if (agg::is_line_to(cmd)) + else if (agg::is_line_to(cmd)) { if (first) { @@ -220,6 +220,14 @@ vertex_cache::vertex_cache(T & path) double segment_length = std::sqrt(dx*dx + dy*dy); current_subpath_->add_segment(new_x, new_y, segment_length); } + else if (agg::is_closed(cmd) && !current_subpath_->vector.empty()) + { + segment const & first_segment = current_subpath_->vector[0]; + double dx = old_x - first_segment.pos.x; + double dy = old_y - first_segment.pos.y; + double segment_length = std::sqrt(dx*dx + dy*dy); + current_subpath_->add_segment(first_segment.pos.x, first_segment.pos.y, segment_length); + } old_x = new_x; old_y = new_y; } diff --git a/src/text/symbolizer_helpers.cpp b/src/text/symbolizer_helpers.cpp index 7761ed8b0..7b1559976 100644 --- a/src/text/symbolizer_helpers.cpp +++ b/src/text/symbolizer_helpers.cpp @@ -318,6 +318,40 @@ placements_list const& text_symbolizer_helper::get() const return finder_.placements(); } +class apply_line_placement_visitor +{ +public: + apply_line_placement_visitor(vertex_converter_type & converter, + placement_finder_adapter const & adapter) + : converter_(converter), adapter_(adapter) + { + } + + bool operator()(geometry::line_string const & geo) const + { + geometry::line_string_vertex_adapter va(geo); + converter_.apply(va, adapter_); + return adapter_.status(); + } + + bool operator()(geometry::polygon const & geo) const + { + geometry::polygon_vertex_adapter va(geo); + converter_.apply(va, adapter_); + return adapter_.status(); + } + + template + bool operator()(T const & geo) const + { + return false; + } + +private: + vertex_converter_type & converter_; + placement_finder_adapter const & adapter_; +}; + bool text_symbolizer_helper::next_line_placement() const { while (!geometries_to_process_.empty()) @@ -331,17 +365,11 @@ bool text_symbolizer_helper::next_line_placement() const continue; //Reexecute size check } - if (geo_itr_->is()) // line_string + if (mapnik::util::apply_visitor(apply_line_placement_visitor(converter_, adapter_), *geo_itr_)) { - auto const& line = util::get const>(*geo_itr_); - geometry::line_string_vertex_adapter va(line); - converter_.apply(va, adapter_); - if (adapter_.status()) - { - //Found a placement - geo_itr_ = geometries_to_process_.erase(geo_itr_); - return true; - } + //Found a placement + geo_itr_ = geometries_to_process_.erase(geo_itr_); + return true; } // No placement for this geometry. Keep it in geometries_to_process_ for next try.