1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the QtLocation module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL3$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or later as published by the Free
28** Software Foundation and appearing in the file LICENSE.GPL included in
29** the packaging of this file. Please review the following information to
30** ensure the GNU General Public License version 2.0 requirements will be
31** met: http://www.gnu.org/licenses/gpl-2.0.html.
32**
33** $QT_END_LICENSE$
34**
35****************************************************************************/
36
37#include "qgeomapitemgeometry_p.h"
38#include "qdeclarativegeomap_p.h"
39#include "qlocationutils_p.h"
40#include <QtQuick/QSGGeometry>
41#include "qdoublevector2d_p.h"
42#include <QtLocation/private/qgeomap_p.h>
43
44QT_BEGIN_NAMESPACE
45
46QGeoMapItemGeometry::QGeoMapItemGeometry()
47: sourceDirty_(true), screenDirty_(true), clipToViewport_(true), preserveGeometry_(false)
48{
49}
50
51QGeoMapItemGeometry::~QGeoMapItemGeometry()
52{
53
54}
55
56/*!
57 \internal
58*/
59void QGeoMapItemGeometry::translate(const QPointF &offset)
60{
61 for (int i = 0; i < screenVertices_.size(); ++i)
62 screenVertices_[i] += offset;
63
64 firstPointOffset_ += offset;
65 screenOutline_.translate(offset);
66 screenBounds_.translate(p: offset);
67}
68
69/*!
70 \internal
71*/
72void QGeoMapItemGeometry::allocateAndFill(QSGGeometry *geom) const
73{
74 const QVector<QPointF> &vx = screenVertices_;
75 const QVector<quint32> &ix = screenIndices_;
76
77 if (isIndexed()) {
78 geom->allocate(vertexCount: vx.size(), indexCount: ix.size());
79 if (geom->indexType() == QSGGeometry::UnsignedShortType) {
80 quint16 *its = geom->indexDataAsUShort();
81 for (int i = 0; i < ix.size(); ++i)
82 its[i] = ix[i];
83 } else if (geom->indexType() == QSGGeometry::UnsignedIntType) {
84 quint32 *its = geom->indexDataAsUInt();
85 for (int i = 0; i < ix.size(); ++i)
86 its[i] = ix[i];
87 }
88 } else {
89 geom->allocate(vertexCount: vx.size());
90 }
91
92 QSGGeometry::Point2D *pts = geom->vertexDataAsPoint2D();
93 for (int i = 0; i < vx.size(); ++i)
94 pts[i].set(nx: vx[i].x(), ny: vx[i].y());
95}
96
97/*!
98 \internal
99*/
100QRectF QGeoMapItemGeometry::translateToCommonOrigin(const QList<QGeoMapItemGeometry *> &geoms)
101{
102 QGeoCoordinate origin = geoms.at(i: 0)->origin();
103
104 QPainterPath brects;
105
106 // first get max offset
107 QPointF maxOffset = geoms.at(i: 0)->firstPointOffset();
108 foreach (QGeoMapItemGeometry *g, geoms) {
109 QPointF o = g->firstPointOffset();
110 maxOffset.setX(qMax(a: o.x(), b: maxOffset.x()));
111 maxOffset.setY(qMax(a: o.y(), b: maxOffset.y()));
112 }
113
114 // then translate everything
115 foreach (QGeoMapItemGeometry *g, geoms) {
116 g->translate(offset: maxOffset - g->firstPointOffset());
117 brects.addRect(rect: g->sourceBoundingBox());
118 }
119
120 return brects.boundingRect();
121}
122
123/*!
124 \internal
125*/
126double QGeoMapItemGeometry::geoDistanceToScreenWidth(const QGeoMap &map,
127 const QGeoCoordinate &fromCoord,
128 const QGeoCoordinate &toCoord)
129{
130 // Do not wrap around half the globe
131 Q_ASSERT(!qFuzzyCompare(fromCoord.longitude(), toCoord.longitude()));
132
133 QGeoCoordinate mapMid = map.geoProjection().itemPositionToCoordinate(pos: QDoubleVector2D(map.viewportWidth()/2.0, 0));
134 double halfGeoDist = toCoord.longitude() - fromCoord.longitude();
135 if (toCoord.longitude() < fromCoord.longitude())
136 halfGeoDist += 360;
137 halfGeoDist /= 2.0;
138 QGeoCoordinate geoDelta = QGeoCoordinate(0,
139 QLocationUtils::wrapLong(lng: mapMid.longitude() + halfGeoDist));
140 QDoubleVector2D halfScreenDist = map.geoProjection().coordinateToItemPosition(coordinate: geoDelta, clipToViewport: false)
141 - QDoubleVector2D(map.viewportWidth()/2.0, 0);
142 return halfScreenDist.x() * 2.0;
143}
144
145QT_END_NAMESPACE
146

source code of qtlocation/src/location/declarativemaps/qgeomapitemgeometry.cpp