[mapnik] 03/04: Add patch to refactor markers_placement_finder.

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sun Mar 20 13:05:38 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository mapnik.

commit d8f003ea9ba7c332203f983cdbccf7452a4ace1c
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Mar 19 17:23:07 2016 +0100

    Add patch to refactor markers_placement_finder.
---
 debian/changelog                                   |   1 +
 .../refactor-markers_placement_finder.patch        | 693 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 695 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 8c1d287..9216a3f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,7 @@
 mapnik (3.0.10+ds-2) UNRELEASED; urgency=medium
 
   * Remove hurd-i386 & kfreebsd-i386 from supported architectures.
+  * Add patch to refactor markers_placement_finder.
 
  -- Bas Couwenberg <sebastic at debian.org>  Sat, 19 Mar 2016 16:22:07 +0100
 
diff --git a/debian/patches/refactor-markers_placement_finder.patch b/debian/patches/refactor-markers_placement_finder.patch
new file mode 100644
index 0000000..1a1d0cf
--- /dev/null
+++ b/debian/patches/refactor-markers_placement_finder.patch
@@ -0,0 +1,693 @@
+From 66e7ef58d716aae3193325f3855a527fecaa6348 Mon Sep 17 00:00:00 2001
+From: Mickey Rose <mickey.rose at seznam.cz>
+Origin: https://github.com/mapnik/mapnik/commit/66e7ef58d716aae3193325f3855a527fecaa6348
+Date: Wed, 2 Mar 2016 00:53:45 +0100
+Subject: [PATCH] refactor markers_placement_finder
+
+- refs #3327
+
+Replace member variant of placement-type implementations with plain
+union. The active implementation is chosen at construction time like
+before.
+
+Make placement-type implementation classes virtual to allow invoking
+the active union member through a base class pointer.
+---
+ include/mapnik/markers_placement.hpp               |  98 ++++++-------
+ include/mapnik/markers_placements/basic.hpp        | 153 +++++++++++++++++++++
+ include/mapnik/markers_placements/interior.hpp     |  24 +---
+ include/mapnik/markers_placements/line.hpp         |  30 ++--
+ include/mapnik/markers_placements/point.hpp        | 118 ++--------------
+ .../mapnik/markers_placements/vertext_first.hpp    |  24 +---
+ include/mapnik/markers_placements/vertext_last.hpp |  21 +--
+ src/renderer_common/render_markers_symbolizer.cpp  |   1 +
+ 8 files changed, 235 insertions(+), 234 deletions(-)
+ create mode 100644 include/mapnik/markers_placements/basic.hpp
+
+--- a/include/mapnik/markers_placement.hpp
++++ b/include/mapnik/markers_placement.hpp
+@@ -29,7 +29,6 @@
+ #include <mapnik/markers_placements/vertext_first.hpp>
+ #include <mapnik/markers_placements/vertext_last.hpp>
+ #include <mapnik/symbolizer_enumerations.hpp>
+-#include <mapnik/util/variant.hpp>
+ 
+ namespace mapnik
+ {
+@@ -38,70 +37,71 @@ template <typename Locator, typename Det
+ class markers_placement_finder : util::noncopyable
+ {
+ public:
+-    using markers_placement = util::variant<markers_point_placement<Locator, Detector>,
+-                                            markers_line_placement<Locator, Detector>,
+-                                            markers_interior_placement<Locator, Detector>,
+-                                            markers_vertex_first_placement<Locator, Detector>,
+-                                            markers_vertex_last_placement<Locator, Detector>>;
+-
+-    class get_point_visitor
+-    {
+-    public:
+-        get_point_visitor(double &x, double &y, double &angle, bool ignore_placement)
+-            : x_(x), y_(y), angle_(angle), ignore_placement_(ignore_placement)
+-        {
+-        }
+-
+-        template <typename T>
+-        bool operator()(T &placement) const
+-        {
+-            return placement.get_point(x_, y_, angle_, ignore_placement_);
+-        }
+-
+-    private:
+-        double &x_, &y_, &angle_;
+-        bool ignore_placement_;
+-    };
++    using basic_placement = markers_basic_placement<Locator, Detector>;
+ 
+     markers_placement_finder(marker_placement_e placement_type,
+                              Locator &locator,
+                              Detector &detector,
+                              markers_placement_params const& params)
+-        : placement_(create(placement_type, locator, detector, params))
+-    {
+-    }
+-
+-    // Get next point where the marker should be placed. Returns true if a place is found, false if none is found.
+-    bool get_point(double &x, double &y, double &angle, bool ignore_placement)
+-    {
+-        return util::apply_visitor(get_point_visitor(x, y, angle, ignore_placement), placement_);
+-    }
+-
+-private:
+-    // Factory function for particular placement implementations.
+-    static markers_placement create(marker_placement_e placement_type,
+-                                    Locator &locator,
+-                                    Detector &detector,
+-                                    markers_placement_params const& params)
++        : active_placement_(nullptr)
+     {
+         switch (placement_type)
+         {
++        default:
+         case MARKER_POINT_PLACEMENT:
+-            return markers_point_placement<Locator, Detector>(locator,detector,params);
++            active_placement_ = construct(&point_, locator, detector, params);
++            break;
+         case MARKER_INTERIOR_PLACEMENT:
+-            return markers_interior_placement<Locator, Detector>(locator,detector,params);
++            active_placement_ = construct(&interior_, locator, detector, params);
++            break;
+         case MARKER_LINE_PLACEMENT:
+-            return markers_line_placement<Locator, Detector>(locator,detector,params);
++            active_placement_ = construct(&line_, locator, detector, params);
++            break;
+         case MARKER_VERTEX_FIRST_PLACEMENT:
+-            return markers_vertex_first_placement<Locator, Detector>(locator,detector,params);
++            active_placement_ = construct(&vertex_first_, locator, detector, params);
++            break;
+         case MARKER_VERTEX_LAST_PLACEMENT:
+-            return markers_vertex_last_placement<Locator, Detector>(locator,detector,params);
+-        default: // point
+-            return markers_point_placement<Locator, Detector>(locator,detector,params);
++            active_placement_ = construct(&vertex_last_, locator, detector, params);
++            break;
+         }
++        // previously placement-type constructors (markers_*_placement)
++        // rewound the locator; reasons for rewinding here instead:
++        //  1) so that nobody is tempted to call now-virtual rewind()
++        //      in placement-type class constructors
++        //  2) it servers as a runtime check that the above switch isn't
++        //      missing cases and active_placement_ points to an object
++        active_placement_->rewind();
++    }
++
++    ~markers_placement_finder()
++    {
++        active_placement_->~basic_placement();
++    }
++
++    // Get next point where the marker should be placed. Returns true if a place is found, false if none is found.
++    bool get_point(double &x, double &y, double &angle, bool ignore_placement)
++    {
++        return active_placement_->get_point(x, y, angle, ignore_placement);
+     }
+ 
+-    markers_placement placement_;
++private:
++    basic_placement* active_placement_;
++
++    union
++    {
++        markers_point_placement<Locator, Detector> point_;
++        markers_line_placement<Locator, Detector> line_;
++        markers_interior_placement<Locator, Detector> interior_;
++        markers_vertex_first_placement<Locator, Detector> vertex_first_;
++        markers_vertex_last_placement<Locator, Detector> vertex_last_;
++    };
++
++    template <typename T>
++    static T* construct(T* what, Locator & locator, Detector & detector,
++                        markers_placement_params const& params)
++    {
++        return new(what) T(locator, detector, params);
++    }
+ };
+ 
+ }
+--- /dev/null
++++ b/include/mapnik/markers_placements/basic.hpp
+@@ -0,0 +1,153 @@
++/*****************************************************************************
++ *
++ * This file is part of Mapnik (c++ mapping toolkit)
++ *
++ * Copyright (C) 2016 Artem Pavlenko
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++ *
++ *****************************************************************************/
++
++#ifndef MAPNIK_MARKERS_PLACEMENTS_BASIC_HPP
++#define MAPNIK_MARKERS_PLACEMENTS_BASIC_HPP
++
++// mapnik
++#include <mapnik/box2d.hpp>
++#include <mapnik/symbolizer_enumerations.hpp>
++#include <mapnik/util/math.hpp>
++#include <mapnik/util/noncopyable.hpp>
++
++// agg
++#include "agg_basics.h"
++#include "agg_trans_affine.h"
++
++namespace mapnik {
++
++struct markers_placement_params
++{
++    box2d<double> size;
++    agg::trans_affine tr;
++    double spacing;
++    double max_error;
++    bool allow_overlap;
++    bool avoid_edges;
++    direction_enum direction;
++};
++
++template <typename Locator, typename Detector>
++class markers_basic_placement : util::noncopyable
++{
++public:
++    markers_basic_placement(Locator & locator, Detector & detector,
++                            markers_placement_params const& params)
++        : locator_(locator),
++          detector_(detector),
++          params_(params),
++          done_(false)
++    {
++        // no need to rewind locator here, markers_placement_finder
++        // does that after construction
++    }
++
++    markers_basic_placement(markers_basic_placement && ) = default;
++
++    virtual ~markers_basic_placement()
++    {
++        // empty but necessary
++    }
++
++    // Start again at first marker. Returns the same list of markers only works when they were NOT added to the detector.
++    virtual void rewind()
++    {
++        locator_.rewind(0);
++        done_ = false;
++    }
++
++    // Get next point where the marker should be placed. Returns true if a place is found, false if none is found.
++    virtual bool get_point(double &x, double &y, double &angle, bool ignore_placement) = 0;
++
++protected:
++    Locator & locator_;
++    Detector & detector_;
++    markers_placement_params const& params_;
++    bool done_;
++
++    // Rotates the size_ box and translates the position.
++    box2d<double> perform_transform(double angle, double dx, double dy) const
++    {
++        auto tr = params_.tr * agg::trans_affine_rotation(angle).translate(dx, dy);
++        return box2d<double>(params_.size, tr);
++    }
++
++    // Checks transformed box placement with collision detector.
++    // returns false if the box:
++    //  - a) isn't wholly inside extent and avoid_edges == true
++    //  - b) collides with something and allow_overlap == false
++    // otherwise returns true, and if ignore_placement == true,
++    //  also adds the box to collision detector
++    bool push_to_detector(double x, double y, double angle, bool ignore_placement)
++    {
++        auto box = perform_transform(angle, x, y);
++        if (params_.avoid_edges && !detector_.extent().contains(box))
++        {
++            return false;
++        }
++        if (!params_.allow_overlap && !detector_.has_placement(box))
++        {
++            return false;
++        }
++        if (!ignore_placement)
++        {
++            detector_.insert(box);
++        }
++        return true;
++    }
++
++    bool set_direction(double & angle) const
++    {
++        switch (params_.direction)
++        {
++            case DIRECTION_UP:
++                angle = 0;
++                return true;
++            case DIRECTION_DOWN:
++                angle = M_PI;
++                return true;
++            case DIRECTION_AUTO:
++                if (std::fabs(util::normalize_angle(angle)) > 0.5 * M_PI)
++                    angle += M_PI;
++                return true;
++            case DIRECTION_AUTO_DOWN:
++                if (std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI)
++                    angle += M_PI;
++                return true;
++            case DIRECTION_LEFT:
++                angle += M_PI;
++                return true;
++            case DIRECTION_LEFT_ONLY:
++                angle += M_PI;
++                return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
++            case DIRECTION_RIGHT_ONLY:
++                return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
++            case DIRECTION_RIGHT:
++            default:
++                return true;
++        }
++    }
++};
++
++} // namespace mapnik
++
++#endif // MAPNIK_MARKERS_PLACEMENTS_BASIC_HPP
+--- a/include/mapnik/markers_placements/interior.hpp
++++ b/include/mapnik/markers_placements/interior.hpp
+@@ -33,14 +33,8 @@ template <typename Locator, typename Det
+ class markers_interior_placement : public markers_point_placement<Locator, Detector>
+ {
+ public:
+-    markers_interior_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
+-        : markers_point_placement<Locator, Detector>(locator, detector, params)
+-    {
+-    }
+-
+-    markers_interior_placement(markers_interior_placement && rhs)
+-        : markers_point_placement<Locator, Detector>(std::move(rhs))
+-    {}
++    using point_placement = markers_point_placement<Locator, Detector>;
++    using point_placement::point_placement;
+ 
+     bool get_point(double &x, double &y, double &angle, bool ignore_placement)
+     {
+@@ -51,7 +45,7 @@ public:
+ 
+         if (this->locator_.type() == geometry::geometry_types::Point)
+         {
+-            return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
++            return point_placement::get_point(x, y, angle, ignore_placement);
+         }
+ 
+         if (this->locator_.type() == geometry::geometry_types::LineString)
+@@ -73,21 +67,11 @@ public:
+ 
+         angle = 0;
+ 
+-        box2d<double> box = this->perform_transform(angle, x, y);
+-        if (this->params_.avoid_edges && !this->detector_.extent().contains(box))
+-        {
+-            return false;
+-        }
+-        if (!this->params_.allow_overlap && !this->detector_.has_placement(box))
++        if (!this->push_to_detector(x, y, angle, ignore_placement))
+         {
+             return false;
+         }
+ 
+-        if (!ignore_placement)
+-        {
+-            this->detector_.insert(box);
+-        }
+-
+         this->done_ = true;
+         return true;
+     }
+--- a/include/mapnik/markers_placements/line.hpp
++++ b/include/mapnik/markers_placements/line.hpp
+@@ -35,29 +35,23 @@ template <typename Locator, typename Det
+ class markers_line_placement : public markers_point_placement<Locator, Detector>
+ {
+ public:
+-    markers_line_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
+-        : markers_point_placement<Locator, Detector>(locator, detector, params),
++    using point_placement = markers_point_placement<Locator, Detector>;
++    using point_placement::point_placement;
++
++    markers_line_placement(Locator & locator, Detector & detector,
++                           markers_placement_params const& params)
++        : point_placement(locator, detector, params),
+             first_point_(true),
+             spacing_(0.0),
+             marker_width_((params.size * params.tr).width()),
+             path_(locator)
+     {
+         spacing_ = params.spacing < 1 ? 100 : params.spacing;
+-        rewind();
+     }
+ 
+-    markers_line_placement(markers_line_placement && rhs)
+-        : markers_point_placement<Locator, Detector>(std::move(rhs)),
+-          first_point_(std::move(rhs.first_point_)),
+-          spacing_(std::move(rhs.spacing_)),
+-          marker_width_(std::move(rhs.marker_width_)),
+-          path_(std::move(rhs.path_))
+-    {}
+-
+     void rewind()
+     {
+-        this->locator_.rewind(0);
+-        this->done_ = false;
++        point_placement::rewind();
+         first_point_ = true;
+     }
+ 
+@@ -70,7 +64,7 @@ public:
+ 
+         if (this->locator_.type() == geometry::geometry_types::Point)
+         {
+-            return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
++            return point_placement::get_point(x, y, angle, ignore_placement);
+         }
+ 
+         double move = spacing_;
+@@ -102,16 +96,10 @@ public:
+                     {
+                         continue;
+                     }
+-                    box2d<double> box = this->perform_transform(angle, x, y);
+-                    if ((this->params_.avoid_edges && !this->detector_.extent().contains(box))
+-                        || (!this->params_.allow_overlap && !this->detector_.has_placement(box)))
++                    if (!this->push_to_detector(x, y, angle, ignore_placement))
+                     {
+                         continue;
+                     }
+-                    if (!ignore_placement)
+-                    {
+-                        this->detector_.insert(box);
+-                    }
+                     return true;
+                 }
+             }
+--- a/include/mapnik/markers_placements/point.hpp
++++ b/include/mapnik/markers_placements/point.hpp
+@@ -23,148 +23,54 @@
+ #ifndef MAPNIK_MARKERS_PLACEMENTS_POINT_HPP
+ #define MAPNIK_MARKERS_PLACEMENTS_POINT_HPP
+ 
+-#include <mapnik/box2d.hpp>
+ #include <mapnik/geom_util.hpp>
+ #include <mapnik/geometry_types.hpp>
+-#include <mapnik/util/math.hpp>
+-#include <mapnik/label_collision_detector.hpp>
+-#include <mapnik/symbolizer_enumerations.hpp>
+-#include <mapnik/util/noncopyable.hpp>
+-
+-#include "agg_basics.h"
+-#include "agg_trans_affine.h"
+-
+-#include <cmath>
++#include <mapnik/markers_placements/basic.hpp>
+ 
+ namespace mapnik {
+ 
+-struct markers_placement_params
+-{
+-    box2d<double> size;
+-    agg::trans_affine tr;
+-    double spacing;
+-    double max_error;
+-    bool allow_overlap;
+-    bool avoid_edges;
+-    direction_enum direction;
+-};
+-
+ template <typename Locator, typename Detector>
+-class markers_point_placement : util::noncopyable
++class markers_point_placement : public markers_basic_placement<Locator, Detector>
+ {
+ public:
+-    markers_point_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
+-        : locator_(locator),
+-          detector_(detector),
+-          params_(params),
+-          done_(false)
+-    {
+-        rewind();
+-    }
+-
+-    markers_point_placement(markers_point_placement && rhs)
+-        : locator_(rhs.locator_),
+-          detector_(rhs.detector_),
+-          params_(rhs.params_),
+-          done_(rhs.done_)
+-    {}
+-
+-
+-    // Start again at first marker. Returns the same list of markers only works when they were NOT added to the detector.
+-    void rewind()
+-    {
+-        locator_.rewind(0);
+-        done_ = false;
+-    }
++    using basic_placement = markers_basic_placement<Locator, Detector>;
++    using basic_placement::basic_placement;
+ 
+     // Get next point where the marker should be placed. Returns true if a place is found, false if none is found.
+     bool get_point(double &x, double &y, double &angle, bool ignore_placement)
+     {
+-        if (done_)
++        if (this->done_)
+         {
+             return false;
+         }
+ 
+-        if (locator_.type() == geometry::geometry_types::LineString)
++        if (this->locator_.type() == geometry::geometry_types::LineString)
+         {
+-            if (!label::middle_point(locator_, x, y))
++            if (!label::middle_point(this->locator_, x, y))
+             {
+-                done_ = true;
++                this->done_ = true;
+                 return false;
+             }
+         }
+         else
+         {
+-            if (!label::centroid(locator_, x, y))
++            if (!label::centroid(this->locator_, x, y))
+             {
+-                done_ = true;
++                this->done_ = true;
+                 return false;
+             }
+         }
+ 
+         angle = 0;
+-        box2d<double> box = perform_transform(angle, x, y);
+ 
+-        if (params_.avoid_edges && !detector_.extent().contains(box))
++        if (!this->push_to_detector(x, y, angle, ignore_placement))
+         {
+             return false;
+         }
+-        if (!params_.allow_overlap && !detector_.has_placement(box))
+-        {
+-            return false;
+-        }
+-
+-        if (!ignore_placement)
+-        {
+-            detector_.insert(box);
+-        }
+ 
+-        done_ = true;
++        this->done_ = true;
+         return true;
+     }
+-
+-protected:
+-    Locator &locator_;
+-    Detector &detector_;
+-    markers_placement_params const& params_;
+-    bool done_;
+-
+-    // Rotates the size_ box and translates the position.
+-    box2d<double> perform_transform(double angle, double dx, double dy)
+-    {
+-        agg::trans_affine tr = params_.tr * agg::trans_affine_rotation(angle).translate(dx, dy);
+-        return box2d<double>(params_.size, tr);
+-    }
+-
+-    bool set_direction(double & angle)
+-    {
+-        switch (params_.direction)
+-        {
+-            case DIRECTION_UP:
+-                angle = .0;
+-                return true;
+-            case DIRECTION_DOWN:
+-                angle = M_PI;
+-                return true;
+-            case DIRECTION_AUTO:
+-                angle = (std::fabs(util::normalize_angle(angle)) > 0.5 * M_PI) ? (angle + M_PI) : angle;
+-                return true;
+-            case DIRECTION_AUTO_DOWN:
+-                angle = (std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI) ? (angle + M_PI) : angle;
+-                return true;
+-            case DIRECTION_LEFT:
+-                angle += M_PI;
+-                return true;
+-            case DIRECTION_LEFT_ONLY:
+-                angle += M_PI;
+-                return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
+-            case DIRECTION_RIGHT_ONLY:
+-                return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
+-            case DIRECTION_RIGHT:
+-            default:
+-                return true;
+-        }
+-    }
+ };
+ 
+ }
+--- a/include/mapnik/markers_placements/vertext_first.hpp
++++ b/include/mapnik/markers_placements/vertext_first.hpp
+@@ -31,14 +31,8 @@ template <typename Locator, typename Det
+ class markers_vertex_first_placement : public markers_point_placement<Locator, Detector>
+ {
+ public:
+-    markers_vertex_first_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
+-        : markers_point_placement<Locator, Detector>(locator, detector, params)
+-    {
+-    }
+-
+-    markers_vertex_first_placement(markers_vertex_first_placement && rhs)
+-        : markers_point_placement<Locator, Detector>(std::move(rhs))
+-    {}
++    using point_placement = markers_point_placement<Locator, Detector>;
++    using point_placement::point_placement;
+ 
+     bool get_point(double &x, double &y, double &angle, bool ignore_placement)
+     {
+@@ -49,7 +43,7 @@ public:
+ 
+         if (this->locator_.type() == mapnik::geometry::geometry_types::Point)
+         {
+-            return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
++            return point_placement::get_point(x, y, angle, ignore_placement);
+         }
+ 
+         double x0, y0;
+@@ -75,21 +69,11 @@ public:
+             }
+         }
+ 
+-        box2d<double> box = this->perform_transform(angle, x, y);
+-        if (this->params_.avoid_edges && !this->detector_.extent().contains(box))
+-        {
+-            return false;
+-        }
+-        if (!this->params_.allow_overlap && !this->detector_.has_placement(box))
++        if (!this->push_to_detector(x, y, angle, ignore_placement))
+         {
+             return false;
+         }
+ 
+-        if (!ignore_placement)
+-        {
+-            this->detector_.insert(box);
+-        }
+-
+         this->done_ = true;
+         return true;
+     }
+--- a/include/mapnik/markers_placements/vertext_last.hpp
++++ b/include/mapnik/markers_placements/vertext_last.hpp
+@@ -31,13 +31,8 @@ template <typename Locator, typename Det
+ class markers_vertex_last_placement : public markers_point_placement<Locator, Detector>
+ {
+ public:
+-    markers_vertex_last_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
+-        : markers_point_placement<Locator, Detector>(locator, detector, params)
+-    {}
+-
+-    markers_vertex_last_placement(markers_vertex_last_placement && rhs)
+-        : markers_point_placement<Locator, Detector>(std::move(rhs))
+-    {}
++    using point_placement = markers_point_placement<Locator, Detector>;
++    using point_placement::point_placement;
+ 
+     bool get_point(double &x, double &y, double &angle, bool ignore_placement)
+     {
+@@ -80,20 +75,10 @@ public:
+             }
+         }
+ 
+-        box2d<double> box = this->perform_transform(angle, x, y);
+-        if (this->params_.avoid_edges && !this->detector_.extent().contains(box))
++        if (!this->push_to_detector(x, y, angle, ignore_placement))
+         {
+             return false;
+         }
+-        if (!this->params_.allow_overlap && !this->detector_.has_placement(box))
+-        {
+-            return false;
+-        }
+-
+-        if (!ignore_placement)
+-        {
+-            this->detector_.insert(box);
+-        }
+ 
+         this->done_ = true;
+         return true;
+--- a/src/renderer_common/render_markers_symbolizer.cpp
++++ b/src/renderer_common/render_markers_symbolizer.cpp
+@@ -20,6 +20,7 @@
+  *
+  *****************************************************************************/
+ 
++#include <mapnik/label_collision_detector.hpp>
+ #include <mapnik/svg/svg_storage.hpp>
+ #include <mapnik/svg/svg_path_adapter.hpp>
+ #include <mapnik/vertex_converters.hpp>
diff --git a/debian/patches/series b/debian/patches/series
index 5d213c7..521c20f 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,3 @@
 initialize-typo.patch
 occurred-typo.patch
+refactor-markers_placement_finder.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapnik.git



More information about the Pkg-grass-devel mailing list