diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-12-17 15:50:09 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-12-18 13:48:52 +0200 |
commit | 648392585e47806e325e4d850b9c3b28562420a3 (patch) | |
tree | dab1f037d17bc9f9dcb2155fca73465c1153f730 /render-test | |
parent | 64a37ceb0547a6ac48196426c513a8fdd6e57f70 (diff) | |
download | qtlocation-mapboxgl-648392585e47806e325e4d850b9c3b28562420a3.tar.gz |
[test runner] Show all tiles independently in Tile mode
Diffstat (limited to 'render-test')
-rw-r--r-- | render-test/runner.cpp | 51 |
1 files changed, 44 insertions, 7 deletions
diff --git a/render-test/runner.cpp b/render-test/runner.cpp index 7b356eb4de..804ae08a9a 100644 --- a/render-test/runner.cpp +++ b/render-test/runner.cpp @@ -632,6 +632,23 @@ void resetContext(const TestMetadata& metadata, TestContext& ctx) { map.getStyle().loadJSON(serializeJsonValue(metadata.document)); } +LatLng getTileCenterCoordinates(const UnwrappedTileID& tileId) { + double scale = (1 << tileId.canonical.z); + Point<double> tileCenter{(tileId.canonical.x + 0.5) * util::tileSize, (tileId.canonical.y + 0.5) * util::tileSize}; + return Projection::unproject(tileCenter, scale); +} + +constexpr auto kTileSizeUint = uint32_t(util::tileSize); + +uint32_t getImageTileOffset(const std::set<uint32_t>& dims, uint32_t dim) { + auto it = dims.find(dim); + if (it == dims.end()) { + assert(false); + return 0; + } + return std::distance(dims.begin(), it) * kTileSizeUint; +} + } // namespace TestRunner::Impl::Impl(const TestMetadata& metadata) @@ -696,21 +713,41 @@ void TestRunner::run(TestMetadata& metadata) { resetContext(metadata, ctx); auto camera = map.getStyle().getDefaultCamera(); - HeadlessFrontend::RenderResult result; + HeadlessFrontend::RenderResult result{}; if (metadata.mapMode == MapMode::Tile) { assert(camera.zoom); assert(camera.center); auto tileIds = util::tileCover(map.latLngBoundsForCamera(camera), *camera.zoom); + assert(!tileIds.empty()); + std::set<uint32_t> xDims; + std::set<uint32_t> yDims; + for (const auto& tileId : tileIds) { - auto cameraForTile{camera}; - double scale = (1 << tileId.canonical.z) / util::tileSize; - Point<double> tileCenter{tileId.canonical.x + 0.5, tileId.canonical.y + 0.5}; - cameraForTile.withCenter(Projection::unproject(tileCenter, scale)); + xDims.insert(tileId.canonical.x); + yDims.insert(tileId.canonical.y); + assert(tileId.canonical.z == uint8_t(*camera.zoom)); + } + result.image = + PremultipliedImage({uint32_t(xDims.size()) * kTileSizeUint, uint32_t(yDims.size()) * kTileSizeUint}); + for (const auto& tileId : tileIds) { + resetContext(metadata, ctx); + auto cameraForTile{camera}; + cameraForTile.withCenter(getTileCenterCoordinates(tileId)); map.jumpTo(cameraForTile); - result = runTest(metadata, ctx); - break; + + auto resultForTile = runTest(metadata, ctx); + if (!resultForTile.image.valid()) { + metadata.errorMessage = "Failed rendering tile: " + util::toString(tileId); + return; + } + + auto xOffset = getImageTileOffset(xDims, tileId.canonical.x); + auto yOffset = getImageTileOffset(yDims, tileId.canonical.y); + PremultipliedImage::copy( + resultForTile.image, result.image, {0, 0}, {xOffset, yOffset}, resultForTile.image.size); + result.stats += resultForTile.stats; } } else { map.jumpTo(camera); |