#ifndef MBGL_TEXT_GLYPH_STORE #define MBGL_TEXT_GLYPH_STORE #include #include #include #include #include #include #include #include namespace mbgl { class SDFGlyph { public: uint32_t id = 0; // A signed distance field of the glyph with a border of 3 pixels. std::string bitmap; // Glyph metrics GlyphMetrics metrics; }; class FontStack { public: void insert(uint32_t id, const SDFGlyph &glyph); const std::map &getMetrics() const; const std::map &getSDFs() const; const Shaping getShaping(const std::u32string &string, const float &maxWidth, const float &lineHeight, const float &alignment, const float &verticalAlignment, const float &letterSpacing) const; void lineWrap(Shaping &shaping, const float &lineHeight, const float &maxWidth, const float &alignment, const float &verticalAlignment) const; private: std::map bitmaps; std::map metrics; std::map sdfs; mutable std::mutex mtx; }; class GlyphPBF { public: GlyphPBF(const std::string &glyphURL, const std::string &fontStack, GlyphRange glyphRange); void parse(FontStack &stack); std::shared_future getFuture(); private: std::string data; std::promise promise; std::shared_future future; std::mutex mtx; }; // Manages Glyphrange PBF loading. class GlyphStore { public: GlyphStore(const std::string &glyphURL); // Block until all specified GlyphRanges of the specified font stack are loaded. void waitForGlyphRanges(const std::string &fontStack, const std::set &glyphRanges); FontStack &getFontStack(const std::string &fontStack); private: // Loads an individual glyph range from the font stack and adds it to rangeSets std::shared_future loadGlyphRange(const std::string &fontStack, std::map> &rangeSets, GlyphRange range); FontStack &createFontStack(const std::string &fontStack); public: const std::string glyphURL; private: std::unordered_map>> ranges; std::unordered_map> stacks; std::mutex mtx; }; } #endif