bool group_symbolizer_helper::find_line_placements(T & path) { if (box_elements_.empty()) return true; vertex_cache pp(path); bool success = false; while (pp.next_subpath()) { if (pp.length() <= 0.001) { success = check_point_placement(pp.current_position()) || success; continue; } double spacing = get_spacing(pp.length()); pp.forward(spacing/2.0); do { tolerance_iterator tolerance_offset(text_props_->label_position_tolerance * scale_factor_, spacing); //TODO: Handle halign while (tolerance_offset.next()) { vertex_cache::scoped_state state(pp); if (pp.move(tolerance_offset.get()) && check_point_placement(pp.current_position())) { success = true; break; } } } while (pp.forward(spacing)); } return success; }
pixel_position_list const& group_symbolizer_helper::get() { results_.clear(); if (point_placement_) { for (pixel_position const& point : points_) { check_point_placement(point); } } else { using apply_find_line_placements = detail::apply_find_line_placements<group_symbolizer_helper>; for (auto const& geom : geometries_to_process_) { // TODO to support clipped geometries this needs to use // vertex_converters apply_find_line_placements apply(t_, prj_trans_, *this); mapnik::util::apply_visitor(geometry::vertex_processor<apply_find_line_placements>(apply), geom); } } return results_; }
pixel_position_list const& group_symbolizer_helper::get() { results_.clear(); if (point_placement_) { for (pixel_position const& point : points_) { check_point_placement(point); } } else { for (auto const& geom : geometries_to_process_) { // TODO to support clipped geometries this needs to use // vertext_converters using path_type = transform_path_adapter<view_transform,geometry_type>; path_type path(t_, *geom, prj_trans_); find_line_placements(path); } } return results_; }