+//----------------------------------------------------------------------------
+double vvSlicer::GetOverlayColorWindow()
+{
+ if(mOverlayMapper)
+ return mOverlayMapper->GetWindow();
+ else
+ return 0.;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicer::GetOverlayColorLevel()
+{
+ if(mOverlayMapper)
+ return mOverlayMapper->GetLevel();
+ else
+ return 0.;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicer::SetOverlayColorWindow(double window)
+{
+ mOverlayMapper->SetWindow(window);
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicer::SetOverlayColorLevel(double level)
+{
+ mOverlayMapper->SetLevel(level);
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+// Returns the min an the max value in a 20%x20% region around the mouse pointer
+void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image, vtkTransform *transform)
+{
+ //Get mouse pointer position in view coordinates
+ double corner1[3];
+ double corner2[3];
+ for(int i=0; i<3; i++) {
+ corner1[i] = mCurrent[i];
+ corner2[i] = mCurrent[i];
+ }
+
+ this->Renderer->WorldToView(corner1[0], corner1[1], corner1[2]);
+ this->Renderer->WorldToView(corner2[0], corner2[1], corner2[2]);
+
+ // In view coordinates, x is the slicer width and y is the slicer height are the in-plane axis
+ int w, h;
+ this->Renderer->GetTiledSize(&w, &h);
+ corner1[0] -= 0.2*h/(double)w;
+ corner2[0] += 0.2*h/(double)w;
+ corner1[1] -= 0.2;
+ corner2[1] += 0.2;
+ this->Renderer->ViewToWorld(corner1[0], corner1[1], corner1[2]);
+ this->Renderer->ViewToWorld(corner2[0], corner2[1], corner2[2]);
+
+ //Convert to image pixel coordinates (rounded)
+ transform->TransformPoint(corner1, corner1);
+ transform->TransformPoint(corner2, corner2);
+ int iLocalExtents[6];
+ for(int i=0; i<3; i++) {
+ corner1[i] = (corner1[i] - image->GetOrigin()[i])/image->GetSpacing()[i];
+ corner2[i] = (corner2[i] - image->GetOrigin()[i])/image->GetSpacing()[i];
+
+ iLocalExtents[i*2 ] = lrint(corner1[i]);
+ iLocalExtents[i*2+1] = lrint(corner2[i]);
+
+ if(iLocalExtents[i*2 ]>iLocalExtents[i*2+1])
+ std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]);
+ }
+
+ vtkSmartPointer<vtkExtractVOI> voiFilter = vtkSmartPointer<vtkExtractVOI>::New();
+ voiFilter->SetInput(image);
+ voiFilter->SetVOI(iLocalExtents);
+ voiFilter->Update();
+ if (!voiFilter->GetOutput()->GetNumberOfPoints()) {
+ min = 0;
+ max = 0;
+ return;
+ }
+
+ vtkSmartPointer<vtkImageAccumulate> accFilter = vtkSmartPointer<vtkImageAccumulate>::New();
+ accFilter->SetInput(voiFilter->GetOutput());
+ accFilter->Update();
+
+ min = *(accFilter->GetMin());
+ max = *(accFilter->GetMax());
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int &ix, int &iy, int &iz, int component)
+{
+ ix = lrint(X);
+ iy = lrint(Y);
+ iz = lrint(Z);
+ if (ix < image->GetWholeExtent()[0] ||
+ ix > image->GetWholeExtent()[1] ||
+ iy < image->GetWholeExtent()[2] ||
+ iy > image->GetWholeExtent()[3] ||
+ iz < image->GetWholeExtent()[4] ||
+ iz > image->GetWholeExtent()[5] )
+ return std::numeric_limits<double>::quiet_NaN();
+
+ image->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
+ image->Update();
+ return image->GetScalarComponentAsDouble(ix, iy, iz, component);
+}
+//----------------------------------------------------------------------------