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