#include #include namespace mbgl { static constexpr uint32_t padding = 1; GlyphAtlas makeGlyphAtlas(const GlyphMap& glyphs) { GlyphAtlas result; mapbox::ShelfPack::ShelfPackOptions options; options.autoResize = true; mapbox::ShelfPack pack(0, 0, options); for (const auto& glyphMapEntry : glyphs) { FontStackHash fontStack = glyphMapEntry.first; GlyphPositionMap& positions = result.positions[fontStack]; for (const auto& entry : glyphMapEntry.second) { if (entry.second && (*entry.second)->bitmap.valid()) { const Glyph& glyph = **entry.second; const mapbox::Bin& bin = *pack.packOne(-1, glyph.bitmap.size.width + 2 * padding, glyph.bitmap.size.height + 2 * padding); result.image.resize({ static_cast(pack.width()), static_cast(pack.height()) }); AlphaImage::copy(glyph.bitmap, result.image, { 0, 0 }, { bin.x + padding, bin.y + padding }, glyph.bitmap.size); positions.emplace(glyph.id, GlyphPosition { Rect { static_cast(bin.x), static_cast(bin.y), static_cast(bin.w), static_cast(bin.h) }, glyph.metrics }); } } } pack.shrink(); result.image.resize({ static_cast(pack.width()), static_cast(pack.height()) }); return result; } } // namespace mbgl