diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-03-23 09:42:15 +0100 |
---|---|---|
committer | Paolo Angelelli <paolo.angelelli@qt.io> | 2017-03-23 13:56:18 +0000 |
commit | 3b5e4880082b2a04c4537414759f61876503feb0 (patch) | |
tree | 6614944d4c2a10fe6222ce748e336114a9a5e888 /src/location/maps/qgeotilerequestmanager.cpp | |
parent | bf356670158e95e4ba7fbeea774964e535bf6886 (diff) | |
download | qtlocation-3b5e4880082b2a04c4537414759f61876503feb0.tar.gz |
Enable overzooming tiles in qgeotiledmapscene
With this patch tiles from previous zoom levels can be temporarily
used to fill the map until the actual tiles are fetched.
Task-number: QTBUG-23659
Change-Id: I7db68c82217cb18a9bec2abdc3e679fc0bfb6b94
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src/location/maps/qgeotilerequestmanager.cpp')
-rw-r--r-- | src/location/maps/qgeotilerequestmanager.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/location/maps/qgeotilerequestmanager.cpp b/src/location/maps/qgeotilerequestmanager.cpp index 1409856a..7672a98f 100644 --- a/src/location/maps/qgeotilerequestmanager.cpp +++ b/src/location/maps/qgeotilerequestmanager.cpp @@ -53,7 +53,7 @@ public: QGeoTiledMap *m_map; QPointer<QGeoTiledMappingManagerEngine> m_engine; - QList<QSharedPointer<QGeoTileTexture> > requestTiles(const QSet<QGeoTileSpec> &tiles); + QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > requestTiles(const QSet<QGeoTileSpec> &tiles); void tileError(const QGeoTileSpec &tile, const QString &errorString); QHash<QGeoTileSpec, int> m_retries; @@ -74,7 +74,7 @@ QGeoTileRequestManager::~QGeoTileRequestManager() } -QList<QSharedPointer<QGeoTileTexture> > QGeoTileRequestManager::requestTiles(const QSet<QGeoTileSpec> &tiles) +QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > QGeoTileRequestManager::requestTiles(const QSet<QGeoTileSpec> &tiles) { return d_ptr->requestTiles(tiles); } @@ -107,7 +107,7 @@ QGeoTileRequestManagerPrivate::~QGeoTileRequestManagerPrivate() { } -QList<QSharedPointer<QGeoTileTexture> > QGeoTileRequestManagerPrivate::requestTiles(const QSet<QGeoTileSpec> &tiles) +QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > QGeoTileRequestManagerPrivate::requestTiles(const QSet<QGeoTileSpec> &tiles) { QSet<QGeoTileSpec> cancelTiles = m_requested - tiles; QSet<QGeoTileSpec> requestTiles = tiles - m_requested; @@ -117,7 +117,7 @@ QList<QSharedPointer<QGeoTileTexture> > QGeoTileRequestManagerPrivate::requestTi typedef QSet<QGeoTileSpec>::const_iterator iter; - QList<QSharedPointer<QGeoTileTexture> > cachedTex; + QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > cachedTex; // remove tiles in cache from request tiles if (!m_engine.isNull()) { @@ -127,8 +127,23 @@ QList<QSharedPointer<QGeoTileTexture> > QGeoTileRequestManagerPrivate::requestTi QGeoTileSpec tile = *i; QSharedPointer<QGeoTileTexture> tex = m_engine->getTileTexture(tile); if (tex) { - cachedTex << tex; + cachedTex.insert(tile, tex); cached.insert(tile); + } else { + // Try to use textures from lower zoom levels, but still request the proper tile + QGeoTileSpec spec = tile; + const int endRange = qMax(0, tile.zoom() - 4); // Using up to 4 zoom levels up. 4 is arbitrary. + for (int z = tile.zoom() - 1; z >= endRange; z--) { + int denominator = 1 << (tile.zoom() - z); + spec.setZoom(z); + spec.setX(tile.x() / denominator); + spec.setY(tile.y() / denominator); + QSharedPointer<QGeoTileTexture> t = m_engine->getTileTexture(spec); + if (t) { + cachedTex.insert(tile, t); + break; + } + } } } } |