| 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 | |
| 44 | QT_BEGIN_NAMESPACE |
| 45 | |
| 46 | QGeoMapItemGeometry::QGeoMapItemGeometry() |
| 47 | : sourceDirty_(true), screenDirty_(true), clipToViewport_(true), preserveGeometry_(false) |
| 48 | { |
| 49 | } |
| 50 | |
| 51 | QGeoMapItemGeometry::~QGeoMapItemGeometry() |
| 52 | { |
| 53 | |
| 54 | } |
| 55 | |
| 56 | /*! |
| 57 | \internal |
| 58 | */ |
| 59 | void 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 | */ |
| 72 | void 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 | */ |
| 100 | QRectF 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 | */ |
| 126 | double 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 | |
| 145 | QT_END_NAMESPACE |
| 146 | |