Merge pull request #3833 from mapycz/fix-crash-polygon_vertex_processor
Fix crash in case of empty ring
This commit is contained in:
commit
da8b5c46d7
2 changed files with 67 additions and 1 deletions
|
@ -24,6 +24,7 @@
|
||||||
#define MAPNIK_GEOMETRY_POLYGON_VERTEX_PROCESSOR_HPP
|
#define MAPNIK_GEOMETRY_POLYGON_VERTEX_PROCESSOR_HPP
|
||||||
|
|
||||||
// geometry
|
// geometry
|
||||||
|
#include <mapnik/geometry/point.hpp>
|
||||||
#include <mapnik/geometry/polygon.hpp>
|
#include <mapnik/geometry/polygon.hpp>
|
||||||
|
|
||||||
namespace mapnik { namespace geometry {
|
namespace mapnik { namespace geometry {
|
||||||
|
@ -46,7 +47,10 @@ struct polygon_vertex_processor
|
||||||
ring.emplace_back(p);
|
ring.emplace_back(p);
|
||||||
break;
|
break;
|
||||||
case SEG_CLOSE:
|
case SEG_CLOSE:
|
||||||
|
if (!ring.empty())
|
||||||
|
{
|
||||||
ring.emplace_back(ring.front());
|
ring.emplace_back(ring.front());
|
||||||
|
}
|
||||||
polygon_.emplace_back(std::move(ring));
|
polygon_.emplace_back(std::move(ring));
|
||||||
ring = linear_ring<T>();
|
ring = linear_ring<T>();
|
||||||
break;
|
break;
|
||||||
|
|
62
test/unit/geometry/polygon_vertex_processor.cpp
Normal file
62
test/unit/geometry/polygon_vertex_processor.cpp
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
#include "catch.hpp"
|
||||||
|
#include "unit/vertex_adapter/fake_path.hpp"
|
||||||
|
|
||||||
|
#include <mapnik/geometry/polygon_vertex_processor.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("polygon_vertex_processor") {
|
||||||
|
|
||||||
|
SECTION("empty polygon") {
|
||||||
|
|
||||||
|
fake_path path = {};
|
||||||
|
mapnik::geometry::polygon_vertex_processor<double> proc;
|
||||||
|
proc.add_path(path);
|
||||||
|
CHECK(proc.polygon_.size() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("empty outer ring") {
|
||||||
|
|
||||||
|
fake_path path = {};
|
||||||
|
path.vertices_.emplace_back(0, 0, mapnik::SEG_CLOSE);
|
||||||
|
path.rewind(0);
|
||||||
|
|
||||||
|
mapnik::geometry::polygon_vertex_processor<double> proc;
|
||||||
|
proc.add_path(path);
|
||||||
|
REQUIRE(proc.polygon_.size() == 1);
|
||||||
|
REQUIRE(proc.polygon_.front().size() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("empty inner ring") {
|
||||||
|
|
||||||
|
fake_path path = {};
|
||||||
|
path.vertices_.emplace_back(-1, -1, mapnik::SEG_MOVETO);
|
||||||
|
path.vertices_.emplace_back( 1, -1, mapnik::SEG_LINETO);
|
||||||
|
path.vertices_.emplace_back( 1, 1, mapnik::SEG_LINETO);
|
||||||
|
path.vertices_.emplace_back(-1, 1, mapnik::SEG_LINETO);
|
||||||
|
path.vertices_.emplace_back( 0, 0, mapnik::SEG_CLOSE);
|
||||||
|
path.vertices_.emplace_back( 0, 0, mapnik::SEG_CLOSE);
|
||||||
|
path.rewind(0);
|
||||||
|
|
||||||
|
mapnik::geometry::polygon_vertex_processor<double> proc;
|
||||||
|
proc.add_path(path);
|
||||||
|
|
||||||
|
REQUIRE(proc.polygon_.size() == 2);
|
||||||
|
auto outer_ring = proc.polygon_.front();
|
||||||
|
REQUIRE(outer_ring.size() == 5);
|
||||||
|
|
||||||
|
CHECK(outer_ring[0].x == Approx(-1));
|
||||||
|
CHECK(outer_ring[0].y == Approx(-1));
|
||||||
|
|
||||||
|
CHECK(outer_ring[1].x == Approx( 1));
|
||||||
|
CHECK(outer_ring[1].y == Approx(-1));
|
||||||
|
|
||||||
|
CHECK(outer_ring[2].x == Approx( 1));
|
||||||
|
CHECK(outer_ring[2].y == Approx( 1));
|
||||||
|
|
||||||
|
CHECK(outer_ring[3].x == Approx(-1));
|
||||||
|
CHECK(outer_ring[3].y == Approx( 1));
|
||||||
|
|
||||||
|
CHECK(outer_ring[4].x == Approx(-1));
|
||||||
|
CHECK(outer_ring[4].y == Approx(-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue