diff options
Diffstat (limited to 'src/mbgl/renderer/image_atlas.cpp')
-rw-r--r-- | src/mbgl/renderer/image_atlas.cpp | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/src/mbgl/renderer/image_atlas.cpp b/src/mbgl/renderer/image_atlas.cpp index 8eee7c2095..b39c788ced 100644 --- a/src/mbgl/renderer/image_atlas.cpp +++ b/src/mbgl/renderer/image_atlas.cpp @@ -16,36 +16,56 @@ ImagePosition::ImagePosition(const mapbox::Bin& bin, const style::Image::Impl& i ) { } -ImageAtlas makeImageAtlas(const ImageMap& images) { +const mapbox::Bin& _packImage(mapbox::ShelfPack& pack, const style::Image::Impl& image, ImageAtlas& resultImage, ImageType imageType) { + const mapbox::Bin& bin = *pack.packOne(-1, + image.image.size.width + 2 * padding, + image.image.size.height + 2 * padding); + + resultImage.image.resize({ + static_cast<uint32_t>(pack.width()), + static_cast<uint32_t>(pack.height()) + }); + + PremultipliedImage::copy(image.image, + resultImage.image, + { 0, 0 }, + { + bin.x + padding, + bin.y + padding + }, + image.image.size); + uint32_t x = bin.x + padding, + y = bin.y + padding, + w = image.image.size.width, + h = image.image.size.height; + + if (imageType == ImageType::Pattern) { + // Add 1 pixel wrapped padding on each side of the image. + PremultipliedImage::copy(image.image, resultImage.image, { 0, h - 1 }, { x, y - 1 }, { w, 1 }); // T + PremultipliedImage::copy(image.image, resultImage.image, { 0, 0 }, { x, y + h }, { w, 1 }); // B + PremultipliedImage::copy(image.image, resultImage.image, { w - 1, 0 }, { x - 1, y }, { 1, h }); // L + PremultipliedImage::copy(image.image, resultImage.image, { 0, 0 }, { x + w, y }, { 1, h }); // R + } + return bin; +} + +ImageAtlas makeImageAtlas(const ImageMap& icons, const ImageMap& patterns) { ImageAtlas result; mapbox::ShelfPack::ShelfPackOptions options; options.autoResize = true; mapbox::ShelfPack pack(0, 0, options); - for (const auto& entry : images) { + for (const auto& entry : icons) { const style::Image::Impl& image = *entry.second; + const mapbox::Bin& bin = _packImage(pack, image, result, ImageType::Icon); + result.iconPositions.emplace(image.id, ImagePosition { bin, image }); + } - const mapbox::Bin& bin = *pack.packOne(-1, - image.image.size.width + 2 * padding, - image.image.size.height + 2 * padding); - - result.image.resize({ - static_cast<uint32_t>(pack.width()), - static_cast<uint32_t>(pack.height()) - }); - - PremultipliedImage::copy(image.image, - result.image, - { 0, 0 }, - { - bin.x + padding, - bin.y + padding - }, - image.image.size); - - result.positions.emplace(image.id, - ImagePosition { bin, image }); + for (const auto& entry : patterns) { + const style::Image::Impl& image = *entry.second; + const mapbox::Bin& bin = _packImage(pack, image, result, ImageType::Pattern); + result.patternPositions.emplace(image.id, ImagePosition { bin, image }); } pack.shrink(); |