summaryrefslogtreecommitdiffstats
path: root/src/datavisualization
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-10-03 09:39:16 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-10-03 10:00:09 +0300
commit838e5d59a1a1f83049fb5d226a7def1639298054 (patch)
tree561c14f58d1ce56a73a02a38af785a48a1e338ff /src/datavisualization
parent6889a543a32df1b802ffc9c48609310aa72f03d3 (diff)
QML surface crash fix for Android
Task-number: QTRD-2358 Change-Id: I376cc09180d580f1959efe7e02d7b945fc04b765 Change-Id: I376cc09180d580f1959efe7e02d7b945fc04b765 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization')
-rw-r--r--src/datavisualization/engine/selectionpointer.cpp5
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp18
2 files changed, 22 insertions, 1 deletions
diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp
index 11db2377..421c547e 100644
--- a/src/datavisualization/engine/selectionpointer.cpp
+++ b/src/datavisualization/engine/selectionpointer.cpp
@@ -242,8 +242,13 @@ void SelectionPointer::initShaders()
// The shader for the small point ball
if (m_pointShader)
delete m_pointShader;
+#if defined (Q_OS_ANDROID)
+ m_pointShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexES2"),
+ QStringLiteral(":/shaders/fragmentES2"));
+#else
m_pointShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"),
QStringLiteral(":/shaders/fragment"));
+#endif
m_pointShader->initialize();
}
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index e794f2a7..cebe906e 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -964,7 +964,11 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
m_selectionShader->release();
// Put the RGBA value back to uint
+#if defined (Q_OS_ANDROID)
+ selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536;
+#else
selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * 16777216;
+#endif
selectionDirty = true;
}
@@ -1688,9 +1692,17 @@ void Surface3DRenderer::updateSelectionTexture()
{
// Create the selection ID image. Each grid corner gets 2x2 pixel area of
// ID color so that each vertex (data point) has 4x4 pixel area of ID color
- // TODO: power of two thing for ES
int idImageWidth = (m_sampleSpace.width() - 1) * 4;
int idImageHeight = (m_sampleSpace.height() - 1) * 4;
+
+#if defined(Q_OS_ANDROID)
+ // Android requires power-of-two textures
+ GLuint temp;
+ idImageWidth = Utils::getNearestPowerOfTwo(idImageWidth, temp);
+ idImageHeight = Utils::getNearestPowerOfTwo(idImageHeight, temp);
+ // TODO: This is not enough, the selection texture itself needs to be modified for Android (colors?, scaling)
+#endif
+
int stride = idImageWidth * 4 * sizeof(uchar); // 4 = number of color components (rgba)
uchar *bits = new uchar[idImageWidth * idImageHeight * 4 * sizeof(uchar)];
@@ -1897,6 +1909,10 @@ void Surface3DRenderer::surfacePointSelected(int id)
{
int column = (id - 1) % m_sampleSpace.width();
int row = (id - 1) / m_sampleSpace.width();
+
+ if (row < 0 || column < 0 || m_dataArray.size() < row || m_dataArray.at(row)->size() < column)
+ return;
+
qreal value = qreal(m_dataArray.at(row)->at(column).y());
if (!m_selectionPointer)