summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mbgl/algorithm/update_renderables.hpp9
-rw-r--r--test/algorithm/update_renderables.test.cpp50
2 files changed, 54 insertions, 5 deletions
diff --git a/src/mbgl/algorithm/update_renderables.hpp b/src/mbgl/algorithm/update_renderables.hpp
index 5fbe0d943f..57cd4f41ec 100644
--- a/src/mbgl/algorithm/update_renderables.hpp
+++ b/src/mbgl/algorithm/update_renderables.hpp
@@ -21,7 +21,7 @@ void updateRenderables(GetTileFn getTile,
const IdealTileIDs& idealTileIDs,
const Range<uint8_t>& zoomRange,
const uint8_t dataTileZoom) {
- std::unordered_set<UnwrappedTileID> checked;
+ std::unordered_set<OverscaledTileID> checked;
bool covered;
int32_t overscaledZ;
@@ -85,14 +85,13 @@ void updateRenderables(GetTileFn getTile,
// We couldn't find child tiles that entirely cover the ideal tile.
for (overscaledZ = dataTileZoom - 1; overscaledZ >= zoomRange.min; --overscaledZ) {
const auto parentDataTileID = idealDataTileID.scaledTo(overscaledZ);
- const auto parentRenderTileID = parentDataTileID.toUnwrapped();
- if (checked.find(parentRenderTileID) != checked.end()) {
+ if (checked.find(parentDataTileID) != checked.end()) {
// Break parent tile ascent, this route has been checked by another child
// tile before.
break;
} else {
- checked.emplace(parentRenderTileID);
+ checked.emplace(parentDataTileID);
}
tile = getTile(parentDataTileID);
@@ -117,7 +116,7 @@ void updateRenderables(GetTileFn getTile,
parentIsLoaded = tile->isLoaded();
if (tile->isRenderable()) {
- renderTile(parentRenderTileID, *tile);
+ renderTile(parentDataTileID.toUnwrapped(), *tile);
// Break parent tile ascent, since we found one.
break;
}
diff --git a/test/algorithm/update_renderables.test.cpp b/test/algorithm/update_renderables.test.cpp
index 7d6a0fcb13..e142758f29 100644
--- a/test/algorithm/update_renderables.test.cpp
+++ b/test/algorithm/update_renderables.test.cpp
@@ -1259,3 +1259,53 @@ TEST(UpdateRenderables, LoadRequiredIfIdealTileCantBeFound) {
}),
log);
}
+
+// Tests overzooming a 0/0/0 tile to zoom level 4, when the maxzoom is 2.
+TEST(UpdateRenderables, LoadOverscaledMaxZoomTile) {
+ ActionLog log;
+ MockSource source;
+ auto getTileData = getTileDataFn(log, source.dataTiles);
+ auto createTileData = createTileDataFn(log, source.dataTiles);
+ auto retainTileData = retainTileDataFn(log);
+ auto renderTile = renderTileFn(log);
+
+ source.zoomRange.max = 2;
+ source.idealTiles.emplace(UnwrappedTileID{ 2, 0, 0 });
+
+ auto tile_4_2_0_0 = source.createTileData(OverscaledTileID{ 4, 0, { 2, 0, 0 } });
+ tile_4_2_0_0->renderable = false;
+ tile_4_2_0_0->triedOptional = true;
+ tile_4_2_0_0->loaded = true;
+
+ auto tile_3_2_0_0 = source.createTileData(OverscaledTileID{ 3, 0, { 2, 0, 0 } });
+ tile_3_2_0_0->renderable = false;
+ tile_3_2_0_0->triedOptional = true;
+ tile_3_2_0_0->loaded = true;
+
+ auto tile_2_2_0_0 = source.createTileData(OverscaledTileID{ 2, 0, { 2, 0, 0 } });
+ tile_2_2_0_0->renderable = false;
+ tile_2_2_0_0->triedOptional = true;
+ tile_2_2_0_0->loaded = true;
+
+ // Tile level 1 won't be overscaled.
+ auto tile_1_1_0_0 = source.createTileData(OverscaledTileID{ 1, 0, { 1, 0, 0 } });
+ tile_1_1_0_0->renderable = true;
+ tile_1_1_0_0->triedOptional = true;
+ tile_1_1_0_0->loaded = true;
+
+ algorithm::updateRenderables(getTileData, createTileData, retainTileData, renderTile,
+ source.idealTiles, source.zoomRange, 4);
+ EXPECT_EQ(ActionLog({
+ GetTileDataAction{ { 4, 0, { 2, 0, 0 } }, Found },
+ RetainTileDataAction{ { 4, 0, { 2, 0, 0 } }, TileNecessity::Required },
+ GetTileDataAction{ { 5, 0, { 2, 0, 0 } }, NotFound },
+ GetTileDataAction{ { 3, 0, { 2, 0, 0 } }, Found },
+ RetainTileDataAction{ { 3, 0, { 2, 0, 0 } }, TileNecessity::Required },
+ GetTileDataAction{ { 2, 0, { 2, 0, 0 } }, Found },
+ RetainTileDataAction{ { 2, 0, { 2, 0, 0 } }, TileNecessity::Required },
+ GetTileDataAction{ { 1, 0, { 1, 0, 0 } }, Found },
+ RetainTileDataAction{ { 1, 0, { 1, 0, 0 } }, TileNecessity::Required },
+ RenderTileAction{ { 1, 0, 0 }, *tile_1_1_0_0 },
+ }),
+ log);
+}