#ifndef MBGL_STYLE_SPRITE #define MBGL_STYLE_SPRITE #include #include #include #include #include #include #include #include #include namespace mbgl { class FileSource; class SpritePosition { public: explicit SpritePosition() {} explicit SpritePosition(uint16_t x, uint16_t y, uint16_t width, uint16_t height, float pixelRatio, bool sdf); operator bool() const { return !(width == 0 && height == 0 && x == 0 && y == 0); } uint16_t x = 0, y = 0; uint16_t width = 0, height = 0; float pixelRatio = 1.0f; bool sdf = false; }; class Sprite : public std::enable_shared_from_this, private util::noncopyable { private: struct Key {}; void load(FileSource& fileSource); public: Sprite(const Key &, const std::string& base_url, float pixelRatio); static util::ptr Create(const std::string& base_url, float pixelRatio, FileSource& fileSource); const SpritePosition &getSpritePosition(const std::string& name) const; void waitUntilLoaded() const; bool isLoaded() const; operator bool() const; private: const bool valid; public: const float pixelRatio; const std::string spriteURL; const std::string jsonURL; std::unique_ptr raster; private: void parseJSON(); void parseImage(); void complete(); private: std::string body; std::string image; std::atomic loadedImage; std::atomic loadedJSON; std::unordered_map pos; const SpritePosition empty; std::promise promise; std::future future; }; } #endif