87 #include "vtkImageData.h"
88 #include "vtkInformation.h"
89 #include "vtkInformationVector.h"
90 #include "vtkObjectFactory.h"
91 #include "vtkStreamingDemandDrivenPipeline.h"
99 this->SetNumberOfInputPorts (2);
122 vtkInformation *vtkNotUsed(request),
123 vtkInformationVector **inputVector,
124 vtkInformationVector *outputVector)
127 vtkInformation *outInfo = outputVector->GetInformationObject(0);
128 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
129 vtkInformation *inInfo2 = inputVector[1]->GetInformationObject(0);
131 int ext[6], ext2[6], idx;
133 inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ext);
134 inInfo2->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ext2);
135 for ( idx = 0; idx < 3; ++idx )
137 if ( ext2[idx * 2] > ext[idx * 2] )
139 ext[idx * 2] = ext2[idx * 2];
141 if ( ext2[idx * 2 + 1] < ext[idx * 2 + 1] )
143 ext[idx * 2 + 1] = ext2[idx * 2 + 1];
147 outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ext, 6);
154 this->Superclass::PrintSelf(os, indent);
157 os << indent <<
"LookupTable: \n";
166 vtkImageData *in1Data, T *in1Ptr,
167 vtkImageData *in2Data, T *in2Ptr,
168 vtkImageData *outData, T *outPtr,
int id)
170 int num0, num1, num2, numC, numM;
171 int idx0, idx1, idx2, idxC;
172 vtkIdType in1Inc0, in1Inc1, in1Inc2;
173 vtkIdType in2Inc0, in2Inc1, in2Inc2;
174 vtkIdType outInc0, outInc1, outInc2;
175 double maskAlpha, oneMinusMaskAlpha;
176 unsigned long count = 0;
177 unsigned long target;
179 numC = outData->GetNumberOfScalarComponents();
180 unsigned long pixSize = numC *
sizeof( T );
182 oneMinusMaskAlpha = 0.5;
184 numM = in2Data->GetNumberOfScalarComponents();
187 in1Data->GetContinuousIncrements(ext, in1Inc0, in1Inc1, in1Inc2);
188 in2Data->GetContinuousIncrements(ext, in2Inc0, in2Inc1, in2Inc2);
189 outData->GetContinuousIncrements(ext, outInc0, outInc1, outInc2);
190 num0 = ext[1] - ext[0] + 1;
191 num1 = ext[3] - ext[2] + 1;
192 num2 = ext[5] - ext[4] + 1;
194 target = (
unsigned long)( num2 * num1 / 50.0 );
198 for ( idx2 = 0; idx2 < num2; ++idx2 )
200 for ( idx1 = 0; !
self->AbortExecute && idx1 < num1; ++idx1 )
204 if ( !( count % target ) )
206 self->UpdateProgress( static_cast< double >( count )
207 / ( 50.0 * static_cast< double >( target ) ) );
212 for ( idx0 = 0; idx0 < num0; ++idx0 )
214 if (
int(*in2Ptr) == 0 )
216 memcpy (outPtr, in1Ptr, pixSize);
223 self->GetLookupTable()->GetTableValue ( (
int)( *in2Ptr ), color );
224 maskAlpha = color[3];
225 oneMinusMaskAlpha = 1.0 - maskAlpha;
227 for ( idxC = 0; idxC < numC; idxC++ )
229 *outPtr = (T)( (
int)( *in1Ptr ) * oneMinusMaskAlpha + (int)( color[idxC] * 255.0 ) * maskAlpha );
253 vtkInformation *vtkNotUsed(request),
254 vtkInformationVector **vtkNotUsed(inputVector),
255 vtkInformationVector *vtkNotUsed(outputVector),
256 vtkImageData ***inData,
257 vtkImageData **outData,
258 int outExt[6],
int id)
267 vtkErrorMacro(
"LookupTable not set");
271 vtkImageData *mask = vtkImageData::SafeDownCast (inData[1][0]);
275 vtkErrorMacro(
"Mask is not set");
279 inPtr1 = inData[0][0]->GetScalarPointerForExtent(outExt);
280 inPtr2 = inData[1][0]->GetScalarPointerForExtent(outExt);
281 outPtr = outData[0]->GetScalarPointerForExtent(outExt);
283 tExt = inData[1][0]->GetExtent();
284 if ( tExt[0] > outExt[0] || tExt[1] < outExt[1]
285 || tExt[2] > outExt[2] || tExt[3] < outExt[3]
286 || tExt[4] > outExt[4] || tExt[5] < outExt[5] )
288 vtkErrorMacro(
"Mask extent not large enough");
297 if ( inData[0][0]->GetScalarType() != outData[0]->GetScalarType()
298 || inData[0][0]->GetScalarType() != VTK_UNSIGNED_CHAR
299 || ( inData[0][0]->GetNumberOfScalarComponents() != 3 && inData[0][0]->GetNumberOfScalarComponents() != 4 )
302 vtkErrorMacro( <<
"Execute: image ScalarType ("
303 << inData[0][0]->GetScalarType() <<
") must match out ScalarType ("
304 << outData[0]->GetScalarType() <<
"), and mask scalar type ("
305 << inData[1][0]->GetScalarType() <<
") must be unsigned char."
306 <<
"Number of input components: " << inData[0][0]->GetNumberOfScalarComponents() );
310 switch ( inData[0][0]->GetScalarType() )
314 inData[0][0], (VTK_TT *)( inPtr1 ),
316 inData[1][0], (VTK_TT *)( inPtr2 ),
317 outData[0], (VTK_TT *)( outPtr ),
id) );
319 vtkErrorMacro(<<
"Execute: Unknown ScalarType");
void vtkImageBlendWithMaskExecute(vtkImageBlendWithMask *self, int ext[6], vtkImageData *in1Data, T *in1Ptr, vtkImageData *in2Data, T *in2Ptr, vtkImageData *outData, T *outPtr, int id)
virtual void ThreadedRequestData(vtkInformation *vtkNotUsed(request), vtkInformationVector **vtkNotUsed(inputVector), vtkInformationVector *vtkNotUsed(outputVector), vtkImageData ***inData, vtkImageData **outData, int extent[6], int threadId)
void SetImageInput(vtkImageData *in)
virtual void SetInput2(vtkDataObject *in)
virtual int RequestInformation(vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector)
virtual void SetInput1(vtkDataObject *in)
void SetMaskInput(vtkImageData *in)
void PrintSelf(ostream &os, vtkIndent indent)
vtkLookupTable * LookupTable
vtkStandardNewMacro(vtkImageBlendWithMask)
vtkCxxRevisionMacro(vtkImageBlendWithMask,"$Revision: 490 $")