#pragma once #include #include #include #include #include #include #include #include namespace mbgl { class FileSource; class AsyncRequest; class Response; class GlyphRequestor { public: virtual void onGlyphsAvailable(GlyphMap) = 0; protected: virtual ~GlyphRequestor() = default; }; class GlyphManager { public: GlyphManager(const GlyphManager&) = delete; GlyphManager& operator=(const GlyphManager&) = delete; explicit GlyphManager(std::unique_ptr = std::make_unique(optional())); ~GlyphManager(); // Workers send a `getGlyphs` message to the main thread once they have determined // their `GlyphDependencies`. If all glyphs are already locally available, GlyphManager // will provide them to the requestor immediately. Otherwise, it makes a request on the // FileSource is made for each range needed, and notifies the observer when all are // complete. void getGlyphs(GlyphRequestor&, GlyphDependencies, FileSource&); void removeRequestor(GlyphRequestor&); void setURL(const std::string& url) { glyphURL = url; } void setObserver(GlyphManagerObserver*); // Remove glyphs for all but the supplied font stacks. void evict(const std::set&); private: Glyph generateLocalSDF(const FontStack& fontStack, GlyphID glyphID); std::string glyphURL; struct GlyphRequest { bool parsed = false; std::unique_ptr req; std::unordered_map> requestors; }; struct Entry { std::map ranges; std::map> glyphs; }; std::unordered_map entries; void requestRange(GlyphRequest&, const FontStack&, const GlyphRange&, FileSource& fileSource); void processResponse(const Response&, const FontStack&, const GlyphRange&); void notify(GlyphRequestor&, const GlyphDependencies&); GlyphManagerObserver* observer = nullptr; std::unique_ptr localGlyphRasterizer; }; } // namespace mbgl