summaryrefslogtreecommitdiff
path: root/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/declarativemaps/qdeclarativepolygonmapitem.cpp')
-rw-r--r--src/location/declarativemaps/qdeclarativepolygonmapitem.cpp53
1 files changed, 16 insertions, 37 deletions
diff --git a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
index 48f66423..e2c83186 100644
--- a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
+++ b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
@@ -53,8 +53,6 @@
/* poly2tri triangulator includes */
#include <clip2tri.h>
-#include <earcut.hpp>
-#include <array>
QT_BEGIN_NAMESPACE
@@ -187,7 +185,7 @@ void QGeoMapPolygonGeometry::updateSourcePoints(const QGeoMap &map,
// 2)
QList<QList<QDoubleVector2D> > clippedPaths;
- const QList<QDoubleVector2D> &visibleRegion = map.geoProjection().projectableRegion();
+ const QList<QDoubleVector2D> &visibleRegion = map.geoProjection().visibleRegion();
if (visibleRegion.size()) {
c2t::clip2tri clipper;
clipper.addSubjectPath(QClipperUtils::qListToPath(wrappedPath), true);
@@ -272,42 +270,23 @@ void QGeoMapPolygonGeometry::updateScreenPoints(const QGeoMap &map)
ppi.closeSubpath();
screenOutline_ = ppi;
- using Coord = double;
- using N = uint32_t;
- using Point = std::array<Coord, 2>;
-
- std::vector<std::vector<Point>> polygon;
- polygon.push_back(std::vector<Point>());
- std::vector<Point> &poly = polygon.front();
- // ... fill polygon structure with actual data
-
- for (int i = 0; i < ppi.elementCount(); ++i) {
- const QPainterPath::Element e = ppi.elementAt(i);
- if (e.isMoveTo() || i == ppi.elementCount() - 1
- || (qAbs(e.x - poly.front()[0]) < 0.1
- && qAbs(e.y - poly.front()[1]) < 0.1)) {
- Point p = { e.x, e.y };
- poly.push_back( p );
- } else if (e.isLineTo()) {
- Point p = { e.x, e.y };
- poly.push_back( p );
- } else {
- qWarning("Unhandled element type in polygon painterpath");
- }
- }
+ QTriangleSet ts = qTriangulate(ppi);
+ qreal *vx = ts.vertices.data();
- if (poly.size() > 2) {
- // Run tessellation
- // Returns array of indices that refer to the vertices of the input polygon.
- // Three subsequent indices form a triangle.
- screenVertices_.clear();
- screenIndices_.clear();
- for (const auto &p : poly)
- screenVertices_ << QPointF(p[0], p[1]);
- std::vector<N> indices = mapbox::earcut<N>(polygon);
- for (const auto &i: indices)
- screenIndices_ << quint32(i);
+ screenIndices_.reserve(ts.indices.size());
+ screenVertices_.reserve(ts.vertices.size());
+
+ if (ts.indices.type() == QVertexIndexVector::UnsignedInt) {
+ const quint32 *ix = reinterpret_cast<const quint32 *>(ts.indices.data());
+ for (int i = 0; i < (ts.indices.size()/3*3); ++i)
+ screenIndices_ << ix[i];
+ } else {
+ const quint16 *ix = reinterpret_cast<const quint16 *>(ts.indices.data());
+ for (int i = 0; i < (ts.indices.size()/3*3); ++i)
+ screenIndices_ << ix[i];
}
+ for (int i = 0; i < (ts.vertices.size()/2*2); i += 2)
+ screenVertices_ << QPointF(vx[i], vx[i + 1]);
screenBounds_ = ppi.boundingRect();
}