diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index c84e23bb5..b32271a23 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -50,6 +50,7 @@ RenderBackgroundLayer::~RenderBackgroundLayer() = default; void RenderBackgroundLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index ed03edd4f..94ecb20ed 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -68,6 +68,7 @@ RenderCircleLayer::RenderCircleLayer(Immutable _impl) void RenderCircleLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 98f5f2267..c70086ca1 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -54,6 +54,7 @@ RenderFillExtrusionLayer::~RenderFillExtrusionLayer() = default; void RenderFillExtrusionLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index effd117bc..213d2aa53 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -66,6 +66,7 @@ RenderFillLayer::~RenderFillLayer() = default; void RenderFillLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 03f76378d..28405353e 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -50,6 +50,7 @@ RenderHeatmapLayer::~RenderHeatmapLayer() = default; void RenderHeatmapLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); updateColorRamp(); } diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index d3b8fdfb2..3e55dc455 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -65,6 +65,7 @@ std::array RenderHillshadeLayer::getLight(const PaintParameters& param void RenderHillshadeLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } #if MLN_DRAWABLE_RENDERER diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index c3bec215d..e93bf8791 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -63,6 +63,7 @@ RenderLineLayer::~RenderLineLayer() = default; void RenderLineLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); updateColorRamp(); #if MLN_RENDER_BACKEND_METAL diff --git a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp index e123a1828..6462e328e 100644 --- a/src/mbgl/renderer/layers/render_location_indicator_layer.cpp +++ b/src/mbgl/renderer/layers/render_location_indicator_layer.cpp @@ -944,6 +944,7 @@ RenderLocationIndicatorLayer::~RenderLocationIndicatorLayer() { void RenderLocationIndicatorLayer::transition(const TransitionParameters& parameters) { unevaluated = impl(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderLocationIndicatorLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 837741d84..a097b04bb 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -47,6 +47,7 @@ RenderRasterLayer::~RenderRasterLayer() = default; void RenderRasterLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); + styleDependencies = unevaluated.getDependencies(); } void RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 760450a28..76bd8c38a 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -364,6 +364,7 @@ void RenderSymbolLayer::transition(const TransitionParameters& parameters) { unevaluated = impl_cast(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); hasFormatSectionOverrides = SymbolLayerPaintPropertyOverrides::hasOverrides( impl_cast(baseImpl).layout.get()); + styleDependencies = unevaluated.getDependencies(); } void RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) { diff --git a/test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png b/test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png new file mode 100644 index 000000000..c0a4862b2 Binary files /dev/null and b/test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png differ diff --git a/test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png b/test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png new file mode 100644 index 000000000..dbf182174 Binary files /dev/null and b/test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png differ diff --git a/test/fixtures/map/style_update_zoom_dependency/style.json b/test/fixtures/map/style_update_zoom_dependency/style.json new file mode 100644 index 000000000..9446fba90 --- /dev/null +++ b/test/fixtures/map/style_update_zoom_dependency/style.json @@ -0,0 +1,13 @@ +{ + "version": 8, + "sources": {}, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#ff0000" + } + } + ] +} diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 82b322599..8c44e52da 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -19,8 +19,10 @@ #include #include #include -#include +#include #include +#include +#include #include #include #include @@ -29,8 +31,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -1866,3 +1868,31 @@ TEST(Map, ObserveTileLifecycle) { EXPECT_FALSE(parsing); } } + +TEST(BackgroundLayer, StyleUpdateZoomDependency) { + using namespace mbgl::style::expression::dsl; + + MapTest<> test; + test.map.getStyle().loadJSON(util::read_file("test/fixtures/map/style_update_zoom_dependency/style.json")); + test.map.jumpTo(CameraOptions().withZoom(0.0)); + + // Initial render: background should be red at zoom 0 + test::checkImage("test/fixtures/map/style_update_zoom_dependency/initial_red", + test.frontend.render(test.map).image, + 0.0006, + 0.1); + + // Update background layer to use zoom-dependent color + auto layer = static_cast(test.map.getStyle().getLayer("background")); + layer->setBackgroundColor(PropertyExpression( + interpolate(linear(), zoom(), 0.0, literal(Color::red()), 14.0, literal(Color::green())))); + + test.frontend.render(test.map); + + // Change zoom to 14 and re-render + test.map.jumpTo(CameraOptions().withZoom(14.0)); + test::checkImage("test/fixtures/map/style_update_zoom_dependency/after_update_green", + test.frontend.render(test.map).image, + 0.0006, + 0.1); +}