17 #ifndef __itkFlipImageFilter_txx
18 #define __itkFlipImageFilter_txx
31 template <
class TImage>
36 m_FlipAxes.Fill(
false );
37 m_FlipAboutOrigin =
true;
45 template <
class TImage>
50 Superclass::PrintSelf(os,indent);
51 os << indent <<
"FlipAxes: " << m_FlipAxes << std::endl;
52 os << indent <<
"FlipAboutOrigin: " << m_FlipAboutOrigin << std::endl;
61 template <
class TImage>
67 Superclass::GenerateOutputInformation();
71 const_cast< TImage *
>( this->GetInput() );
74 if( !inputPtr || !outputPtr )
79 const typename TImage::DirectionType& inputDirection = inputPtr->GetDirection();
80 const typename TImage::SizeType& inputSize =
81 inputPtr->GetLargestPossibleRegion().GetSize();
82 const typename TImage::IndexType& inputStartIndex =
83 inputPtr->GetLargestPossibleRegion().GetIndex();
85 typename TImage::PointType outputOrigin;
86 typename TImage::IndexType newIndex = inputStartIndex;
90 typename TImage::DirectionType flipMatrix;
91 flipMatrix.SetIdentity();
95 for ( j = 0; j < ImageDimension; j++ )
101 newIndex[j] += (inputSize[j] - 1);
107 newIndex[j] += inputStartIndex[j];
116 if (!m_FlipAboutOrigin)
118 flipMatrix[j][j] = -1.0;
123 inputPtr->TransformIndexToPhysicalPoint( newIndex, outputOrigin );
126 if (m_FlipAboutOrigin)
128 for ( j = 0; j < ImageDimension; j++ )
132 outputOrigin[j] *= -1;
137 outputPtr->SetDirection( inputDirection * flipMatrix );
138 outputPtr->SetOrigin( outputOrigin );
146 template <
class TImage>
152 Superclass::GenerateInputRequestedRegion();
156 const_cast< TImage *
>( this->GetInput());
159 if( !inputPtr || !outputPtr )
164 const typename TImage::SizeType& outputRequestedSize =
165 outputPtr->GetRequestedRegion().GetSize();
166 const typename TImage::IndexType& outputRequestedIndex =
167 outputPtr->GetRequestedRegion().GetIndex();
169 const typename TImage::SizeType & outputLargestPossibleSize =
170 outputPtr->GetLargestPossibleRegion().GetSize();
171 const typename TImage::IndexType& outputLargestPossibleIndex =
172 outputPtr->GetLargestPossibleRegion().GetIndex();
177 for ( j = 0; j < ImageDimension; j++ )
181 inputRequestedIndex[j] =
182 2 * outputLargestPossibleIndex[j]
184 - static_cast<IndexValueType>( outputRequestedSize[j] )
185 - outputRequestedIndex[j];
189 inputRequestedIndex[j] = outputRequestedIndex[j];
193 typename TImage::RegionType inputRequestedRegion;
194 inputRequestedRegion.SetSize( outputRequestedSize );
195 inputRequestedRegion.SetIndex( inputRequestedIndex );
197 inputPtr->SetRequestedRegion( inputRequestedRegion );
206 template <
class TImage>
222 OutputIterator outIt(outputPtr, outputRegionForThread);
224 typename TImage::IndexType outputIndex;
225 typename TImage::IndexType inputIndex;
228 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
230 const typename TImage::SizeType & outputLargestPossibleSize =
231 outputPtr->GetLargestPossibleRegion().GetSize();
232 const typename TImage::IndexType& outputLargestPossibleIndex =
233 outputPtr->GetLargestPossibleRegion().GetIndex();
236 for ( j = 0; j < ImageDimension; j++ )
240 offset[j] = 2 * outputLargestPossibleIndex[j]
241 +
static_cast<IndexValueType>( outputLargestPossibleSize[j] ) - 1;
246 for ( i = 0; !outIt.IsAtEnd(); ++outIt, i++ )
249 outputIndex = outIt.GetIndex();
252 for ( j = 0; j < ImageDimension; j++ )
256 inputIndex[j] = - 1 * outputIndex[j] + offset[j];
260 inputIndex[j] = outputIndex[ j ];
265 outIt.Set( inputPtr->GetPixel(inputIndex) );