#pragma once #include #include #include #include #include #include #include #include #include #include namespace mbgl { template class Actor; namespace gfx { class Context; } // namespace gfx class ImageRequestor; /* ImageManager does two things: 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled. 2. Builds a texture atlas for pattern images. These are disparate responsibilities and should eventually be handled by different classes. When we implement data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time to refactor this. */ class ImageManager : public util::noncopyable { public: ImageManager(); ~ImageManager(); void setObserver(ImageManagerObserver*); void setLoaded(bool); bool isLoaded() const; void dumpDebugLogs() const; const style::Image::Impl* getImage(const std::string&) const; void addImage(Immutable); bool updateImage(Immutable); void removeImage(const std::string&); void getImages(ImageRequestor&, ImageRequestPair&&); void removeRequestor(ImageRequestor&); void notifyIfMissingImageAdded(); void reduceMemoryUse(); ImageVersionMap updatedImageVersions; private: void checkMissingAndNotify(ImageRequestor&, const ImageRequestPair&); void notify(ImageRequestor&, const ImageRequestPair&) const; void removePattern(const std::string&); bool loaded = false; std::map requestors; using Callback = std::function; using ActorCallback = Actor; struct MissingImageRequestPair { ImageRequestPair pair; std::map> callbacks; }; std::map missingImageRequestors; std::map> requestedImages; ImageMap images; ImageManagerObserver* observer = nullptr; // Pattern stuff public: optional getPattern(const std::string& name); gfx::TextureBinding textureBinding(gfx::Context&); void upload(gfx::Context&); Size getPixelSize() const; // Only for use in tests. const PremultipliedImage& getAtlasImage() const { return atlasImage; } private: struct Pattern { mapbox::Bin* bin; ImagePosition position; }; mapbox::ShelfPack shelfPack; std::unordered_map patterns; PremultipliedImage atlasImage; mbgl::optional atlasTexture; bool dirty = true; }; class ImageRequestor { public: explicit ImageRequestor(ImageManager&); virtual ~ImageRequestor(); virtual void onImagesAvailable(ImageMap icons, ImageMap patterns, ImageVersionMap versionMap, uint64_t imageCorrelationID) = 0; private: ImageManager& imageManager; }; } // namespace mbgl