You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkImageStencilIterator.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkImageStencilIterator
* @brief an image region iterator
*
* This is an image iterator that can be used to iterate over a
* region of an image.
*
* @sa
* vtkImageData vtkImageStencilData vtkImageProgressIterator
*/
#ifndef vtkImageStencilIterator_h
#define vtkImageStencilIterator_h
#include "vtkImagePointDataIterator.h"
template <class DType>
class VTKIMAGINGCORE_EXPORT vtkImageStencilIterator : public vtkImagePointDataIterator
{
public:
//@{
/**
* Default constructor, its use must be followed by Initialize().
*/
vtkImageStencilIterator()
{
this->Increment = 0;
this->BasePointer = nullptr;
this->Pointer = nullptr;
this->SpanEndPointer = nullptr;
}
//@}
//@{
/**
* Create an iterator for the given image, with several options.
* If a stencil is provided, then the iterator's IsInStencil() method
* reports whether each span is inside the stencil. If an extent is
* provided, it iterates over the extent and ignores the rest of the
* image (the provided extent must be within the image extent). If
* a pointer to the algorithm is provided and threadId is set to zero,
* then progress events will provided for the algorithm.
*/
vtkImageStencilIterator(vtkImageData* image, vtkImageStencilData* stencil = nullptr,
const int extent[6] = nullptr, vtkAlgorithm* algorithm = nullptr, int threadId = 0)
: vtkImagePointDataIterator(image, extent, stencil, algorithm, threadId)
{
this->BasePointer =
static_cast<DType*>(vtkImagePointDataIterator::GetVoidPointer(image, 0, &this->Increment));
this->UpdatePointer();
}
//@}
//@{
/**
* Initialize an iterator. See constructor for more details.
*/
void Initialize(vtkImageData* image, vtkImageStencilData* stencil = nullptr,
const int extent[6] = nullptr, vtkAlgorithm* algorithm = nullptr, int threadId = 0)
{
this->vtkImagePointDataIterator::Initialize(image, extent, stencil, algorithm, threadId);
this->BasePointer =
static_cast<DType*>(vtkImagePointDataIterator::GetVoidPointer(image, 0, &this->Increment));
this->UpdatePointer();
}
//@}
//@{
/**
* Move the iterator to the beginning of the next span.
* A span is a contiguous region of the image over which nothing but
* the point Id and the X index changes.
*/
void NextSpan()
{
this->vtkImagePointDataIterator::NextSpan();
this->UpdatePointer();
}
//@}
/**
* Test if the iterator has completed iterating over the entire extent.
*/
bool IsAtEnd() { return this->vtkImagePointDataIterator::IsAtEnd(); }
/**
* Return a pointer to the beginning of the current span.
*/
DType* BeginSpan() { return this->Pointer; }
/**
* Return a pointer to the end of the current span.
*/
DType* EndSpan() { return this->SpanEndPointer; }
protected:
//@{
/**
* Update the pointer (called automatically when a new span begins).
*/
void UpdatePointer()
{
this->Pointer = this->BasePointer + this->Id * this->Increment;
this->SpanEndPointer = this->BasePointer + this->SpanEnd * this->Increment;
}
//@}
// The pointer must be incremented by this amount for each pixel.
int Increment;
// Pointers
DType* BasePointer; // pointer to the first voxel
DType* Pointer; // current iterator position within data
DType* SpanEndPointer; // end of current span
};
#ifndef vtkImageStencilIterator_cxx
#ifdef _MSC_VER
#pragma warning(push)
// The following is needed when the vtkImageStencilIterator template
// class is declared dllexport and is used within vtkImagingCore
#pragma warning(disable : 4910) // extern and dllexport incompatible
#endif
vtkExternTemplateMacro(extern template class VTKIMAGINGCORE_EXPORT vtkImageStencilIterator);
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif
#endif
// VTK-HeaderTest-Exclude: vtkImageStencilIterator.h