Revision control

Copy as Markdown

// Copyright (C) 2015 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "qgeocameradata_p.h"
#include <QtCore/QVariant>
#include <QtCore/QVariantAnimation>
#include <QtPositioning/private/qgeocoordinate_p.h>
#include <QtPositioning/private/qwebmercator_p.h>
QT_BEGIN_NAMESPACE
class QGeoCameraDataPrivate : public QSharedData
{
public:
bool operator==(const QGeoCameraDataPrivate &rhs) const noexcept;
QGeoCoordinate m_center = {0, 0};
double m_bearing = 0.0;
double m_tilt = 0.0;
double m_roll = 0.0;
double m_fieldOfView = 45.0;
double m_zoomLevel = 0.0;
};
QT_DEFINE_QSDP_SPECIALIZATION_DTOR(QGeoCameraDataPrivate)
bool QGeoCameraDataPrivate::operator==(const QGeoCameraDataPrivate &rhs) const noexcept
{
return ((m_center == rhs.m_center)
&& (m_bearing == rhs.m_bearing)
&& (m_tilt == rhs.m_tilt)
&& (m_roll == rhs.m_roll)
&& (m_fieldOfView == rhs.m_fieldOfView)
&& (m_zoomLevel == rhs.m_zoomLevel));
}
QVariant cameraInterpolator(const QGeoCameraData &start,
const QGeoCameraData &end,
qreal progress)
{
QGeoCameraData result = start;
QGeoCoordinate from = start.center();
QGeoCoordinate to = end.center();
if (from == to) {
if (progress < 0.5) {
result.setCenter(from);
} else {
result.setCenter(to);
}
}
else {
QGeoCoordinate coordinateResult = QWebMercator::coordinateInterpolation(from, to, progress);
result.setCenter(coordinateResult);
}
double sf = 1.0 - progress;
double ef = progress;
result.setBearing(sf * start.bearing() + ef * end.bearing());
result.setTilt(sf * start.tilt() + ef * end.tilt());
result.setRoll(sf * start.roll() + ef * end.roll());
result.setFieldOfView(sf * start.fieldOfView() + ef * end.fieldOfView());
result.setZoomLevel(sf * start.zoomLevel() + ef * end.zoomLevel());
return QVariant::fromValue(result);
}
QGeoCameraData::QGeoCameraData()
: d(new QGeoCameraDataPrivate())
{
qRegisterMetaType<QGeoCameraData>();
qRegisterAnimationInterpolator<QGeoCameraData>(cameraInterpolator);
}
QGeoCameraData::QGeoCameraData(const QGeoCameraData &other) noexcept = default;
QGeoCameraData::~QGeoCameraData() = default;
QGeoCameraData &QGeoCameraData::operator=(const QGeoCameraData &other) noexcept
{
if (this == &other)
return *this;
d = other.d;
return *this;
}
bool QGeoCameraData::isEqual(const QGeoCameraData &other) const
{
return (*(d.constData()) == *(other.d.constData()));
}
void QGeoCameraData::setCenter(const QGeoCoordinate &center)
{
d->m_center = center;
}
QGeoCoordinate QGeoCameraData::center() const
{
return d->m_center;
}
void QGeoCameraData::setBearing(double bearing)
{
d->m_bearing = bearing;
}
double QGeoCameraData::bearing() const
{
return d->m_bearing;
}
void QGeoCameraData::setTilt(double tilt)
{
d->m_tilt = tilt;
}
double QGeoCameraData::tilt() const
{
return d->m_tilt;
}
void QGeoCameraData::setRoll(double roll)
{
d->m_roll = roll;
}
double QGeoCameraData::roll() const
{
return d->m_roll;
}
void QGeoCameraData::setFieldOfView(double fieldOfView)
{
d->m_fieldOfView = fieldOfView;
}
double QGeoCameraData::fieldOfView() const
{
return d->m_fieldOfView;
}
void QGeoCameraData::setZoomLevel(double zoomFactor)
{
d->m_zoomLevel = zoomFactor;
}
double QGeoCameraData::zoomLevel() const
{
return d->m_zoomLevel;
}
QT_END_NAMESPACE