/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/location/maps #include #include #include #include #include #include #include #include #include #include QT_USE_NAMESPACE struct PositionTestInfo { QString xyString; QString zoomString; QString wString; QString hString; double x; double y; double zoom; double w; double h; }; class tst_QGeoCameraTiles : public QObject { Q_OBJECT private: void row(const PositionTestInfo &pti, int xOffset, int yOffset, int tileX, int tileY, int tileW, int tileH); void test_group(const PositionTestInfo &pti, QList &xVals, QList &wVals, QList &yVals, QList &hVals); private slots: void tilesPlugin(); void tilesMapType(); void tilesPositions(); void tilesPositions_data(); void test_tilted_frustum(); }; void tst_QGeoCameraTiles::row(const PositionTestInfo &pti, int xOffset, int yOffset, int tileX, int tileY, int tileW, int tileH) { double step = 1 / (qPow(2.0, 4.0) * 4); QString row = pti.xyString; row += QStringLiteral(" - "); row += pti.zoomString; row += QStringLiteral(" - ("); row += QString::number(xOffset); row += QStringLiteral(","); row += QString::number(yOffset); row += QStringLiteral(") - "); row += pti.wString; row += QStringLiteral(" x "); row += pti.hString; QList xRow; QList yRow; for (int y = 0; y < tileH; ++y) { for (int x = 0; x < tileW; ++x) { if (tileX + x < 16) xRow << tileX + x; else xRow << tileX + x - 16; yRow << tileY + y; } } QTest::newRow(qPrintable(row)) << pti.x + step * xOffset << pti.y + step * yOffset << pti.zoom << pti.w << pti.h << xRow << yRow; } void tst_QGeoCameraTiles::test_group(const PositionTestInfo &pti, QList &xVals, QList &wVals, QList &yVals, QList &hVals) { for (int x = 0; x < 5; ++x) { for (int y = 0; y < 5; ++y) { row(pti, x, y, xVals.at(x), yVals.at(y), wVals.at(x), hVals.at(y)); } } } void tst_QGeoCameraTiles::test_tilted_frustum() { // ctFull : Full map in the view, all 16 zl2 tiles visible. Using this as control. QGeoCameraData cameraFull; cameraFull.setZoomLevel(2); cameraFull.setCenter(QGeoCoordinate(0,0)); QGeoCameraTiles ctFull; ctFull.setTileSize(64); ctFull.setCameraData(cameraFull); ctFull.setScreenSize(QSize(256, 256)); QGeoCameraData camera; camera.setZoomLevel(2.322); camera.setTilt(30); camera.setCenter(QWebMercator::mercatorToCoord(QDoubleVector2D(0.75, 0.5))); QGeoCameraTiles ct; ct.setTileSize(64); ct.setScreenSize(QSize(320, 180)); ct.setCameraData(camera); QCOMPARE(ct.createTiles(), ctFull.createTiles()); } void tst_QGeoCameraTiles::tilesPlugin() { QGeoCameraData camera; camera.setZoomLevel(4.0); camera.setCenter(QGeoCoordinate(0.0, 0.0)); QGeoCameraTiles ct; ct.setTileSize(16); ct.setCameraData(camera); ct.setScreenSize(QSize(32, 32)); ct.setMapType(QGeoMapType(QGeoMapType::StreetMap, "street map", "street map", false, false, 1, QByteArrayLiteral(""), QGeoCameraCapabilities())); QSet tiles1 = ct.createTiles(); ct.setPluginString("pluginA"); QSet tiles2 = ct.createTiles(); typedef QSet::const_iterator iter; iter i1 = tiles1.constBegin(); iter end1 = tiles1.constEnd(); QSet tiles2_check; for (; i1 != end1; ++i1) { QGeoTileSpec tile = *i1; tiles2_check.insert(QGeoTileSpec("pluginA", tile.mapId(), tile.zoom(), tile.x(), tile.y())); } QCOMPARE(tiles2, tiles2_check); ct.setPluginString("pluginB"); QSet tiles3 = ct.createTiles(); iter i2 = tiles2.constBegin(); iter end2 = tiles2.constEnd(); QSet tiles3_check; for (; i2 != end2; ++i2) { QGeoTileSpec tile = *i2; tiles3_check.insert(QGeoTileSpec("pluginB", tile.mapId(), tile.zoom(), tile.x(), tile.y())); } QCOMPARE(tiles3, tiles3_check); } void tst_QGeoCameraTiles::tilesMapType() { QGeoCameraData camera; camera.setZoomLevel(4.0); camera.setCenter(QGeoCoordinate(0.0, 0.0)); QGeoCameraTiles ct; ct.setTileSize(16); ct.setCameraData(camera); ct.setScreenSize(QSize(32, 32)); ct.setPluginString("pluginA"); QSet tiles1 = ct.createTiles(); QGeoMapType mapType1 = QGeoMapType(QGeoMapType::StreetMap, "street map", "street map", false, false, 1, QByteArrayLiteral(""), QGeoCameraCapabilities()); ct.setMapType(mapType1); QSet tiles2 = ct.createTiles(); typedef QSet::const_iterator iter; iter i1 = tiles1.constBegin(); iter end1 = tiles1.constEnd(); QSet tiles2_check; for (; i1 != end1; ++i1) { QGeoTileSpec tile = *i1; tiles2_check.insert(QGeoTileSpec(tile.plugin(), mapType1.mapId(), tile.zoom(), tile.x(), tile.y())); } QCOMPARE(tiles2, tiles2_check); QGeoMapType mapType2 = QGeoMapType(QGeoMapType::StreetMap, "satellite map", "satellite map", false, false, 2, QByteArrayLiteral(""), QGeoCameraCapabilities()); ct.setMapType(mapType2); QSet tiles3 = ct.createTiles(); iter i2 = tiles2.constBegin(); iter end2 = tiles2.constEnd(); QSet tiles3_check; for (; i2 != end2; ++i2) { QGeoTileSpec tile = *i2; tiles3_check.insert(QGeoTileSpec(tile.plugin(), mapType2.mapId(), tile.zoom(), tile.x(), tile.y())); } QCOMPARE(tiles3, tiles3_check); } void tst_QGeoCameraTiles::tilesPositions() { QFETCH(double, mercatorX); QFETCH(double, mercatorY); QFETCH(double, zoom); QFETCH(double, width); QFETCH(double, height); QFETCH(QList , tilesX); QFETCH(QList , tilesY); QGeoCameraData camera; camera.setZoomLevel(zoom); camera.setCenter(QWebMercator::mercatorToCoord(QDoubleVector2D(mercatorX, mercatorY))); QGeoCameraTiles ct; ct.setTileSize(16); ct.setCameraData(camera); ct.setScreenSize(QSize(qCeil(width), qCeil(height))); QSet tiles; QVERIFY2(tilesX.size() == tilesY.size(), "tilesX and tilesY have different size"); for (int i = 0; i < tilesX.size(); ++i) tiles.insert(QGeoTileSpec("", 0, static_cast(qFloor(zoom)), tilesX.at(i), tilesY.at(i))); QCOMPARE(ct.createTiles(), tiles); } void tst_QGeoCameraTiles::tilesPositions_data() { QTest::addColumn("mercatorX"); QTest::addColumn("mercatorY"); QTest::addColumn("zoom"); QTest::addColumn("width"); QTest::addColumn("height"); QTest::addColumn >("tilesX"); QTest::addColumn >("tilesY"); int t = 16; PositionTestInfo pti; /* This test sets up various viewports onto a 16x16 map, and checks which tiles are visible against those that are expected to be visible. The tests are run in 5 groups, corresponding to where the viewport is centered on the map. The groups are named as follows, with the tile in which the viewport is centered listed in parenthesis: - mid (8, 8) - top (8, 0) - bottom (8, 15) - left (0, 8) - right (15, 8) For each of these groups a number of tests are run, which involve modifying various parameters. If "t" is the width of a tile, the width and height of the viewport take on values including: - (t - 1) - t - (t + 1) - (2t - 1) - 2t - (2t + 1) The viewport is also offset by fractions of a tile in both the x and y directions. The offsets are in quarters of a tile. The diagrams below present a justification for our test expectations. The diagrams show variations in viewport width and x offset into the target tile , although can easily be taken to be the variations in viewport height and y offset into the target tile. The symbols have the following meanings: "+" - tile boundaries "*" - viewport boundary "T" - boundary of tile the viewport is centered on "O" - same as "T" but coincident with the viewport boundary Whenever the viewport boundary is coincident with a tile boundary, the tiles on both sides of the boundary are expected to be fetched. Those tiles are needed in case we perform bilinear antialiasing, provide us with at least a pixel width of tolerance for errors in other parts of the code or the system. There is a decent chance that some or all of those extra tiles will need to be fetched before long, so getting them into the cache sooner rather than later is likely to be beneficial on average. The tests are carried out per viewport height / width. Lists are created of the first tile along an axis that is expected to be in the viewport and for the number of tiles along an axis that are expected to be in the viewport. These lists are used for both the x and y axes, although alternative lists are created for the x axis when the viewport spans the dateline and for the y axis when the viewport is clipped by the top or bottom of the map. These 5 areas are checked at an integral zoom level to see that the expected visible tiles match the actual visible tiles generated by the code under test. After that a fractional zoom level is set and the width and height of the viewport are scaled such that the same tiles should be visible, and the tests are repeated. */ // TODO // nail down semantics, modify tests and code to suite // add corners of the map /* width = t - 1 */ QList mid_tm1x; QList mid_tm1w; QList top_tm1x; QList top_tm1w; QList bottom_tm1x; QList bottom_tm1w; QList left_tm1x; QList left_tm1w; QList right_tm1x; QList right_tm1w; pti.w = t - 1; pti.h = t - 1; pti.wString = QStringLiteral("(1T - 1)"); pti.hString = QStringLiteral("(1T - 1)"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * *+* * + + + + + * + * + + + + + + + + + +*+ T T*T T T + + + + + + + + + + * T * T + + + + * *T* * T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tm1x << 7; mid_tm1w << 2; top_tm1x << 0; top_tm1w << 1; bottom_tm1x << 14; bottom_tm1w << 2; left_tm1x << 15; left_tm1w << 2; right_tm1x << 14; right_tm1w << 2; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *+* * * + + + + + *+ * + + + + + + + + + + +*T T T*T T + + + + + + + + + + *T * T + + + + *T* * * T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tm1x << 7; mid_tm1w << 2; top_tm1x << 0; top_tm1w << 1; bottom_tm1x << 14; bottom_tm1w << 2; left_tm1x << 15; left_tm1w << 2; right_tm1x << 14; right_tm1w << 2; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* * * *+ + + + + +* *+ + + + + + + + + + + T*T T T*T + + + + + + + + + + T* *T + + + + T* * * *T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 1 tile */ mid_tm1x << 8; mid_tm1w << 1; top_tm1x << 0; top_tm1w << 1; bottom_tm1x << 15; bottom_tm1w << 1; left_tm1x << 0; left_tm1w << 1; right_tm1x << 15; right_tm1w << 1; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * *+* + + + + + * +* + + + + + + + + + + T T*T T T*+ + + + + + + + + + T * T* + + + + T * * *T* + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tm1x << 8; mid_tm1w << 2; top_tm1x << 0; top_tm1w << 2; bottom_tm1x << 15; bottom_tm1w << 1; left_tm1x << 0; left_tm1w << 2; right_tm1x << 15; right_tm1w << 2; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * *+* * + + + + + * + * + + + + + + + + + + T T T*T T +*+ + + + + + + + + T * T * + + + + T * *T* * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tm1x << 8; mid_tm1w << 2; top_tm1x << 0; top_tm1w << 2; bottom_tm1x << 15; bottom_tm1w << 1; left_tm1x << 0; left_tm1w << 2; right_tm1x << 15; right_tm1w << 2; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tm1x, mid_tm1w, mid_tm1x, mid_tm1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tm1x, mid_tm1w, top_tm1x, top_tm1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tm1x, mid_tm1w, bottom_tm1x, bottom_tm1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tm1x, left_tm1w, mid_tm1x, mid_tm1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tm1x, right_tm1w, mid_tm1x, mid_tm1w); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tm1x, mid_tm1w, mid_tm1x, mid_tm1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tm1x, mid_tm1w, top_tm1x, top_tm1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tm1x, mid_tm1w, bottom_tm1x, bottom_tm1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tm1x, left_tm1w, mid_tm1x, mid_tm1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tm1x, right_tm1w, mid_tm1x, mid_tm1w); /* width = t */ QList mid_tx; QList mid_tw; QList top_tx; QList top_tw; QList bottom_tx; QList bottom_tw; QList left_tx; QList left_tw; QList right_tx; QList right_tw; pti.w = t; pti.h = t; pti.wString = QStringLiteral("1T"); pti.hString = QStringLiteral("1T"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * + + + + + * + * + + + + + + + + + * + T T O T T + + + + + + + + + + * T * T + + + + * * O * * T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tx << 7; mid_tw << 2; top_tx << 0; top_tw << 1; bottom_tx << 14; bottom_tw << 2; left_tx << 15; left_tw << 2; right_tx << 14; right_tw << 2; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * + + + + + * + * + + + + + + + + + + * T T T O T + + + + + + + + + + * T * T + + + + * O * * * T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tx << 7; mid_tw << 2; top_tx << 0; top_tw << 1; bottom_tx << 14; bottom_tw << 2; left_tx << 15; left_tw << 2; right_tx << 14; right_tw << 2; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * + + + + * * + + + + + + + + + + O T T T O + + + + + + + + + + O O + + + + O * * * O + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_tx << 7; mid_tw << 3; top_tx << 0; top_tw << 2; bottom_tx << 14; bottom_tw << 2; left_tx << 15; left_tw << 3; right_tx << 14; right_tw << 3; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * + + + + + * * + + + + + + + + + + T O T T T * + + + + + + + + + T * T * + + + + T * * * O * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tx << 8; mid_tw << 2; top_tx << 0; top_tw << 2; bottom_tx << 15; bottom_tw << 1; left_tx << 0; left_tw << 2; right_tx << 15; right_tw << 2; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * + + + + + * + * + + + + + + + + + + T T O T T + * + + + + + + + + T * T * + + + + T * * O * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tx << 8; mid_tw << 2; top_tx << 0; top_tw << 2; bottom_tx << 15; bottom_tw << 1; left_tx << 0; left_tw << 2; right_tx << 15; right_tw << 2; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tx, mid_tw, mid_tx, mid_tw); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tx, mid_tw, top_tx, top_tw); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tx, mid_tw, bottom_tx, bottom_tw); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tx, left_tw, mid_tx, mid_tw); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tx, right_tw, mid_tx, mid_tw); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tx, mid_tw, mid_tx, mid_tw); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tx, mid_tw, top_tx, top_tw); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tx, mid_tw, bottom_tx, bottom_tw); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tx, left_tw, mid_tx, mid_tw); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tx, right_tw, mid_tx, mid_tw); /* width = t + 1 */ QList mid_tp1x; QList mid_tp1w; QList top_tp1x; QList top_tp1w; QList bottom_tp1x; QList bottom_tp1w; QList left_tp1x; QList left_tp1w; QList right_tp1x; QList right_tp1w; pti.w = t + 1; pti.h = t + 1; pti.wString = QStringLiteral("(1T + 1)"); pti.hString = QStringLiteral("(1T + 1)"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * *+* * * + + + + + * + * + + + + + + + + +*+ + T T T*T T + + + + + + + + + + * T * T + + + + * * *T* * * T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tp1x << 7; mid_tp1w << 2; top_tp1x << 0; top_tp1w << 1; bottom_tp1x << 14; bottom_tp1w << 2; left_tp1x << 15; left_tp1w << 2; right_tp1x << 14; right_tp1w << 2; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * *+* * * *+ + + + + * + *+ + + + + + + + + +*+ T T T T*T + + + + + + + + + + * T *T + + + + * *T* * * *T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_tp1x << 7; mid_tp1w << 2; top_tp1x << 0; top_tp1w << 1; bottom_tp1x << 14; bottom_tp1w << 2; left_tp1x << 15; left_tp1w << 2; right_tp1x << 14; right_tp1w << 2; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *+* * * *+* + + + + *+ +* + + + + + + + + + +*T T T T T*+ + + + + + + + + + *T T* + + + + *T* * * *T* + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_tp1x << 7; mid_tp1w << 3; top_tp1x << 0; top_tp1w << 2; bottom_tp1x << 14; bottom_tp1w << 2; left_tp1x << 15; left_tp1w << 3; right_tp1x << 14; right_tp1w << 3; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* * * *+* * + + + + +* + * + + + + + + + + + + T*T T T T +*+ + + + + + + + + T* T * + + + + T* * * *T* * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tp1x << 8; mid_tp1w << 2; top_tp1x << 0; top_tp1w << 2; bottom_tp1x << 15; bottom_tp1w << 1; left_tp1x << 0; left_tp1w << 2; right_tp1x << 15; right_tp1w << 2; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * *+* * * + + + + + * + * + + + + + + + + + + T T*T T T + +*+ + + + + + + + T * T * + + + + T * * *T* * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_tp1x << 8; mid_tp1w << 2; top_tp1x << 0; top_tp1w << 2; bottom_tp1x << 15; bottom_tp1w << 1; left_tp1x << 0; left_tp1w << 2; right_tp1x << 15; right_tp1w << 2; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tp1x, mid_tp1w, mid_tp1x, mid_tp1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tp1x, mid_tp1w, top_tp1x, top_tp1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tp1x, mid_tp1w, bottom_tp1x, bottom_tp1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tp1x, left_tp1w, mid_tp1x, mid_tp1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tp1x, right_tp1w, mid_tp1x, mid_tp1w); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_tp1x, mid_tp1w, mid_tp1x, mid_tp1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_tp1x, mid_tp1w, top_tp1x, top_tp1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_tp1x, mid_tp1w, bottom_tp1x, bottom_tp1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_tp1x, left_tp1w, mid_tp1x, mid_tp1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_tp1x, right_tp1w, mid_tp1x, mid_tp1w); /* width = 2t - 1 */ QList mid_t2m1x; QList mid_t2m1w; QList top_t2m1x; QList top_t2m1w; QList bottom_t2m1x; QList bottom_t2m1w; QList left_t2m1x; QList left_t2m1w; QList right_t2m1x; QList right_t2m1w; pti.w = 2 * t - 1; pti.h = 2 * t - 1; pti.wString = QStringLiteral("(2T - 1)"); pti.hString = QStringLiteral("(2T - 1)"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* * * *+* * * *+ + + + +* + *+ + + + + + + +*+ + + T T T T*T + + + + + + + + + +* T *T + + + +* * * *T* * * *T + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 2 tiles */ mid_t2m1x << 7; mid_t2m1w << 2; top_t2m1x << 0; top_t2m1w << 1; bottom_t2m1x << 14; bottom_t2m1w << 2; left_t2m1x << 15; left_t2m1w << 2; right_t2m1x << 14; right_t2m1w << 2; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * *+* * * *+* + + + + * + +* + + + + + + + +*+ + T T T T T*+ + + + + + + + + + * T T* + + + + * * *T* * * *T* + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2m1x << 7; mid_t2m1w << 3; top_t2m1x << 0; top_t2m1w << 2; bottom_t2m1x << 14; bottom_t2m1w << 2; left_t2m1x << 15; left_t2m1w << 3; right_t2m1x << 14; right_t2m1w << 3; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * *+* * * *+* * + + + + * + + * + + + + + + + + +*+ T T T T T +*+ + + + + + + + + * T T * + + + + * *T* * * *T* * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2m1x << 7; mid_t2m1w << 3; top_t2m1x << 0; top_t2m1w << 2; bottom_t2m1x << 14; bottom_t2m1w << 2; left_t2m1x << 15; left_t2m1w << 3; right_t2m1x << 14; right_t2m1w << 3; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *+* * * *+* * * + + + + *+ + * + + + + + + + + + +*T T T T T + +*+ + + + + + + + *T T * + + + + *T* * * *T* * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2m1x << 7; mid_t2m1w << 3; top_t2m1x << 0; top_t2m1w << 2; bottom_t2m1x << 14; bottom_t2m1w << 2; left_t2m1x << 15; left_t2m1w << 3; right_t2m1x << 14; right_t2m1w << 3; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* * * *+* * * *+ + + + +* + *+ + + + + + + + + + T*T T T T + + +*+ + + + + + + T* T *+ + + + T* * * *T* * * *+ + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T Covers: 2 tiles */ mid_t2m1x << 8; mid_t2m1w << 2; top_t2m1x << 0; top_t2m1w << 2; bottom_t2m1x << 15; bottom_t2m1w << 1; left_t2m1x << 0; left_t2m1w << 2; right_t2m1x << 15; right_t2m1w << 2; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2m1x, mid_t2m1w, mid_t2m1x, mid_t2m1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2m1x, mid_t2m1w, top_t2m1x, top_t2m1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2m1x, mid_t2m1w, bottom_t2m1x, bottom_t2m1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2m1x, left_t2m1w, mid_t2m1x, mid_t2m1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2m1x, right_t2m1w, mid_t2m1x, mid_t2m1w); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2m1x, mid_t2m1w, mid_t2m1x, mid_t2m1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2m1x, mid_t2m1w, top_t2m1x, top_t2m1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2m1x, mid_t2m1w, bottom_t2m1x, bottom_t2m1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2m1x, left_t2m1w, mid_t2m1x, mid_t2m1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2m1x, right_t2m1w, mid_t2m1x, mid_t2m1w); /* width = 2t */ QList mid_t2x; QList mid_t2w; QList top_t2x; QList top_t2w; QList bottom_t2x; QList bottom_t2w; QList left_t2x; QList left_t2w; QList right_t2x; QList right_t2w; pti.w = 2 * t; pti.h = 2 * t; pti.wString = QStringLiteral("2T"); pti.hString = QStringLiteral("2T"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * * * * * + + + * + * + + + + + + * + + + T T T T O + + + + + + + + + * T O + + + * * * * O * * * O + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 2 Covers: 4 tiles */ mid_t2x << 6; mid_t2w << 4; top_t2x << 0; top_t2w << 2; bottom_t2x << 13; bottom_t2w << 3; left_t2x << 14; left_t2w << 4; right_t2x << 13; right_t2w << 4; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * * * * * + + + + * + * + + + + + + + * + + T T T T T * + + + + + + + + + * T T * + + + + * * * O * * * O * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2x << 7; mid_t2w << 3; top_t2x << 0; top_t2w << 2; bottom_t2x << 14; bottom_t2w << 2; left_t2x << 15; left_t2w << 3; right_t2x << 14; right_t2w << 3; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * * * * * + + + + * + * + + + + + + + + * + T T T T T + * + + + + + + + + * T T * + + + + * * O * * * O * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2x << 7; mid_t2w << 3; top_t2x << 0; top_t2w << 2; bottom_t2x << 14; bottom_t2w << 2; left_t2x << 15; left_t2w << 3; right_t2x << 14; right_t2w << 3; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * * * * * + + + + * + * + + + + + + + + + * T T T T T + + * + + + + + + + * T T * + + + + * O * * * O * * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2x << 7; mid_t2w << 3; top_t2x << 0; top_t2w << 2; bottom_t2x << 14; bottom_t2w << 2; left_t2x << 15; left_t2w << 3; right_t2x << 14; right_t2w << 3; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * * * * * * * * + + + * * + + + + + + + + + O T T T T + + + * + + + + + + O T * + + + O * * * O * * * * + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 4 tiles */ mid_t2x << 7; mid_t2w << 4; top_t2x << 0; top_t2w << 3; bottom_t2x << 14; bottom_t2w << 2; left_t2x << 15; left_t2w << 4; right_t2x << 14; right_t2w << 4; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2x, mid_t2w, mid_t2x, mid_t2w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2x, mid_t2w, top_t2x, top_t2w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2x, mid_t2w, bottom_t2x, bottom_t2w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2x, left_t2w, mid_t2x, mid_t2w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2x, right_t2w, mid_t2x, mid_t2w); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2x, mid_t2w, mid_t2x, mid_t2w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2x, mid_t2w, top_t2x, top_t2w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2x, mid_t2w, bottom_t2x, bottom_t2w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2x, left_t2w, mid_t2x, mid_t2w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2x, right_t2w, mid_t2x, mid_t2w); /* width = 2t + 1 */ QList mid_t2p1x; QList mid_t2p1w; QList top_t2p1x; QList top_t2p1w; QList bottom_t2p1x; QList bottom_t2p1w; QList left_t2p1x; QList left_t2p1w; QList right_t2p1x; QList right_t2p1w; pti.w = 2 * t + 1; pti.h = 2 * t + 1; pti.wString = QStringLiteral("(2T + 1)"); pti.hString = QStringLiteral("(2T + 1)"); /* offset = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + *+* * * *+* * * *+* + + + *+ + +* + + + + + +*+ + + + T T T T T*+ + + + + + + + + *+ T T* + + + *+* * * *T* * * *T* + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 2 Covers: 4 tiles */ mid_t2p1x << 6; mid_t2p1w << 4; top_t2p1x << 0; top_t2p1w << 2; bottom_t2p1x << 13; bottom_t2p1w << 3; left_t2p1x << 14; left_t2p1w << 4; right_t2p1x << 13; right_t2p1w << 4; /* offset = 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* * * *+* * * *+* * + + + +* + + * + + + + + + +*+ + + T T T T T +*+ + + + + + + + +* T T * + + + +* * * *T* * * *T* * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2p1x << 7; mid_t2p1w << 3; top_t2p1x << 0; top_t2p1w << 2; bottom_t2p1x << 14; bottom_t2p1w << 2; left_t2p1x << 15; left_t2p1w << 3; right_t2p1x << 14; right_t2p1w << 3; /* offset = 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * *+* * * *+* * * + + + + * + + * + + + + + + + +*+ + T T T T T + +*+ + + + + + + + * T T * + + + + * * *T* * * *T* * * + + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2p1x << 7; mid_t2p1w << 3; top_t2p1x << 0; top_t2p1w << 2; bottom_t2p1x << 14; bottom_t2p1w << 2; left_t2p1x << 15; left_t2p1w << 3; right_t2p1x << 14; right_t2p1w << 3; /* offset = 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * *+* * * *+* * * *+ + + + * + + *+ + + + + + + + +*+ T T T T T + + +*+ + + + + + + * T T *+ + + + * *T* * * *T* * * *+ + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 3 tiles */ mid_t2p1x << 7; mid_t2p1w << 3; top_t2p1x << 0; top_t2p1w << 2; bottom_t2p1x << 14; bottom_t2p1w << 2; left_t2p1x << 15; left_t2p1w << 3; right_t2p1x << 14; right_t2p1w << 3; /* offset = 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + *+* * * *+* * * *+* + + + *+ + +* + + + + + + + + +*T T T T T + + + +*+ + + + + + *T T +* + + + *T* * * *T* * * *+* + + + T T + + + + + + + + + + T T T T T + + + + + + + + Starts at: T - 1 Covers: 4 tiles */ mid_t2p1x << 7; mid_t2p1w << 4; top_t2p1x << 0; top_t2p1w << 3; bottom_t2p1x << 14; bottom_t2p1w << 2; left_t2p1x << 15; left_t2p1w << 4; right_t2p1x << 14; right_t2p1w << 4; pti.zoom = 4.0; pti.zoomString = QStringLiteral("int zoom"); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2p1x, mid_t2p1w, mid_t2p1x, mid_t2p1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2p1x, mid_t2p1w, top_t2p1x, top_t2p1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2p1x, mid_t2p1w, bottom_t2p1x, bottom_t2p1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2p1x, left_t2p1w, mid_t2p1x, mid_t2p1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2p1x, right_t2p1w, mid_t2p1x, mid_t2p1w); pti.zoom = 4.5; pti.zoomString = QStringLiteral("frac zoom"); pti.w = pti.w * qPow(2.0, 0.5); pti.h = pti.h * qPow(2.0, 0.5); pti.x = 0.5; pti.y = 0.5; pti.xyString = QStringLiteral("middle"); test_group(pti, mid_t2p1x, mid_t2p1w, mid_t2p1x, mid_t2p1w); pti.x = 0.5; pti.y = 0.0; pti.xyString = QStringLiteral("top"); test_group(pti, mid_t2p1x, mid_t2p1w, top_t2p1x, top_t2p1w); pti.x = 0.5; pti.y = 15.0 / 16.0; pti.xyString = QStringLiteral("bottom"); test_group(pti, mid_t2p1x, mid_t2p1w, bottom_t2p1x, bottom_t2p1w); pti.x = 0.0; pti.y = 0.5; pti.xyString = QStringLiteral("left"); test_group(pti, left_t2p1x, left_t2p1w, mid_t2p1x, mid_t2p1w); pti.x = 15.0 / 16.0; pti.y = 0.5; pti.xyString = QStringLiteral("right"); test_group(pti, right_t2p1x, right_t2p1w, mid_t2p1x, mid_t2p1w); } QTEST_GUILESS_MAIN(tst_QGeoCameraTiles) #include "tst_qgeocameratiles.moc"