[core] Pass ImageManager to ImageRequestor's constructor

This makes ImageRequestor API explicitly dependant on ImageManager, so that
ImageRequestor can unregister itself from ImageManager on destruction.
This commit is contained in:
Alexander Shalamov
2019-04-23 16:08:16 +03:00
parent 9a70e755dc
commit 83c33cdeb2
5 changed files with 25 additions and 11 deletions

View File

@@ -288,4 +288,11 @@ gfx::TextureBinding ImageManager::textureBinding(gfx::Context& context) {
return { atlasTexture->getResource(), gfx::TextureFilterType::Linear };
}
ImageRequestor::ImageRequestor(ImageManager& imageManager_) : imageManager(imageManager_) {
}
ImageRequestor::~ImageRequestor() {
imageManager.removeRequestor(*this);
}
} // namespace mbgl

View File

@@ -19,11 +19,7 @@ namespace gfx {
class Context;
} // namespace gfx
class ImageRequestor {
public:
virtual ~ImageRequestor() = default;
virtual void onImagesAvailable(ImageMap icons, ImageMap patterns, ImageVersionMap versionMap, uint64_t imageCorrelationID) = 0;
};
class ImageRequestor;
/*
ImageManager does two things:
@@ -105,4 +101,13 @@ private:
bool dirty = true;
};
class ImageRequestor {
public:
explicit ImageRequestor(ImageManager&);
virtual ~ImageRequestor();
virtual void onImagesAvailable(ImageMap icons, ImageMap patterns, ImageVersionMap versionMap, uint64_t imageCorrelationID) = 0;
private:
ImageManager& imageManager;
};
} // namespace mbgl

View File

@@ -42,6 +42,7 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_,
std::string sourceID_,
const TileParameters& parameters)
: Tile(Kind::Geometry, id_),
ImageRequestor(parameters.imageManager),
sourceID(std::move(sourceID_)),
mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())),
worker(parameters.workerScheduler,
@@ -60,7 +61,6 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_,
GeometryTile::~GeometryTile() {
glyphManager.removeRequestor(*this);
imageManager.removeRequestor(*this);
markObsolete();
}

View File

@@ -22,7 +22,7 @@ class TileParameters;
class GlyphAtlas;
class ImageAtlas;
class GeometryTile : public Tile, public GlyphRequestor, ImageRequestor {
class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor {
public:
GeometryTile(const OverscaledTileID&,
std::string sourceID,

View File

@@ -108,6 +108,8 @@ TEST(ImageManager, RemoveReleasesBinPackRect) {
class StubImageRequestor : public ImageRequestor {
public:
StubImageRequestor(ImageManager& imageManager) : ImageRequestor(imageManager) {}
void onImagesAvailable(ImageMap icons, ImageMap patterns, std::unordered_map<std::string, uint32_t> versionMap, uint64_t imageCorrelationID_) final {
if (imagesAvailable && imageCorrelationID == imageCorrelationID_) imagesAvailable(icons, patterns, versionMap);
}
@@ -118,7 +120,7 @@ public:
TEST(ImageManager, NotifiesRequestorWhenSpriteIsLoaded) {
ImageManager imageManager;
StubImageRequestor requestor;
StubImageRequestor requestor(imageManager);
bool notified = false;
ImageManagerObserver observer;
@@ -142,7 +144,7 @@ TEST(ImageManager, NotifiesRequestorWhenSpriteIsLoaded) {
TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) {
ImageManager imageManager;
StubImageRequestor requestor;
StubImageRequestor requestor(imageManager);
bool notified = false;
requestor.imagesAvailable = [&] (ImageMap, ImageMap, std::unordered_map<std::string, uint32_t>) {
@@ -170,7 +172,7 @@ class StubImageManagerObserver : public ImageManagerObserver {
TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) {
ImageManager imageManager;
StubImageRequestor requestor;
StubImageRequestor requestor(imageManager);
StubImageManagerObserver observer;
imageManager.setObserver(&observer);
@@ -203,7 +205,7 @@ TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) {
TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) {
ImageManager imageManager;
StubImageRequestor requestor;
StubImageRequestor requestor(imageManager);
StubImageManagerObserver observer;
imageManager.setObserver(&observer);