1 #include <mbgl/renderer/image_atlas.hpp>
2 
3 #include <mapbox/shelf-pack.hpp>
4 
5 namespace mbgl {
6 
7 static constexpr uint32_t padding = 1;
8 
ImagePosition(const mapbox::Bin & bin,const style::Image::Impl & image)9 ImagePosition::ImagePosition(const mapbox::Bin& bin, const style::Image::Impl& image)
10     : pixelRatio(image.pixelRatio),
11       textureRect(
12         bin.x + padding,
13         bin.y + padding,
14         bin.w - padding * 2,
15         bin.h - padding * 2
16       ) {
17 }
18 
makeImageAtlas(const ImageMap & images)19 ImageAtlas makeImageAtlas(const ImageMap& images) {
20     ImageAtlas result;
21 
22     mapbox::ShelfPack::ShelfPackOptions options;
23     options.autoResize = true;
24     mapbox::ShelfPack pack(0, 0, options);
25 
26     for (const auto& entry : images) {
27         const style::Image::Impl& image = *entry.second;
28 
29         const mapbox::Bin& bin = *pack.packOne(-1,
30             image.image.size.width + 2 * padding,
31             image.image.size.height + 2 * padding);
32 
33         result.image.resize({
34             static_cast<uint32_t>(pack.width()),
35             static_cast<uint32_t>(pack.height())
36         });
37 
38         PremultipliedImage::copy(image.image,
39                                  result.image,
40                                  { 0, 0 },
41                                  {
42                                     bin.x + padding,
43                                     bin.y + padding
44                                  },
45                                  image.image.size);
46 
47         result.positions.emplace(image.id,
48                                  ImagePosition { bin, image });
49     }
50 
51     pack.shrink();
52     result.image.resize({
53         static_cast<uint32_t>(pack.width()),
54         static_cast<uint32_t>(pack.height())
55     });
56 
57     return result;
58 }
59 
60 } // namespace mbgl
61