From c4f33fab328abfa5f3edf8bc5b9badd191587e9b Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Mon, 24 Mar 2025 09:44:01 -0700 Subject: [PATCH] Add regression test for #3323, bug in layer dependency tracking (#3326) Co-authored-by: Bart Louwers --- .../layers/render_background_layer.cpp | 1 + .../renderer/layers/render_circle_layer.cpp | 1 + .../layers/render_fill_extrusion_layer.cpp | 1 + .../renderer/layers/render_fill_layer.cpp | 1 + .../renderer/layers/render_heatmap_layer.cpp | 1 + .../layers/render_hillshade_layer.cpp | 1 + .../renderer/layers/render_line_layer.cpp | 1 + .../render_location_indicator_layer.cpp | 1 + .../renderer/layers/render_raster_layer.cpp | 1 + .../renderer/layers/render_symbol_layer.cpp | 1 + .../after_update_green/expected.png | Bin 0 -> 913 bytes .../initial_red/expected.png | Bin 0 -> 853 bytes .../style_update_zoom_dependency/style.json | 13 +++++++ test/map/map.test.cpp | 34 ++++++++++++++++-- 14 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/map/style_update_zoom_dependency/after_update_green/expected.png create mode 100644 test/fixtures/map/style_update_zoom_dependency/initial_red/expected.png create mode 100644 test/fixtures/map/style_update_zoom_dependency/style.json 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 0000000000000000000000000000000000000000..c0a4862b278dc0f4fbfa6ab751800faa1eec631a GIT binary patch literal 913 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFd2u~Nskcv5P&lw6bFmNy^ z{+@nK!u~{H!%WtDr44b0kiwU8RrWF4Qa&$WR%7sV L^>bP0l+XkKc@roP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dbf182174f01aa3cca50d9f932add770f449ae7e GIT binary patch literal 853 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJD{8BZ6-kcv5PuPkI_Fc4_j zaJ&9xS&z8Ok;OM|%U#&=n&Ckoqr;3*G#UaUF9dF|7ax;-%+Ab`56mtMp00i_>zopr E0G5LC=l}o! literal 0 HcmV?d00001 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); +}