#pragma once #include #include #include #include #include #include #include #include #include #include namespace mbgl { class LatLngBounds; class AnnotationTile; class AnnotationTileData; class SymbolAnnotationImpl; class ShapeAnnotationImpl; namespace style { class Style; } // namespace style class AnnotationManager : private util::noncopyable { public: AnnotationManager(style::Style&); ~AnnotationManager(); AnnotationID addAnnotation(const Annotation&); bool updateAnnotation(const AnnotationID&, const Annotation&); void removeAnnotation(const AnnotationID&); void addImage(std::unique_ptr); void removeImage(const std::string&); double getTopOffsetPixelsForImage(const std::string&); void setStyle(style::Style&); void onStyleLoaded(); void updateData(); void addTile(AnnotationTile&); void removeTile(AnnotationTile&); static const std::string SourceID; static const std::string PointLayerID; static const std::string ShapeLayerID; mapbox::base::WeakPtr makeWeakPtr() { return weakFactory.makeWeakPtr(); } private: void add(const AnnotationID&, const SymbolAnnotation&); void add(const AnnotationID&, const LineAnnotation&); void add(const AnnotationID&, const FillAnnotation&); void update(const AnnotationID&, const SymbolAnnotation&); void update(const AnnotationID&, const LineAnnotation&); void update(const AnnotationID&, const FillAnnotation&); void remove(const AnnotationID&); void updateStyle(); std::unique_ptr getTileData(const CanonicalTileID&); std::reference_wrapper style; std::mutex mutex; bool dirty = false; AnnotationID nextID = 0; using SymbolAnnotationTree = boost::geometry::index::rtree, boost::geometry::index::rstar<16, 4>>; // Unlike std::unordered_map, std::map is guaranteed to sort by AnnotationID, ensuring that older annotations are below newer annotations. // using SymbolAnnotationMap = std::map>; using ShapeAnnotationMap = std::map>; using ImageMap = std::unordered_map; SymbolAnnotationTree symbolTree; SymbolAnnotationMap symbolAnnotations; ShapeAnnotationMap shapeAnnotations; ImageMap images; std::unordered_set tiles; mapbox::base::WeakPtrFactory weakFactory{this}; }; } // namespace mbgl