diff --git a/package.json b/package.json index 41a26968701..1dd72807d7d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "express": "^4.11.1", "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747", "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae", - "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#ac0e1907ff628e662dafeb44cdab6e594b59a59b", + "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#5b2e5749e85ad4241b5b4e4e54d2fa98e8920f34", "mkdirp": "^0.5.1", "node-cmake": "^1.2.1", "request": "^2.72.0", diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index 4d4e793ec00..a78f8c29bc1 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -19,7 +19,10 @@ VisibilityType Layer::getVisibility() const { } void Layer::setVisibility(VisibilityType value) { + if (value == getVisibility()) + return; baseImpl->visibility = value; + baseImpl->observer->onLayerVisibilityChanged(*this); } float Layer::getMinZoom() const { diff --git a/src/mbgl/style/layer_observer.hpp b/src/mbgl/style/layer_observer.hpp index 1d3d1aef468..4182a1b8129 100644 --- a/src/mbgl/style/layer_observer.hpp +++ b/src/mbgl/style/layer_observer.hpp @@ -10,6 +10,7 @@ class LayerObserver { virtual ~LayerObserver() = default; virtual void onLayerFilterChanged(Layer&) {} + virtual void onLayerVisibilityChanged(Layer&) {} virtual void onLayerPaintPropertyChanged(Layer&) {} virtual void onLayerLayoutPropertyChanged(Layer&) {} }; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 9aa85ab69f5..ced97838a62 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -505,9 +505,11 @@ void Style::onSpriteError(std::exception_ptr error) { struct QueueSourceReloadVisitor { UpdateBatch& updateBatch; - void operator()(CustomLayer&) { assert(false); } - void operator()(RasterLayer&) { assert(false); } - void operator()(BackgroundLayer&) { assert(false); } + // No need to reload sources for these types; their visibility can change but + // they don't participate in layout. + void operator()(CustomLayer&) {} + void operator()(RasterLayer&) {} + void operator()(BackgroundLayer&) {} template void operator()(VectorLayer& layer) { @@ -520,6 +522,11 @@ void Style::onLayerFilterChanged(Layer& layer) { observer->onUpdate(Update::Layout); } +void Style::onLayerVisibilityChanged(Layer& layer) { + layer.accept(QueueSourceReloadVisitor { updateBatch }); + observer->onUpdate(Update::Layout); +} + void Style::onLayerPaintPropertyChanged(Layer&) { observer->onUpdate(Update::RecalculateStyle | Update::Classes); } diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index cee097fcd39..7c091882024 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -136,6 +136,7 @@ class Style : public GlyphStoreObserver, // LayerObserver implementation. void onLayerFilterChanged(Layer&) override; + void onLayerVisibilityChanged(Layer&) override; void onLayerPaintPropertyChanged(Layer&) override; void onLayerLayoutPropertyChanged(Layer&) override; diff --git a/test/src/mbgl/test/stub_layer_observer.hpp b/test/src/mbgl/test/stub_layer_observer.hpp index 500103055d9..f346080b100 100644 --- a/test/src/mbgl/test/stub_layer_observer.hpp +++ b/test/src/mbgl/test/stub_layer_observer.hpp @@ -14,6 +14,10 @@ class StubLayerObserver : public style::LayerObserver { if (layerFilterChanged) layerFilterChanged(layer); } + void onLayerVisibilityChanged(Layer& layer) override { + if (layerVisibilityChanged) layerVisibilityChanged(layer); + } + void onLayerPaintPropertyChanged(Layer& layer) override { if (layerPaintPropertyChanged) layerPaintPropertyChanged(layer); } @@ -23,6 +27,7 @@ class StubLayerObserver : public style::LayerObserver { } std::function layerFilterChanged; + std::function layerVisibilityChanged; std::function layerPaintPropertyChanged; std::function layerLayoutPropertyChanged; }; diff --git a/test/style/style_layer.cpp b/test/style/style_layer.cpp index 0d2ed88edd3..08952e3799f 100644 --- a/test/style/style_layer.cpp +++ b/test/style/style_layer.cpp @@ -226,6 +226,15 @@ TEST(Layer, Observer) { layer->setFilter(NullFilter()); EXPECT_TRUE(filterChanged); + // Notifies observer on visibility change. + bool visibilityChanged = false; + observer.layerVisibilityChanged = [&] (Layer& layer_) { + EXPECT_EQ(layer.get(), &layer_); + visibilityChanged = true; + }; + layer->setVisibility(VisibilityType::None); + EXPECT_TRUE(visibilityChanged); + // Notifies observer on paint property change. bool paintPropertyChanged = false; observer.layerPaintPropertyChanged = [&] (Layer& layer_) { @@ -244,6 +253,11 @@ TEST(Layer, Observer) { layer->setLineCap(lineCap); EXPECT_TRUE(layoutPropertyChanged); + // Does not notify observer on no-op visibility change. + visibilityChanged = false; + layer->setVisibility(VisibilityType::None); + EXPECT_FALSE(visibilityChanged); + // Does not notify observer on no-op paint property change. paintPropertyChanged = false; layer->setLineColor(color);