#pragma once #include #include #include #include #include #include #include #include namespace mbgl { class FileSource; class AsyncRequest; class Response; class GlyphRequestor { public: virtual ~GlyphRequestor() = default; virtual void onGlyphsAvailable(GlyphMap) = 0; }; class GlyphManager : public util::noncopyable { public: GlyphManager(FileSource&); ~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 neeed, and notifies the observer when all are // complete. void getGlyphs(GlyphRequestor&, GlyphDependencies); void removeRequestor(GlyphRequestor&); void setURL(const std::string& url) { glyphURL = url; } void setObserver(GlyphManagerObserver*); private: FileSource& fileSource; 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; GlyphRequest& requestRange(Entry&, const FontStack&, const GlyphRange&); void processResponse(const Response&, const FontStack&, const GlyphRange&); void notify(GlyphRequestor&, const GlyphDependencies&); GlyphManagerObserver* observer = nullptr; }; } // namespace mbgl