/*========================================================================= Program: Visualization Toolkit Module: vtkImageStencilToImage.cxx 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. =========================================================================*/ #include "vtkImageStencilToImage.h" #include "vtkImageData.h" #include "vtkImageStencilData.h" #include "vtkImageStencilIterator.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkObjectFactory.h" #include "vtkStreamingDemandDrivenPipeline.h" vtkStandardNewMacro(vtkImageStencilToImage); //---------------------------------------------------------------------------- vtkImageStencilToImage::vtkImageStencilToImage() { this->OutsideValue = 0; this->InsideValue = 1; this->OutputScalarType = VTK_UNSIGNED_CHAR; this->SetNumberOfInputPorts(1); } //---------------------------------------------------------------------------- vtkImageStencilToImage::~vtkImageStencilToImage() { } //---------------------------------------------------------------------------- int vtkImageStencilToImage::RequestInformation ( vtkInformation * vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector) { // get the info object vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkInformation *outInfo = outputVector->GetInformationObject(0); int extent[6]; double spacing[3]; double origin[3]; inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); inInfo->Get(vtkDataObject::SPACING(), spacing); inInfo->Get(vtkDataObject::ORIGIN(), origin); outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6); outInfo->Set(vtkDataObject::SPACING(), spacing, 3); outInfo->Set(vtkDataObject::ORIGIN(), origin, 3); vtkDataObject::SetPointDataActiveScalarInfo( outInfo, this->OutputScalarType, -1); return 1; } //---------------------------------------------------------------------------- template void vtkImageStencilToImageExecute( vtkImageStencilToImage *self, vtkImageStencilData *stencil, vtkImageData *outData, T *, int outExt[6], int id) { double inValueD = self->GetInsideValue(); double outValueD = self->GetOutsideValue(); double tmin = outData->GetScalarTypeMin(); double tmax = outData->GetScalarTypeMax(); if (inValueD < tmin) { inValueD = tmin; } if (inValueD > tmax) { inValueD = tmax; } if (outValueD < tmin) { outValueD = tmin; } if (outValueD > tmax) { outValueD = tmax; } T inValue = static_cast(inValueD); T outValue = static_cast(outValueD); vtkImageStencilIterator outIter(outData, stencil, outExt, self, id); // Loop through output pixels while (!outIter.IsAtEnd()) { T* outPtr = outIter.BeginSpan(); T* spanEndPtr = outIter.EndSpan(); if (outIter.IsInStencil()) { while (outPtr != spanEndPtr) { *outPtr++ = inValue; } } else { while (outPtr != spanEndPtr) { *outPtr++ = outValue; } } outIter.NextSpan(); } } //---------------------------------------------------------------------------- int vtkImageStencilToImage::RequestData( vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector) { vtkInformation *outInfo = outputVector->GetInformationObject(0); int updateExtent[6]; outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), updateExtent); vtkImageData *outData = static_cast( outInfo->Get(vtkDataObject::DATA_OBJECT())); this->AllocateOutputData(outData, outInfo, updateExtent); void *outPtr = outData->GetScalarPointerForExtent(updateExtent); vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); vtkImageStencilData *inData = static_cast( inInfo->Get(vtkDataObject::DATA_OBJECT())); switch (outData->GetScalarType()) { vtkTemplateMacro( vtkImageStencilToImageExecute( this, inData, outData, static_cast(outPtr), updateExtent, 0)); default: vtkErrorMacro("Execute: Unknown ScalarType"); } return 1; } //---------------------------------------------------------------------------- int vtkImageStencilToImage::FillInputPortInformation(int port, vtkInformation* info) { if (port == 0) { info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageStencilData"); info->Set(vtkAlgorithm::INPUT_IS_OPTIONAL(), 0); } return 1; } //---------------------------------------------------------------------------- void vtkImageStencilToImage::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "InsideValue: " << this->InsideValue << "\n"; os << indent << "OutsideValue: " << this->OutsideValue << "\n"; os << indent << "OutputScalarType: " << this->OutputScalarType << "\n"; }