#ifndef LLMR_STYLE_SPRITE #define LLMR_STYLE_SPRITE #include #include #include #include #include #include #include namespace llmr { class Map; class SpritePosition { public: explicit SpritePosition() {} explicit SpritePosition(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t pixelRatio = 1); operator bool() const { return !(width == 0 && height == 0 && x == 0 && y == 0); } uint16_t x = 0, y = 0; uint16_t width = 0, height = 0; uint8_t pixelRatio = 1; }; class Sprite : public std::enable_shared_from_this { public: Sprite(Map &map, float pixelRatio = 1); void load(const std::string& base_url); const SpritePosition &getSpritePosition(const std::string& name) const; bool isLoaded() const; public: const float pixelRatio; std::unique_ptr raster; private: void asyncParseJSON(); void asyncParseImage(); static void parseJSON(std::shared_ptr &sprite); static void parseImage(std::shared_ptr &sprite); static void complete(std::shared_ptr &sprite); private: Map ↦ std::string url; std::string body; std::string image; std::atomic loaded; std::unordered_map pos; const SpritePosition empty; }; } #endif