diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-10-03 09:39:16 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-10-03 10:00:09 +0300 |
commit | 838e5d59a1a1f83049fb5d226a7def1639298054 (patch) | |
tree | 561c14f58d1ce56a73a02a38af785a48a1e338ff /src | |
parent | 6889a543a32df1b802ffc9c48609310aa72f03d3 (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')
-rw-r--r-- | src/datavisualization/engine/selectionpointer.cpp | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 18 |
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) |