blob: f72ba9fb537f3026a488e9caf875b766c4d83601 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#pragma once
#include <mbgl/style/image_impl.hpp>
#include <mbgl/renderer/image_atlas.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/immutable.hpp>
#include <mbgl/util/optional.hpp>
#include <mbgl/gl/texture.hpp>
#include <mapbox/shelf-pack.hpp>
#include <set>
#include <string>
namespace mbgl {
namespace gl {
class Context;
} // namespace gl
class ImageRequestor {
public:
virtual ~ImageRequestor() = default;
virtual void onImagesAvailable(ImageMap, uint64_t imageCorrelationID) = 0;
};
/*
ImageManager does two things:
1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled.
2. Builds a texture atlas for pattern images.
These are disparate responsibilities and should eventually be handled by different classes. When we implement
data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time
to refactor this.
*/
class ImageManager : public util::noncopyable {
public:
ImageManager();
~ImageManager();
void setLoaded(bool);
bool isLoaded() const;
void dumpDebugLogs() const;
const style::Image::Impl* getImage(const std::string&) const;
void addImage(Immutable<style::Image::Impl>);
void updateImage(Immutable<style::Image::Impl>);
void removeImage(const std::string&);
void getImages(ImageRequestor&, ImageRequestPair&&);
void removeRequestor(ImageRequestor&);
private:
void notify(ImageRequestor&, const ImageRequestPair&) const;
bool loaded = false;
std::unordered_map<ImageRequestor*, ImageRequestPair> requestors;
ImageMap images;
// Pattern stuff
public:
optional<ImagePosition> getPattern(const std::string& name);
void bind(gl::Context&, gl::TextureUnit unit);
void upload(gl::Context&, gl::TextureUnit unit);
Size getPixelSize() const;
// Only for use in tests.
const PremultipliedImage& getAtlasImage() const {
return atlasImage;
}
private:
struct Pattern {
mapbox::Bin* bin;
ImagePosition position;
};
mapbox::ShelfPack shelfPack;
std::unordered_map<std::string, Pattern> patterns;
PremultipliedImage atlasImage;
mbgl::optional<gl::Texture> atlasTexture;
bool dirty = true;
};
} // namespace mbgl
|