From 1d46e83e3087f0d392c74c40d6b562359ed91576 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Tue, 28 Jun 2016 10:23:48 +0300 Subject: [PATCH] [core] Use the right types for zoom scale logic 32 bit integers should be enough for zoom scale logic. In shape annotation logic, 'maxAmountOfTileFeatures' requires 64 bits because we are multiplying the zoom scale with the extent, which might give a number higher than std::numeric_limits::max(). --- include/mbgl/util/constants.hpp | 2 +- src/mbgl/annotation/shape_annotation_impl.cpp | 4 ++-- src/mbgl/map/transform_state.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/mbgl/util/constants.hpp b/include/mbgl/util/constants.hpp index 607c388e952..3c0b3eb93ed 100644 --- a/include/mbgl/util/constants.hpp +++ b/include/mbgl/util/constants.hpp @@ -18,7 +18,7 @@ constexpr float tileSize = 512; * In practice, all features are converted to this extent before being added. * * Positions are stored as signed 16bit integers. - * One bit is lost for signedness to support featuers extending past the left edge of the tile. + * One bit is lost for signedness to support features extending past the left edge of the tile. * One bit is lost because the line vertex buffer packs 1 bit of other data into the int. * One bit is lost to support features extending past the extent on the right edge of the tile. * This leaves us with 2^13 = 8192 diff --git a/src/mbgl/annotation/shape_annotation_impl.cpp b/src/mbgl/annotation/shape_annotation_impl.cpp index a61611cf184..f22debdd812 100644 --- a/src/mbgl/annotation/shape_annotation_impl.cpp +++ b/src/mbgl/annotation/shape_annotation_impl.cpp @@ -90,8 +90,8 @@ void ShapeAnnotationImpl::updateTileData(const CanonicalTileID& tileID, Annotati static const double baseTolerance = 4; if (!shapeTiler) { - const uint64_t maxAmountOfTiles = 1 << maxZoom; - const double tolerance = baseTolerance / (maxAmountOfTiles * util::EXTENT); + const uint64_t maxAmountOfTileFeatures = (1ull << maxZoom) * util::EXTENT; + const double tolerance = baseTolerance / maxAmountOfTileFeatures; std::vector features = { ShapeAnnotationGeometry::visit(geometry(), ToGeoJSONVT(tolerance)) diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index fab5991de8f..3d5a1a67986 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -16,13 +16,13 @@ TransformState::TransformState(ConstrainMode constrainMode_, ViewportMode viewpo #pragma mark - Matrix void TransformState::matrixFor(mat4& matrix, const UnwrappedTileID& tileID) const { - const uint64_t tileScale = 1ull << tileID.canonical.z; + const uint32_t tileScale = 1u << tileID.canonical.z; const double s = worldSize() / tileScale; matrix::identity(matrix); matrix::translate(matrix, matrix, - static_cast(tileID.canonical.x + tileID.wrap * tileScale) * s, - static_cast(tileID.canonical.y) * s, 0); + int64_t(tileID.canonical.x + tileID.wrap * tileScale) * s, + int64_t(tileID.canonical.y) * s, 0); matrix::scale(matrix, matrix, s / util::EXTENT, s / util::EXTENT, 1); }