/*========================================================================= 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 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( 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( 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