[Qt] Added viewport mode

Qt Quick requires third-party rendering codes to follow its standards
with regards to viewport transform. Qt 5.6 adds a 'mirrorVertically'
property but that only solves the solution for that version of Qt
onwards. Telling Mapbox GL core to flip the Y axis makes QQuickMapboxGL
item available for Qt 5.2 onwards.

Qt 'mirrorVertically' property documentation:
http://doc.qt.io/qt-5/qquickframebufferobject.html#mirrorVertically-prop

Fixes #4866.
This commit is contained in:
Bruno de Oliveira Abinader
2016-05-11 14:12:22 +03:00
parent c13dd32242
commit ae7a0ddea4
4 changed files with 28 additions and 6 deletions

View File

@@ -36,6 +36,11 @@ public:
ConstrainWidthAndHeight
};
enum ViewportMode {
DefaultViewport = 0,
FlippedYViewport
};
MapMode mapMode() const;
void setMapMode(MapMode);
@@ -45,6 +50,9 @@ public:
ConstrainMode constrainMode() const;
void setConstrainMode(ConstrainMode);
ViewportMode viewportMode() const;
void setViewportMode(ViewportMode);
unsigned cacheDatabaseMaximumSize() const;
void setCacheDatabaseMaximumSize(unsigned);
@@ -61,6 +69,7 @@ private:
MapMode m_mapMode;
GLContextMode m_contextMode;
ConstrainMode m_constrainMode;
ViewportMode m_viewportMode;
unsigned m_cacheMaximumSize;
QString m_cacheDatabasePath;

View File

@@ -35,6 +35,10 @@ static_assert(mbgl::underlying_type(QMapboxGLSettings::NoConstrain) == mbgl::und
static_assert(mbgl::underlying_type(QMapboxGLSettings::ConstrainHeightOnly) == mbgl::underlying_type(mbgl::ConstrainMode::HeightOnly), "error");
static_assert(mbgl::underlying_type(QMapboxGLSettings::ConstrainWidthAndHeight) == mbgl::underlying_type(mbgl::ConstrainMode::WidthAndHeight), "error");
// mbgl::ViewportMode
static_assert(mbgl::underlying_type(QMapboxGLSettings::DefaultViewport) == mbgl::underlying_type(mbgl::ViewportMode::Default), "error");
static_assert(mbgl::underlying_type(QMapboxGLSettings::FlippedYViewport) == mbgl::underlying_type(mbgl::ViewportMode::FlippedY), "error");
// mbgl::NorthOrientation
static_assert(mbgl::underlying_type(QMapboxGL::NorthUpwards) == mbgl::underlying_type(mbgl::NorthOrientation::Upwards), "error");
static_assert(mbgl::underlying_type(QMapboxGL::NorthRightwards) == mbgl::underlying_type(mbgl::NorthOrientation::Rightwards), "error");
@@ -61,6 +65,7 @@ QMapboxGLSettings::QMapboxGLSettings()
: m_mapMode(QMapboxGLSettings::ContinuousMap)
, m_contextMode(QMapboxGLSettings::SharedGLContext)
, m_constrainMode(QMapboxGLSettings::ConstrainHeightOnly)
, m_viewportMode(QMapboxGLSettings::DefaultViewport)
, m_cacheMaximumSize(mbgl::util::DEFAULT_MAX_CACHE_SIZE)
, m_cacheDatabasePath(":memory:")
, m_assetPath(QCoreApplication::applicationDirPath())
@@ -97,6 +102,16 @@ void QMapboxGLSettings::setConstrainMode(ConstrainMode mode)
m_constrainMode = mode;
}
QMapboxGLSettings::ViewportMode QMapboxGLSettings::viewportMode() const
{
return m_viewportMode;
}
void QMapboxGLSettings::setViewportMode(ViewportMode mode)
{
m_viewportMode = mode;
}
unsigned QMapboxGLSettings::cacheDatabaseMaximumSize() const
{
return m_cacheMaximumSize;
@@ -605,7 +620,8 @@ QMapboxGLPrivate::QMapboxGLPrivate(QMapboxGL *q, const QMapboxGLSettings &settin
*this, *fileSourceObj,
static_cast<mbgl::MapMode>(settings.mapMode()),
static_cast<mbgl::GLContextMode>(settings.contextMode()),
static_cast<mbgl::ConstrainMode>(settings.constrainMode())))
static_cast<mbgl::ConstrainMode>(settings.constrainMode()),
static_cast<mbgl::ViewportMode>(settings.viewportMode())))
{
qRegisterMetaType<QMapboxGL::MapChange>("QMapboxGL::MapChange");

View File

@@ -14,10 +14,6 @@
QQuickMapboxGL::QQuickMapboxGL(QQuickItem *parent_)
: QQuickFramebufferObject(parent_)
{
#if QT_VERSION >= 0x050600
// FIXME: https://github.com/mapbox/mapbox-gl-native/issues/4866
setMirrorVertically(true);
#endif
}
QQuickMapboxGL::~QQuickMapboxGL()
@@ -166,7 +162,7 @@ QColor QQuickMapboxGL::color() const
void QQuickMapboxGL::pan(int dx, int dy)
{
m_pan += QPointF(dx, dy);
m_pan += QPointF(dx, -dy);
m_syncState |= PanNeedsSync;
update();

View File

@@ -16,6 +16,7 @@ QQuickMapboxGLRenderer::QQuickMapboxGLRenderer()
settings.setAccessToken(qgetenv("MAPBOX_ACCESS_TOKEN"));
settings.setCacheDatabasePath("/tmp/mbgl-cache.db");
settings.setCacheDatabaseMaximumSize(20 * 1024 * 1024);
settings.setViewportMode(QMapboxGLSettings::FlippedYViewport);
m_map.reset(new QMapboxGL(nullptr, settings));
}