From 52072c720374770e7a0cc52bd44a9ea1b95f4cb2 Mon Sep 17 00:00:00 2001 From: Jussi Laitinen Date: Wed, 14 Apr 2010 10:43:36 +0300 Subject: [PATCH] Modified MapView viewportUpdateMode. --- src/map/mapengine.cpp | 25 ++---- src/map/mapengine.h | 40 +++++++--- src/map/mapview.cpp | 1 + tests/testmap/testmapengine/testmapengine.cpp | 103 ++++++++++++------------- 4 files changed, 88 insertions(+), 81 deletions(-) diff --git a/src/map/mapengine.cpp b/src/map/mapengine.cpp index 5dbdcdc..f759384 100644 --- a/src/map/mapengine.cpp +++ b/src/map/mapengine.cpp @@ -96,6 +96,8 @@ void MapEngine::parseURL(const QUrl &url, int &zoom, int &x, int &y) void MapEngine::mapImageReceived(const QUrl &url, const QPixmap &pixmap) { + //qDebug() << __PRETTY_FUNCTION__; + if (mapTilesInScene.contains(url.toString())) { int zoom = -1; int x = -1; @@ -142,8 +144,8 @@ void MapEngine::setLocation(QPointF sceneCoordinate) emit locationChanged(m_sceneCoordinate); if (centerTileChanged(sceneCoordinate)) { - calculateTileGrid(sceneCoordinate); - removeTilesOutOfBounds(); + calculateNewTiles(sceneCoordinate); + removeOldTiles(); } } @@ -156,7 +158,7 @@ bool MapEngine::centerTileChanged(QPointF sceneCoordinate) return (centerTile != temp); } -void MapEngine::calculateTileGrid(QPointF sceneCoordinate) +void MapEngine::calculateNewTiles(QPointF sceneCoordinate) { //qDebug() << __PRETTY_FUNCTION__; @@ -195,7 +197,7 @@ void MapEngine::calculateTileGrid(QPointF sceneCoordinate) } } -void MapEngine::removeTilesOutOfBounds() +void MapEngine::removeOldTiles() { //qDebug() << __PRETTY_FUNCTION__; @@ -225,7 +227,6 @@ void MapEngine::removeTilesOutOfBounds() } } } - } void MapEngine::viewResized(const QSize &size) @@ -245,7 +246,7 @@ void MapEngine::zoomIn() setZValues(); /// @todo START FETCHING TILES - calculateTileGrid(m_sceneCoordinate); + calculateNewTiles(m_sceneCoordinate); } void MapEngine::zoomOut() @@ -259,17 +260,7 @@ void MapEngine::zoomOut() setZValues(); /// @todo START FETCHING TILES - calculateTileGrid(m_sceneCoordinate); -} - -void MapEngine::setZoomLevel(int zoomLevel) -{ - m_zoomLevel = zoomLevel; -} - -int MapEngine::getZoomLevel() -{ - return m_zoomLevel; + calculateNewTiles(m_sceneCoordinate); } void MapEngine::setZValues() diff --git a/src/map/mapengine.h b/src/map/mapengine.h index 09ceaaf..d64a6a4 100644 --- a/src/map/mapengine.h +++ b/src/map/mapengine.h @@ -126,15 +126,6 @@ public: return QPointF(x*z*TILE_SIZE_X, y*z*TILE_SIZE_Y); } - QRect calculateGrid(QPointF sceneCoordinate); - - void removeTilesOutOfBounds(); - - int getZoomLevel(); - void setZoomLevel(int zoomLevel); - - void calculateTileGrid(QPointF sceneCoordinate); - public slots: /** * @brief Slot for setting current view location @@ -179,6 +170,35 @@ private: int tileMaxValue(int zoomLevel); + /** + * @brief Calculates grid of tile coordinates from current scene coordinate. + * + * Grid size is calculated from view size and scene's current center coordinate. + * + * @param sceneCoordinate scene's current center coordinate + * @return QRect grid of tile coordinates + */ + QRect calculateGrid(QPointF sceneCoordinate); + + /** + * @brief Calculate new tiles to fetch. + * + * @param sceneCoordinate scene's center coordinate + */ + void calculateNewTiles(QPointF sceneCoordinate); + + /** + * @brief Removes tiles which are out of view bounds. + */ + void removeOldTiles(); + + /** + * @brief Checks if center tile has changed. + * + * @param sceneCoordinate scene's center coordinate + * @return bool true if center tile changed, false otherwise + */ + bool centerTileChanged(QPointF sceneCoordinate); private slots: /** @@ -223,8 +243,6 @@ signals: private: - bool centerTileChanged(QPointF sceneCoordinate); - MapScene *m_mapScene; ///< Scene for map tiles MapFetcher *m_mapFetcher; ///< Fetcher for map tiles int m_zoomLevel; ///< Current zoom level diff --git a/src/map/mapview.cpp b/src/map/mapview.cpp index 8f457e0..f07a4df 100644 --- a/src/map/mapview.cpp +++ b/src/map/mapview.cpp @@ -37,6 +37,7 @@ MapView::MapView(QWidget *parent) : QGraphicsView(parent) // use opengl for desktop to gain some performance in map view // opengl can't be used in scrathbox setViewport(new QGLWidget); + this->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); #endif // Q_WS_MAEMO_5 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); diff --git a/tests/testmap/testmapengine/testmapengine.cpp b/tests/testmap/testmapengine/testmapengine.cpp index 6ce6ace..141c363 100644 --- a/tests/testmap/testmapengine/testmapengine.cpp +++ b/tests/testmap/testmapengine/testmapengine.cpp @@ -30,11 +30,11 @@ private slots: //void convertTileNumberToSceneCoordinate(); // void setViewLocation(); //void convertLatLonToTile(); - void calculateRect(); - void setLocation(); +// void calculateRect(); + void moveLocation(); // void removeTilesOutOfBounds(); - void calculateTileGrid(); - void convert(); +// void calculateTileGrid(); +// void convert(); }; /** @@ -72,75 +72,72 @@ private slots: // QCOMPARE(MapEngine::convertLatLonToTile(100, QPointF(20.0, 65.0)), QPoint(UNDEFINED, UNDEFINED)); //} -void TestMapEngine::calculateRect() -{ - MapEngine engine; - engine.viewResized(QSize(800, 480)); - engine.setZoomLevel(14); - - int zoomFactor = 1 << (MAX_ZOOM_LEVEL - engine.getZoomLevel()); - - QRect grid1 = QRect(-1, 0, 6, 4); - QCOMPARE(engine.calculateGrid(QPointF(550.23*zoomFactor, 550.23*zoomFactor)), grid1); - - QRect grid2 = QRect(-3, -2, 6, 4); - QCOMPARE(engine.calculateGrid(QPointF(0.23*zoomFactor, 0.23*zoomFactor)), grid2); - - QRect grid3 = QRect(1017, 498, 6, 4); - QCOMPARE(engine.calculateGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_Y*zoomFactor)), grid3); - - engine.viewResized(QSize(1280, 1024)); - - QRect grid4 = QRect(1016, 497, 8, 7); - QCOMPARE(engine.calculateGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_Y*zoomFactor)), grid4); -} +//void TestMapEngine::calculateRect() +//{ +// MapEngine engine; +// engine.viewResized(QSize(800, 480)); +// engine.setZoomLevel(14); +// +// int zoomFactor = 1 << (MAX_ZOOM_LEVEL - engine.getZoomLevel()); +// +// QRect grid1 = QRect(-1, 0, 6, 4); +// QCOMPARE(engine.calculateGrid(QPointF(550.23*16, 550.23*zoomFactor)), grid1); +// +// QRect grid2 = QRect(-3, -2, 6, 4); +// QCOMPARE(engine.calculateGrid(QPointF(0.23*zoomFactor, 0.23*zoomFactor)), grid2); +// +// QRect grid3 = QRect(1017, 498, 6, 4); +// QCOMPARE(engine.calculateGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_Y*zoomFactor)), grid3); +// +// engine.viewResized(QSize(1280, 1024)); +// +// QRect grid4 = QRect(1016, 497, 8, 7); +// QCOMPARE(engine.calculateGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_Y*zoomFactor)), grid4); +//} -void TestMapEngine::setLocation() +void TestMapEngine::moveLocation() { MapEngine engine; - engine.setZoomLevel(14); engine.viewResized(QSize(800, 480)); - int zoomFactor = 1 << (MAX_ZOOM_LEVEL - engine.getZoomLevel()); - QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(QUrl))); QTest::qWait(1000); fetchImageSpy.clear(); - engine.setLocation(QPointF(1220.23*zoomFactor, 1220.23*zoomFactor)); + engine.setLocation(QPointF(1220.23*16, 1220.23*16)); QTest::qWait(1000); QCOMPARE(fetchImageSpy.count(), 6*4); fetchImageSpy.clear(); //Move one tile right and one down = 9 new tiles - engine.setLocation(QPointF((1220.23+TILE_SIZE_X)*zoomFactor, (1220.23+TILE_SIZE_Y)*zoomFactor)); + engine.setLocation(QPointF((1220.23+TILE_SIZE_X)*16, (1220.23+TILE_SIZE_Y)*16)); QTest::qWait(1000); QCOMPARE(fetchImageSpy.count(), 9); fetchImageSpy.clear(); } -void TestMapEngine::convert() -{ - int zoomFactor = 1 << (MAX_ZOOM_LEVEL - 14); - - QPoint tileNumber = QPoint(1020, 500); - QPointF sceneCoordinate = QPointF(tileNumber.x()*TILE_SIZE_X*zoomFactor, tileNumber.y()*TILE_SIZE_Y*zoomFactor); - QPoint tile = MapEngine::convertSceneCoordinateToTileNumber(14, sceneCoordinate); - - QCOMPARE(tileNumber, tile); -} - -void TestMapEngine::calculateTileGrid() -{ - MapEngine engine; - - engine.viewResized(QSize(800, 480)); - engine.setZoomLevel(14); - - int zoomFactor = 1 << (MAX_ZOOM_LEVEL - engine.getZoomLevel()); +//void TestMapEngine::convert() +//{ +// int zoomFactor = 1 << (MAX_ZOOM_LEVEL - 14); +// +// QPoint tileNumber = QPoint(1020, 500); +// QPointF sceneCoordinate = QPointF(tileNumber.x()*TILE_SIZE_X*zoomFactor, tileNumber.y()*TILE_SIZE_Y*zoomFactor); +// QPoint tile = MapEngine::convertSceneCoordinateToTileNumber(14, sceneCoordinate); +// +// QCOMPARE(tileNumber, tile); +//} - engine.calculateTileGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_X*zoomFactor)); -} +//void TestMapEngine::calculateTileGrid() +//{ +// MapEngine engine; +// +// engine.viewResized(QSize(800, 480)); +// engine.setZoomLevel(14); +// +// int zoomFactor = 1 << (MAX_ZOOM_LEVEL - engine.getZoomLevel()); +// +// engine.calculateTileGrid(QPointF(1020*TILE_SIZE_X*zoomFactor, 500*TILE_SIZE_X*zoomFactor)); +//} //void TestMapEngine::removeTilesOutOfBounds() //{ -- 1.7.9.5