#pragma once #include #include #include #include namespace mbgl { template class Actor; namespace gfx { class UploadPass; } // namespace gfx class ImageManagerObserver; class ImageRequestor; /** * @brief tracks requests for icon images from tile workers and sends responses when the requests are fulfilled. */ class ImageManager { public: ImageManager(); ImageManager(const ImageManager&) = delete; ImageManager& operator=(const ImageManager&) = delete; ~ImageManager(); void setObserver(ImageManagerObserver*); void setLoaded(bool); bool isLoaded() const; void dumpDebugLogs() const; const style::Image::Impl* getImage(const std::string&) const; const Immutable* getSharedImage(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(); void reduceMemoryUseIfCacheSizeExceedsLimit(); 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; std::size_t requestedImagesCacheSize = 0ul; ImageMap images; ImageManagerObserver* observer = nullptr; }; 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