summaryrefslogtreecommitdiff
path: root/include/mbgl/tile/tile_id.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/tile/tile_id.hpp')
-rw-r--r--include/mbgl/tile/tile_id.hpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/include/mbgl/tile/tile_id.hpp b/include/mbgl/tile/tile_id.hpp
index 0457dd3a07..e5f46584ef 100644
--- a/include/mbgl/tile/tile_id.hpp
+++ b/include/mbgl/tile/tile_id.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/util/constants.hpp>
+#include <mbgl/util/optional.hpp>
#include <cstdint>
#include <array>
@@ -58,6 +59,7 @@ public:
uint32_t overscaleFactor() const;
OverscaledTileID scaledTo(uint8_t z) const;
UnwrappedTileID toUnwrapped() const;
+ optional<OverscaledTileID> parent() const;
const uint8_t overscaledZ;
const int16_t wrap;
@@ -191,6 +193,17 @@ inline UnwrappedTileID OverscaledTileID::toUnwrapped() const {
return { wrap, canonical };
}
+inline optional<OverscaledTileID> OverscaledTileID::parent() const {
+ if (overscaledZ == 0) {
+ return {};
+ } else if (overscaledZ > canonical.z) {
+ return { OverscaledTileID{ static_cast<uint8_t>(overscaledZ - 1), wrap, canonical } };
+ } else {
+ return { OverscaledTileID{ static_cast<uint8_t>(overscaledZ - 1), wrap,
+ static_cast<uint8_t>(canonical.z - 1), static_cast<uint8_t>(canonical.x / 2), static_cast<uint8_t>(canonical.y / 2) }};
+ }
+}
+
inline UnwrappedTileID::UnwrappedTileID(uint8_t z_, int64_t x_, int64_t y_)
: wrap((x_ < 0 ? x_ - (1ll << z_) + 1 : x_) / (1ll << z_)),
canonical(