diff options
author | Ansis Brammanis <ansis.brammanis@gmail.com> | 2019-04-08 16:28:55 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-08 16:28:55 -0400 |
commit | 104091cd9302c1377b9e4ffb56fc47fac36a2024 (patch) | |
tree | 6833e3f7aac80260631c1df4be660efc2face4ac | |
parent | 37a886570345ea00d705c3cbe58059be33dda130 (diff) | |
download | qtlocation-mapboxgl-104091cd9302c1377b9e4ffb56fc47fac36a2024.tar.gz |
fix firing onStyleImageMissing after sprite has loaded (#14369)
-rw-r--r-- | src/mbgl/renderer/image_manager.cpp | 13 | ||||
-rw-r--r-- | test/renderer/image_manager.test.cpp | 75 |
2 files changed, 82 insertions, 6 deletions
diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index f8f3e30f81..25acd6bd25 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -90,19 +90,20 @@ void ImageManager::getImages(ImageRequestor& requestor, ImageRequestPair&& pair) // if all icons are available. If any are missing, call `onStyleImageMissing` // to give the user a chance to provide the icon. If they are not provided // by the next frame we'll assume they are permanently missing. - bool hasAllDependencies = true; if (!isLoaded()) { + bool hasAllDependencies = true; for (const auto& dependency : pair.first) { if (images.find(dependency.first) == images.end()) { hasAllDependencies = false; + break; } } - } - if (hasAllDependencies) { - notify(requestor, pair); - } else if (!isLoaded()) { - requestors.emplace(&requestor, std::move(pair)); + if (hasAllDependencies) { + notify(requestor, pair); + } else { + requestors.emplace(&requestor, std::move(pair)); + } } else { checkMissingAndNotify(requestor, std::move(pair)); } diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp index b73d9b5c7a..d124e67e10 100644 --- a/test/renderer/image_manager.test.cpp +++ b/test/renderer/image_manager.test.cpp @@ -157,3 +157,78 @@ TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) { ASSERT_TRUE(notified); } + + +class StubImageManagerObserver : public ImageManagerObserver { + public: + int count = 0; + virtual void onStyleImageMissing(const std::string&, std::function<void()> done) override { + count++; + done(); + } +}; + +TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) { + ImageManager imageManager; + StubImageRequestor requestor; + StubImageManagerObserver observer; + + imageManager.setObserver(&observer); + + bool notified = false; + + requestor.imagesAvailable = [&] (ImageMap, ImageMap, std::unordered_map<std::string, uint32_t>) { + notified = true; + }; + + uint64_t imageCorrelationID = 0; + ImageDependencies dependencies; + dependencies.emplace("pre", ImageType::Icon); + imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + + EXPECT_EQ(observer.count, 0); + ASSERT_FALSE(notified); + + imageManager.setLoaded(true); + + EXPECT_EQ(observer.count, 1); + ASSERT_FALSE(notified); + + imageManager.notifyIfMissingImageAdded(); + + EXPECT_EQ(observer.count, 1); + ASSERT_TRUE(notified); + +} + +TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) { + ImageManager imageManager; + StubImageRequestor requestor; + StubImageManagerObserver observer; + + imageManager.setObserver(&observer); + + bool notified = false; + + requestor.imagesAvailable = [&] (ImageMap, ImageMap, std::unordered_map<std::string, uint32_t>) { + notified = true; + }; + + EXPECT_EQ(observer.count, 0); + ASSERT_FALSE(notified); + + imageManager.setLoaded(true); + + uint64_t imageCorrelationID = 0; + ImageDependencies dependencies; + dependencies.emplace("after", ImageType::Icon); + imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + + EXPECT_EQ(observer.count, 1); + ASSERT_FALSE(notified); + + imageManager.notifyIfMissingImageAdded(); + + EXPECT_EQ(observer.count, 1); + ASSERT_TRUE(notified); +} |