From 87339612d27fab342a01663bf00c15f5e92b3e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 14 Nov 2016 11:15:00 +0200 Subject: Ensure that the formatter is respected for zero and negative values This also ensures that INF and NaN numbers are also handled correctly Task-number: QTBUG-57075 Change-Id: I8db693cb28303bc13f936c818147fe31b7ee1199 Reviewed-by: Miikka Heikkinen --- src/datavisualization/data/qsurfacedataproxy.cpp | 61 ++++++++++++++++++++---- 1 file changed, 51 insertions(+), 10 deletions(-) (limited to 'src/datavisualization/data/qsurfacedataproxy.cpp') diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index c983ead7..fa7990b1 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -29,6 +29,7 @@ #include "qsurfacedataproxy_p.h" #include "qsurface3dseries_p.h" +#include "qabstract3daxis_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -504,7 +505,9 @@ QSurfaceDataProxy *QSurfaceDataProxyPrivate::qptr() return static_cast(q_ptr); } -void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) const +void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues, + QAbstract3DAxis *axisX, QAbstract3DAxis *axisY, + QAbstract3DAxis *axisZ) const { float min = 0.0f; float max = 0.0f; @@ -524,7 +527,9 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV if (row) { for (int j = 0; j < columns; j++) { float itemValue = m_dataArray->at(i)->at(j).y(); - if (min > itemValue) + if (qIsNaN(itemValue) || qIsInf(itemValue)) + continue; + if (min > itemValue && isValidValue(itemValue, axisY)) min = itemValue; if (max < itemValue) max = itemValue; @@ -534,23 +539,59 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV minValues.setY(min); maxValues.setY(max); + if (columns) { + // Have some defaults float xLow = m_dataArray->at(0)->at(0).x(); float xHigh = m_dataArray->at(0)->last().x(); float zLow = m_dataArray->at(0)->at(0).z(); float zHigh = m_dataArray->last()->at(0).z(); - minValues.setX(qMin(xLow, xHigh)); - minValues.setZ(qMin(zLow, zHigh)); - maxValues.setX(qMax(xLow, xHigh)); - maxValues.setZ(qMax(zLow, zHigh)); + for (int i = 0; i < columns; i++) { + float zItemValue = m_dataArray->at(0)->at(i).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + zLow = qMin(zLow,zItemValue); + } + for (int i = 0; i < columns; i++) { + float zItemValue = m_dataArray->last()->at(i).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + zHigh = qMax(zHigh, zItemValue); + } + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->at(0).x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + xLow = qMin(xLow, xItemValue); + } + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->last().x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + xHigh = qMax(xHigh, xItemValue); + } + minValues.setX(xLow); + minValues.setZ(zLow); + maxValues.setX(xHigh); + maxValues.setZ(zHigh); } else { - minValues.setX(0.0f); - minValues.setZ(0.0f); - maxValues.setX(0.0f); - maxValues.setZ(0.0f); + minValues.setX(axisX->d_ptr->allowZero() ? 0.0f : 1.0f); + minValues.setZ(axisZ->d_ptr->allowZero() ? 0.0f : 1.0f); + maxValues.setX(axisX->d_ptr->allowZero() ? 0.0f : 1.0f); + maxValues.setZ(axisZ->d_ptr->allowZero() ? 0.0f : 1.0f); } } +bool QSurfaceDataProxyPrivate::isValidValue(float value, QAbstract3DAxis *axis) const +{ + return (value > 0.0f || (value == 0.0f && axis->d_ptr->allowZero()) + || (value < 0.0f && axis->d_ptr->allowNegatives())); +} + void QSurfaceDataProxyPrivate::clearRow(int rowIndex) { if (m_dataArray->at(rowIndex)) { -- cgit v1.2.3