blob: 49c4657efa3e2e45d5703fd71c1b3b01286fe491 [file] [log] [blame]
/****************************************************************************
**
** 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 <QtLocation/private/qgeotilespec_p.h>
#include <QtLocation/private/qgeocameratiles_p.h>
#include <QtLocation/private/qgeocameradata_p.h>
#include <QtLocation/private/qgeomaptype_p.h>
#include <QtPositioning/private/qwebmercator_p.h>
#include <QtPositioning/private/qdoublevector2d_p.h>
#include <QtTest/QtTest>
#include <QtCore/QList>
#include <QtCore/QPair>
#include <QtCore/qmath.h>
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<int> &xVals, QList<int> &wVals, QList<int> &yVals, QList<int> &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<int> xRow;
QList<int> 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<int> &xVals, QList<int> &wVals, QList<int> &yVals, QList<int> &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<QGeoTileSpec> tiles1 = ct.createTiles();
ct.setPluginString("pluginA");
QSet<QGeoTileSpec> tiles2 = ct.createTiles();
typedef QSet<QGeoTileSpec>::const_iterator iter;
iter i1 = tiles1.constBegin();
iter end1 = tiles1.constEnd();
QSet<QGeoTileSpec> 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<QGeoTileSpec> tiles3 = ct.createTiles();
iter i2 = tiles2.constBegin();
iter end2 = tiles2.constEnd();
QSet<QGeoTileSpec> 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<QGeoTileSpec> tiles1 = ct.createTiles();
QGeoMapType mapType1 = QGeoMapType(QGeoMapType::StreetMap, "street map", "street map", false, false, 1, QByteArrayLiteral(""), QGeoCameraCapabilities());
ct.setMapType(mapType1);
QSet<QGeoTileSpec> tiles2 = ct.createTiles();
typedef QSet<QGeoTileSpec>::const_iterator iter;
iter i1 = tiles1.constBegin();
iter end1 = tiles1.constEnd();
QSet<QGeoTileSpec> 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<QGeoTileSpec> tiles3 = ct.createTiles();
iter i2 = tiles2.constBegin();
iter end2 = tiles2.constEnd();
QSet<QGeoTileSpec> 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<int> , tilesX);
QFETCH(QList<int> , 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<QGeoTileSpec> 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<int>(qFloor(zoom)), tilesX.at(i), tilesY.at(i)));
QCOMPARE(ct.createTiles(), tiles);
}
void tst_QGeoCameraTiles::tilesPositions_data()
{
QTest::addColumn<double>("mercatorX");
QTest::addColumn<double>("mercatorY");
QTest::addColumn<double>("zoom");
QTest::addColumn<double>("width");
QTest::addColumn<double>("height");
QTest::addColumn<QList<int> >("tilesX");
QTest::addColumn<QList<int> >("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<int> mid_tm1x;
QList<int> mid_tm1w;
QList<int> top_tm1x;
QList<int> top_tm1w;
QList<int> bottom_tm1x;
QList<int> bottom_tm1w;
QList<int> left_tm1x;
QList<int> left_tm1w;
QList<int> right_tm1x;
QList<int> 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<int> mid_tx;
QList<int> mid_tw;
QList<int> top_tx;
QList<int> top_tw;
QList<int> bottom_tx;
QList<int> bottom_tw;
QList<int> left_tx;
QList<int> left_tw;
QList<int> right_tx;
QList<int> 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<int> mid_tp1x;
QList<int> mid_tp1w;
QList<int> top_tp1x;
QList<int> top_tp1w;
QList<int> bottom_tp1x;
QList<int> bottom_tp1w;
QList<int> left_tp1x;
QList<int> left_tp1w;
QList<int> right_tp1x;
QList<int> 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<int> mid_t2m1x;
QList<int> mid_t2m1w;
QList<int> top_t2m1x;
QList<int> top_t2m1w;
QList<int> bottom_t2m1x;
QList<int> bottom_t2m1w;
QList<int> left_t2m1x;
QList<int> left_t2m1w;
QList<int> right_t2m1x;
QList<int> 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<int> mid_t2x;
QList<int> mid_t2w;
QList<int> top_t2x;
QList<int> top_t2w;
QList<int> bottom_t2x;
QList<int> bottom_t2w;
QList<int> left_t2x;
QList<int> left_t2w;
QList<int> right_t2x;
QList<int> 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<int> mid_t2p1x;
QList<int> mid_t2p1w;
QList<int> top_t2p1x;
QList<int> top_t2p1w;
QList<int> bottom_t2p1x;
QList<int> bottom_t2p1w;
QList<int> left_t2p1x;
QList<int> left_t2p1w;
QList<int> right_t2p1x;
QList<int> 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"