From 838e5d59a1a1f83049fb5d226a7def1639298054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 3 Oct 2013 09:39:16 +0300 Subject: QML surface crash fix for Android Task-number: QTRD-2358 Change-Id: I376cc09180d580f1959efe7e02d7b945fc04b765 Change-Id: I376cc09180d580f1959efe7e02d7b945fc04b765 Reviewed-by: Mika Salmela --- src/datavisualization/engine/selectionpointer.cpp | 5 +++++ src/datavisualization/engine/surface3drenderer.cpp | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine') 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) -- cgit v1.2.3