From 6d770cb40f1231e202b603fcc63d3b00efc3f551 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 1 Sep 2016 10:45:26 -0700 Subject: [PATCH] [core] Initial state of Source::Impl::enabled must be true Until Style::recalculate() is called to check that there are no visible layers using the source, we have to assume there are. Otherwise, Style::isLoaded() can return a false positive. --- src/mbgl/style/source_impl.hpp | 6 +++++- src/mbgl/style/style.cpp | 4 +++- test/style/style.cpp | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mbgl/style/source_impl.hpp b/src/mbgl/style/source_impl.hpp index 52b2e46a3..fa278b362 100644 --- a/src/mbgl/style/source_impl.hpp +++ b/src/mbgl/style/source_impl.hpp @@ -74,7 +74,11 @@ public: const std::string id; bool loaded = false; - bool enabled = false; + + // Tracks whether the source is used by any layers visible at the current zoom level. Must + // be initialized to true so that Style::isLoaded() does not produce false positives if + // called before Style::recalculate(). + bool enabled = true; protected: void invalidateTiles(); diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 1009654fc..7317100be 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -305,7 +305,9 @@ bool Style::isLoaded() const { } for (const auto& source: sources) { - if (source->baseImpl->enabled && !source->baseImpl->isLoaded()) return false; + if (source->baseImpl->enabled && !source->baseImpl->isLoaded()) { + return false; + } } if (!spriteStore->isLoaded()) { diff --git a/test/style/style.cpp b/test/style/style.cpp index b1c7d50ba..0d04fa583 100644 --- a/test/style/style.cpp +++ b/test/style/style.cpp @@ -17,6 +17,10 @@ TEST(Style, UnusedSource) { auto now = Clock::now(); style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json")); + + // If we haven't calculated whether the source is used, we have to assume it is used. + EXPECT_FALSE(style.isLoaded()); + style.cascade(now, MapMode::Still); style.recalculate(0, now, MapMode::Still);