29 #include "vtkDataSetAttributes.h" 30 #include "vtkGarbageCollector.h" 31 #include "vtkImageData.h" 32 #include "vtkImageStencilData.h" 33 #include "vtkInformation.h" 34 #include "vtkInformationVector.h" 36 #include "vtkObjectFactory.h" 37 #include "vtkStreamingDemandDrivenPipeline.h" 38 #include "vtkTransform.h" 40 #include "vtkTemplateAliasMacro.h" 43 #define VTK_USE_INT64 0 45 #define VTK_USE_UINT64 0 59 #if defined mips || defined sparc || defined __ppc__ 61 unsigned int i =
static_cast<unsigned int>(x);
63 return static_cast<int>(i - 2147483648U);
64 #elif defined i386 || defined _M_IX86 70 dual.d = x + 103079215104.0;
71 f = dual.s[0] * 0.0000152587890625;
72 return static_cast<int>((dual.i[1] << 16) | ((dual.i[0]) >> 16));
73 #elif defined ia64 || defined __ia64__ || defined IA64 75 long long i =
static_cast<long long>(x);
77 return static_cast<int>(i - 103079215104LL);
81 return static_cast<int>(y);
87 #if defined mips || defined sparc || defined __ppc__ 88 return static_cast<int>(
static_cast<unsigned int>(x + 2147483648.5) - 2147483648U);
89 #elif defined i386 || defined _M_IX86 94 dual.d = x + 103079215104.5;
95 return static_cast<int>((dual.i[1] << 16) | ((dual.i[0]) >> 16));
96 #elif defined ia64 || defined __ia64__ || defined IA64 98 long long i =
static_cast<long long>(x);
99 return static_cast<int>(i - 103079215104LL);
101 return static_cast<int>(floor(x + 0.5));
109 this->GetOutput()->AllocateScalars(VTK_UNSIGNED_INT, 1);
120 #define VTK_RESLICE_BACKGROUND 0 // use background if out-of-bounds 121 #define VTK_RESLICE_WRAP 1 // wrap to opposite side of image 122 #define VTK_RESLICE_MIRROR 2 // mirror off of the boundary 123 #define VTK_RESLICE_BORDER 3 // use a half-voxel border 124 #define VTK_RESLICE_nullptr 4 // do nothing to *outPtr if out-of-bounds 129 #if (VTK_USE_INT8 != 0) 137 #if (VTK_USE_UINT8 != 0) 145 #if (VTK_USE_INT16 != 0) 153 #if (VTK_USE_UINT16 != 0) 161 #if (VTK_USE_INT32 != 0) 169 #if (VTK_USE_UINT32 != 0) 177 #if (VTK_USE_FLOAT32 != 0) 185 #if (VTK_USE_FLOAT64 != 0) 196 #if (VTK_USE_INT8 != 0) 198 inline void vtkResliceClamp(F val, vtkTypeInt8 &clamp)
212 #if (VTK_USE_UINT8 != 0) 214 inline void vtkResliceClamp(F val, vtkTypeUInt8 &clamp)
228 #if (VTK_USE_INT16 != 0) 230 inline void vtkResliceClamp(F val, vtkTypeInt16 &clamp)
244 #if (VTK_USE_UINT16 != 0) 246 inline void vtkResliceClamp(F val, vtkTypeUInt16 &clamp)
260 #if (VTK_USE_INT32 != 0) 262 inline void vtkResliceClamp(F val, vtkTypeInt32 &clamp)
264 if (val < -2147483648.0)
268 if (val > 2147483647.0)
276 #if (VTK_USE_UINT32 != 0) 278 inline void vtkResliceClamp(F val, vtkTypeUInt32 &clamp)
284 if (val > 4294967295.0)
292 #if (VTK_USE_FLOAT32 != 0) 294 inline void vtkResliceClamp(F val, vtkTypeFloat32 &clamp)
300 #if (VTK_USE_FLOAT64 != 0) 302 inline void vtkResliceClamp(F val, vtkTypeFloat64 &clamp)
314 if ((num %= range) < 0)
330 int count = num / range;
334 num = range - num - 1;
345 if (inIdX0 >= 0 && inIdX1 < inExtX)
349 if (inIdX0 == -1 && fx >= 0.5)
354 if (inIdX0 == inExtX - 1 && fx < 0.5)
365 if ((inIdX0 >= 0 && inIdX1 < inExtX) || (inIdX0 == -1 && fx >= 0.5) || (inIdX0 == inExtX - 1 && fx < 0.5))
379 template <
class F,
class T>
383 const vtkIdType inInc[3],
394 int inExtX = inExt[1] - inExt[0] + 1;
395 int inExtY = inExt[3] - inExt[2] + 1;
396 int inExtZ = inExt[5] - inExt[4] + 1;
398 if (inIdX0 < 0 || inIdX0 >= inExtX || inIdY0 < 0 || inIdY0 >= inExtY || inIdZ0 < 0 || inIdZ0 >= inExtZ)
416 *outPtr++ = *background++;
417 }
while (--numscalars);
426 inPtr += inIdX0 * inInc[0] + inIdY0 * inInc[1] + inIdZ0 * inInc[2];
430 if (!self->IsOverwriteMode())
433 *outPtr++ = *inPtr++;
438 *(
const_cast<T *
>(inPtr)) = *outPtr++;
441 }
while (--numscalars);
450 int (**interpolate)(
void *&outPtr,
453 const vtkIdType inInc[3],
460 int dataType =
self->GetOutput()->GetScalarType();
464 vtkTemplateAliasMacro(*((
int (**)(VTK_TT * &outPtr,
467 const vtkIdType inInc[3],
471 const VTK_TT *background,
474 interpolate =
nullptr;
485 struct vtkImageResliceSetPixels
487 static void Set(
void *&outPtrV,
const void *inPtrV,
int numscalars,
int n)
489 const T *inPtr =
static_cast<const T *
>(inPtrV);
490 T *outPtr =
static_cast<T *
>(outPtrV);
491 for (
int i = 0; i < n; i++)
493 const T *tmpPtr = inPtr;
497 *outPtr++ = *tmpPtr++;
504 static void Set1(
void *&outPtrV,
const void *inPtrV,
int vtkNotUsed(numscalars),
int n)
506 const T *inPtr =
static_cast<const T *
>(inPtrV);
507 T *outPtr =
static_cast<T *
>(outPtrV);
509 for (
int i = 0; i < n; i++)
519 void (**setpixels)(
void *&out,
const void *
in,
int numscalars,
int n))
521 int dataType =
self->GetOutput()->GetScalarType();
522 int numscalars =
self->GetOutput()->GetNumberOfScalarComponents();
530 vtkTemplateAliasMacro(*setpixels = &vtkImageResliceSetPixels<VTK_TT>::Set1);
539 vtkTemplateAliasMacro(*setpixels = &vtkImageResliceSetPixels<VTK_TT>::Set);
551 *background_ptr =
new T[numComponents];
554 for (
int i = 0; i < numComponents; i++)
558 vtkResliceClamp(self->GetBackgroundColor()[i], background[i]);
569 switch (self->GetOutput()->GetScalarType())
577 switch (self->GetOutput()->GetScalarType())
579 vtkTemplateAliasMacro(
delete[] * ((VTK_TT **)rval));
597 void (*setpixels)(
void *&out,
const void *
in,
int numscalars,
int n),
619 int rval = stencil->GetNextExtent(r1, r2, rmin, rmax, yIdx, zIdx, iter);
626 setpixels(outPtr, background, numscalars, clear2 - clear1 + 1);
636 mitkVtkImageOverwrite *
self, vtkImageData *,
void *, vtkImageData *outData,
void *outPtr,
int outExt[6],
int id)
640 vtkIdType outIncX, outIncY, outIncZ;
642 unsigned long count = 0;
643 unsigned long target;
645 void (*setpixels)(
void *&out,
const void *
in,
int numscalars,
int n);
648 target =
static_cast<unsigned long>((outExt[5] - outExt[4] + 1) * (outExt[3] - outExt[2] + 1) / 50.0);
652 outData->GetContinuousIncrements(outExt, outIncX, outIncY, outIncZ);
653 scalarSize = outData->GetScalarSize();
654 numscalars = outData->GetNumberOfScalarComponents();
662 for (idZ = outExt[4]; idZ <= outExt[5]; idZ++)
664 for (idY = outExt[2]; idY <= outExt[3]; idY++)
668 if (!(count % target))
670 self->UpdateProgress(count / (50.0 * target));
675 setpixels(outPtr, background, numscalars, outExt[1] - outExt[0] + 1);
676 outPtr =
static_cast<void *
>(
static_cast<char *
>(outPtr) + outIncY * scalarSize);
678 outPtr =
static_cast<void *
>(
static_cast<char *
>(outPtr) + outIncZ * scalarSize);
688 vtkImageData *inData,
690 vtkImageData *outData,
697 int idXmin, idXmax, iter;
698 vtkIdType outIncX, outIncY, outIncZ;
702 unsigned long count = 0;
703 unsigned long target;
706 double *inSpacing, *inOrigin, *outSpacing, *outOrigin, inInvSpacing[3];
708 int (*interpolate)(
void *&outPtr,
711 const vtkIdType inInc[3],
713 const double point[3],
717 void (*setpixels)(
void *&out,
const void *
in,
int numscalars,
int n) =
nullptr;
721 if (self->GetMirror())
725 else if (self->GetWrap())
729 else if (self->GetBorder())
735 vtkAbstractTransform *transform =
self->GetResliceTransform();
736 vtkMatrix4x4 *matrix =
self->GetResliceAxes();
739 inOrigin = inData->GetOrigin();
740 inSpacing = inData->GetSpacing();
741 outOrigin = outData->GetOrigin();
742 outSpacing = outData->GetSpacing();
745 inInvSpacing[0] = 1.0 / inSpacing[0];
746 inInvSpacing[1] = 1.0 / inSpacing[1];
747 inInvSpacing[2] = 1.0 / inSpacing[2];
750 inData->GetExtent(inExt);
753 target =
static_cast<unsigned long>((outExt[5] - outExt[4] + 1) * (outExt[3] - outExt[2] + 1) / 50.0);
757 inData->GetIncrements(inInc);
758 outData->GetContinuousIncrements(outExt, outIncX, outIncY, outIncZ);
759 scalarSize = outData->GetScalarSize();
760 numscalars = inData->GetNumberOfScalarComponents();
770 vtkImageStencilData *stencil =
self->GetStencil();
773 for (idZ = outExt[4]; idZ <= outExt[5]; idZ++)
775 for (idY = outExt[2]; idY <= outExt[3]; idY++)
779 if (!(count % target))
781 self->UpdateProgress(count / (50.0 * target));
788 stencil, idXmin, idXmax, outExt[0], outExt[1], idY, idZ, outPtr, background, numscalars, setpixels, iter))
790 for (idX = idXmin; idX <= idXmax; idX++)
793 point[0] = idX * outSpacing[0] + outOrigin[0];
794 point[1] = idY * outSpacing[1] + outOrigin[1];
795 point[2] = idZ * outSpacing[2] + outOrigin[2];
801 matrix->MultiplyPoint(point, point);
811 transform->InternalTransformPoint(point, point);
815 point[0] = (point[0] - inOrigin[0]) * inInvSpacing[0];
816 point[1] = (point[1] - inOrigin[1]) * inInvSpacing[1];
817 point[2] = (point[2] - inOrigin[2]) * inInvSpacing[2];
820 interpolate(outPtr, inPtr, inExt, inInc, numscalars, point, mode, background,
self);
823 outPtr =
static_cast<void *
>(
static_cast<char *
>(outPtr) + outIncY * scalarSize);
825 outPtr =
static_cast<void *
>(
static_cast<char *
>(outPtr) + outIncZ * scalarSize);
839 this->SetOutput(slice);
846 vtkInformationVector **vtkNotUsed(inputVector),
847 vtkInformationVector *vtkNotUsed(outputVector),
848 vtkImageData ***inData,
849 vtkImageData **outData,
853 vtkDebugMacro(<<
"Execute: inData = " << inData[0][0] <<
", outData = " << outData[0]);
855 if (inData[0][0]->GetScalarType() != outData[0]->GetScalarType())
857 vtkErrorMacro(<<
"Execute: input ScalarType, " << inData[0][0]->GetScalarType() <<
", must match out ScalarType " 858 << outData[0]->GetScalarType());
863 inData[0][0]->GetExtent(inExt);
865 if (inExt[1] < inExt[0] || inExt[3] < inExt[2] || inExt[5] < inExt[4])
871 void *outPtr = outData[0]->GetScalarPointerForExtent(outExt);
873 if (this->HitInputExtent == 0)
880 void *inPtr = inData[0][0]->GetScalarPointerForExtent(inExt);
#define VTK_RESLICE_BACKGROUND
int vtkResliceFloor(double x, F &f)
static void vtkImageResliceClearExecute(mitkVtkImageOverwrite *self, vtkImageData *, void *, vtkImageData *outData, void *outPtr, int outExt[6], int id)
int vtkInterpolateWrap(int num, int range)
vtkStandardNewMacro(mitkVtkImageOverwrite)
static void vtkGetSetPixelsFunc(mitkVtkImageOverwrite *self, void(**setpixels)(void *&out, const void *in, int numscalars, int n))
#define VTK_RESLICE_BORDER
int vtkInterpolateBorder(int &inIdX0, int &inIdX1, int inExtX, double fx)
static int vtkNearestNeighborInterpolation(T *&outPtr, const T *inPtr, const int inExt[6], const vtkIdType inInc[3], int numscalars, const F point[3], int mode, const T *background, mitkVtkImageOverwrite *self)
static int vtkResliceGetNextExtent(vtkImageStencilData *stencil, int &r1, int &r2, int rmin, int rmax, int yIdx, int zIdx, void *&outPtr, void *background, int numscalars, void(*setpixels)(void *&out, const void *in, int numscalars, int n), int &iter)
static void vtkAllocBackgroundPixelT(mitkVtkImageOverwrite *self, T **background_ptr, int numComponents)
int vtkInterpolateMirror(int num, int range)
A vtk Filter based on vtkImageReslice with the aditional feature to write a slice into the given inpu...
static void vtkGetResliceInterpFunc(mitkVtkImageOverwrite *self, int(**interpolate)(void *&outPtr, const void *inPtr, const int inExt[6], const vtkIdType inInc[3], int numscalars, const F point[3], int mode, const void *background, mitkVtkImageOverwrite *self))
static void vtkImageResliceExecute(mitkVtkImageOverwrite *self, vtkImageData *inData, void *inPtr, vtkImageData *outData, void *outPtr, int outExt[6], int id)
static void vtkFreeBackgroundPixel(mitkVtkImageOverwrite *self, void **rval)
int vtkInterpolateBorderCheck(int inIdX0, int inIdX1, int inExtX, double fx)
~mitkVtkImageOverwrite() override
static bool in(Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4)
static void vtkAllocBackgroundPixel(mitkVtkImageOverwrite *self, void **rval, int numComponents)
void SetOverwriteMode(bool b)
Set the mode either to reslice (false) or to overwrite (true). Default: false.
void ThreadedRequestData(vtkInformation *vtkNotUsed(request), vtkInformationVector **vtkNotUsed(inputVector), vtkInformationVector *vtkNotUsed(outputVector), vtkImageData ***inData, vtkImageData **outData, int outExt[6], int id) override
int vtkResliceRound(double x)
void SetInputSlice(vtkImageData *slice)
Set the slice for overwrite mode. Note: It is recommend not to use this in reslice mode because other...
#define VTK_RESLICE_MIRROR