summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/image_atlas.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/image_atlas.cpp')
-rw-r--r--src/mbgl/renderer/image_atlas.cpp64
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();