#pragma once #include #include #include #include #include #include #include namespace mbgl { class AnnotationTileData; class CanonicalTileID; class ShapeAnnotationImpl { public: ShapeAnnotationImpl(AnnotationID); virtual ~ShapeAnnotationImpl() = default; virtual void updateStyle(style::Style::Impl&) const = 0; virtual const ShapeAnnotationGeometry& geometry() const = 0; void updateTileData(const CanonicalTileID&, AnnotationTileData&); const AnnotationID id; const std::string layerID; std::unique_ptr shapeTiler; }; struct CloseShapeAnnotation { ShapeAnnotationGeometry operator()(const mbgl::LineString &geom) const { return geom; } ShapeAnnotationGeometry operator()(const mbgl::MultiLineString &geom) const { return geom; } ShapeAnnotationGeometry operator()(const mbgl::Polygon &geom) const { mbgl::Polygon closed = geom; for (auto &ring : closed) { if (!ring.empty() && ring.front() != ring.back()) { ring.emplace_back(ring.front()); } } return closed; } ShapeAnnotationGeometry operator()(const mbgl::MultiPolygon &geom) const { mbgl::MultiPolygon closed = geom; for (auto &polygon : closed) { for (auto &ring : polygon) { if (!ring.empty() && ring.front() != ring.back()) { ring.emplace_back(ring.front()); } } } return closed; } }; } // namespace mbgl