Explorar el Código

Merge branch 'VTKHistogramNaN'

* VTKHistogramNaN:
  Fix memory leaks in ctkVTKHistogramTest tests
  BUG: Fix ctkVTKHistogram handling of NaN's.
Jean-Christophe Fillion-Robin hace 12 años
padre
commit
aa43c9e5f3

+ 4 - 3
Libs/Visualization/VTK/Core/Testing/Cpp/ctkVTKHistogramTest1.cpp

@@ -65,7 +65,8 @@ int ctkVTKHistogramTest1( int argc, char * argv [])
 
   //------Test setDataArray--------------------------
   int dataType = VTK_CHAR;
-  vtkSmartPointer<vtkDataArray> newDataArray = vtkDataArray::CreateDataArray(dataType);
+  vtkSmartPointer<vtkDataArray> newDataArray;
+  newDataArray.TakeReference(vtkDataArray::CreateDataArray(dataType));
   defaultHistogram.setDataArray(newDataArray);
   if (defaultHistogram.dataArray() != newDataArray)
     {
@@ -79,7 +80,7 @@ int ctkVTKHistogramTest1( int argc, char * argv [])
   defaultHistogram.build();
 
   dataType = VTK_INT;
-  newDataArray = vtkDataArray::CreateDataArray(dataType);
+  newDataArray.TakeReference(vtkDataArray::CreateDataArray(dataType));
   newDataArray->SetNumberOfComponents(1);
   newDataArray->InsertNextTuple1(50);
   newDataArray->InsertNextTuple1(143);
@@ -98,7 +99,7 @@ int ctkVTKHistogramTest1( int argc, char * argv [])
   defaultHistogram.build();
 
   dataType = VTK_FLOAT;
-  newDataArray = vtkDataArray::CreateDataArray(dataType);
+  newDataArray.TakeReference(vtkDataArray::CreateDataArray(dataType));
   defaultHistogram.setDataArray(newDataArray);
   if (defaultHistogram.dataArray() != newDataArray)
     {

+ 2 - 1
Libs/Visualization/VTK/Core/Testing/Cpp/ctkVTKHistogramTest2.cpp

@@ -25,7 +25,8 @@ int ctkVTKHistogramTest2( int argc, char * argv [])
   //------Test build--------------------------------
   ctkVTKHistogram rgbHistogram;
 
-  vtkSmartPointer<vtkDataArray> rgbDataArray = vtkDataArray::CreateDataArray(VTK_INT);
+  vtkSmartPointer<vtkDataArray> rgbDataArray;
+  rgbDataArray.TakeReference(vtkDataArray::CreateDataArray(VTK_INT));
   rgbDataArray->SetNumberOfComponents(3);
   rgbDataArray->InsertNextTuple3(   0,  50,     0);
   rgbDataArray->InsertNextTuple3(1000, 143, -1412);

+ 2 - 1
Libs/Visualization/VTK/Core/Testing/Cpp/ctkVTKHistogramTest3.cpp

@@ -25,7 +25,8 @@ int ctkVTKHistogramTest3( int argc, char * argv [])
   //------Test build--------------------------------
   ctkVTKHistogram histogram;
 
-  vtkSmartPointer<vtkDataArray> dataArray = vtkDataArray::CreateDataArray(VTK_CHAR);
+  vtkSmartPointer<vtkDataArray> dataArray;
+  dataArray.TakeReference(vtkDataArray::CreateDataArray(VTK_CHAR));
   dataArray->InsertNextTuple1(0);
   dataArray->InsertNextTuple1(0);
   dataArray->InsertNextTuple1(0);

+ 11 - 1
Libs/Visualization/VTK/Core/Testing/Cpp/ctkVTKHistogramTest4.cpp

@@ -12,6 +12,7 @@
 // STD includes
 #include <cstdlib>
 #include <iostream>
+#include <limits>
 
 int ctkVTKHistogramTest4( int argc, char * argv [])
 {
@@ -25,12 +26,21 @@ int ctkVTKHistogramTest4( int argc, char * argv [])
   //------Test build--------------------------------
   ctkVTKHistogram histogram;
 
-  vtkSmartPointer<vtkDataArray> dataArray = vtkDataArray::CreateDataArray(VTK_FLOAT);
+  vtkSmartPointer<vtkDataArray> dataArray;
+  dataArray.TakeReference(vtkDataArray::CreateDataArray(VTK_FLOAT));
   dataArray->InsertNextTuple1( 10.001);
   dataArray->InsertNextTuple1( -0.231);
   dataArray->InsertNextTuple1( 220.0001);
   dataArray->InsertNextTuple1(1234.0);
   dataArray->InsertNextTuple1(220.0);
+  if(std::numeric_limits<float>::has_quiet_NaN)
+    {
+    // These should be ignored.
+    const float positiveNaN = std::numeric_limits<float>::quiet_NaN();
+    dataArray->InsertNextTuple1(positiveNaN);
+    const float negativeNaN = - positiveNaN;
+    dataArray->InsertNextTuple1(negativeNaN);
+    }
   histogram.setDataArray(dataArray);
   if (histogram.dataArray() != dataArray)
     {

+ 2 - 2
Libs/Visualization/VTK/Core/ctkVTKHistogram.cpp

@@ -296,8 +296,8 @@ void populateIrregularBins(vtkIntArray* bins, const ctkVTKHistogram* histogram)
   ptr += component;
   for (; ptr < endPtr; ptr += componentNumber)
     {
-    if (std::numeric_limits<T>::has_quiet_NaN && 
-        std::numeric_limits<T>::quiet_NaN() == *ptr)
+    if (std::numeric_limits<T>::has_quiet_NaN &&
+        vtkMath::IsNan(*ptr))
       {
       continue;
       }