20 #ifndef __itkImageBase_txx
21 #define __itkImageBase_txx
36 template<
unsigned int VImageDimension>
40 memset( m_OffsetTable, 0, (VImageDimension+1)*
sizeof(
unsigned long) );
43 m_Direction.SetIdentity();
44 m_IndexToPhysicalPoint.SetIdentity();
45 m_PhysicalPointToIndex.SetIdentity();
52 template<
unsigned int VImageDimension>
65 Superclass::Initialize();
68 memset( m_OffsetTable, 0, (VImageDimension+1)*
sizeof(
unsigned long) );
71 this->InitializeBufferedRegion();
78 template<
unsigned int VImageDimension>
86 template<
unsigned int VImageDimension>
91 itkDebugMacro(
"setting Spacing to " << spacing);
92 if( this->m_Spacing != spacing )
94 this->m_Spacing = spacing;
95 this->ComputeIndexToPhysicalPointMatrices();
102 template<
unsigned int VImageDimension>
113 template<
unsigned int VImageDimension>
125 template<
unsigned int VImageDimension>
131 this->SetOrigin( p );
136 template<
unsigned int VImageDimension>
144 this->SetOrigin( p );
148 template<
unsigned int VImageDimension>
153 bool modified =
false;
154 for (
unsigned int r = 0; r < VImageDimension; r++)
156 for (
unsigned int c = 0; c < VImageDimension; c++)
158 if (m_Direction[r][c] != direction[r][c])
160 m_Direction[r][c] = direction[r][c];
168 this->ComputeIndexToPhysicalPointMatrices();
173 template<
unsigned int VImageDimension>
180 for (
unsigned int i=0; i < VImageDimension; i++)
182 if (this->m_Spacing[i] == 0.0)
184 itkExceptionMacro(
"A spacing of 0 is not allowed: Spacing is " << this->m_Spacing);
186 scale[i][i] = this->m_Spacing[i];
189 if (vnl_determinant(this->m_Direction.GetVnlMatrix()) == 0.0)
191 itkExceptionMacro(<<
"Bad direction, determinant is 0. Direction is " << this->m_Direction);
194 this->m_IndexToPhysicalPoint = this->m_Direction * scale;
195 this->m_PhysicalPointToIndex = m_IndexToPhysicalPoint.
GetInverse();
201 template<
unsigned int VImageDimension>
211 m_OffsetTable[0] = num;
212 for (
unsigned int i=0; i < VImageDimension; i++)
214 num *= bufferSize[i];
216 m_OffsetTable[i+1] = num;
227 template<
unsigned int VImageDimension>
232 if( this->GetSource() )
234 this->GetSource()->UpdateOutputInformation();
245 if( this->GetBufferedRegion().GetNumberOfPixels() > 0)
247 this->SetLargestPossibleRegion( this->GetBufferedRegion() );
255 if ( this->GetRequestedRegion().GetNumberOfPixels() == 0)
257 this->SetRequestedRegionToLargestPossibleRegion();
261 template<
unsigned int VImageDimension>
277 if( this->GetRequestedRegion().GetNumberOfPixels() > 0
278 || this->GetLargestPossibleRegion().GetNumberOfPixels() == 0 )
280 this->Superclass::UpdateOutputData();
284 #if !defined(ITK_LEGACY_SILENT) && !defined(ITK_LEGACY_REMOVE)
288 itkDebugMacro(<<
"Not executing UpdateOutputData due to zero pixel condition RequestedRegion:"
289 << this->GetRequestedRegion() <<
" BufferedRegion: " << this->GetBufferedRegion());
291 #endif // !ITK_LEGACY_SILENT && !ITK_LEGACY_REMOVE
295 template<
unsigned int VImageDimension>
300 this->SetRequestedRegion( this->GetLargestPossibleRegion() );
304 template<
unsigned int VImageDimension>
310 Superclass::CopyInformation(data);
333 this->SetNumberOfComponentsPerPixel(
339 itkExceptionMacro( <<
"itk::ImageBase::CopyInformation() cannot cast "
340 <<
typeid(data).name() <<
" to "
348 template<
unsigned int VImageDimension>
355 const ImageBaseType * image;
359 image =
dynamic_cast< const ImageBaseType *
>( data );
372 this->CopyInformation( image );
376 this->SetBufferedRegion( image->GetBufferedRegion() );
377 this->SetRequestedRegion( image->GetRequestedRegion() );
383 template<
unsigned int VImageDimension>
392 const SizeType& requestedRegionSize = this->GetRequestedRegion().
GetSize();
393 const SizeType& bufferedRegionSize = this->GetBufferedRegion().
GetSize();
395 for (i=0; i< VImageDimension; i++)
397 if ( (requestedRegionIndex[i] < bufferedRegionIndex[i]) ||
398 ((requestedRegionIndex[i] + static_cast<OffsetValueType>(requestedRegionSize[i]))
399 > (bufferedRegionIndex[i] + static_cast<OffsetValueType>(bufferedRegionSize[i]))) )
410 template<
unsigned int VImageDimension>
422 const IndexType &largestPossibleRegionIndex
423 = this->GetLargestPossibleRegion().
GetIndex();
425 const SizeType& requestedRegionSize = this->GetRequestedRegion().
GetSize();
426 const SizeType& largestPossibleRegionSize
427 = this->GetLargestPossibleRegion().
GetSize();
429 for (i=0; i< VImageDimension; i++)
431 if ( (requestedRegionIndex[i] < largestPossibleRegionIndex[i]) ||
432 ((requestedRegionIndex[i] + static_cast<long>(requestedRegionSize[i]))
433 > (largestPossibleRegionIndex[i]+static_cast<long>(largestPossibleRegionSize[i]))))
443 template<
unsigned int VImageDimension>
448 if (m_BufferedRegion != region)
450 m_BufferedRegion = region;
451 this->ComputeOffsetTable();
458 template<
unsigned int VImageDimension>
470 this->ComputeOffsetTable();
476 template<
unsigned int VImageDimension>
481 if (m_RequestedRegion != region)
483 m_RequestedRegion = region;
488 template<
unsigned int VImageDimension>
495 imgData =
dynamic_cast<ImageBase*
>(data);
505 template<
unsigned int VImageDimension>
510 if (m_LargestPossibleRegion != region)
512 m_LargestPossibleRegion = region;
518 template<
unsigned int VImageDimension>
530 template<
unsigned int VImageDimension>
540 template<
unsigned int VImageDimension>
545 Superclass::PrintSelf(os,indent);
547 os << indent <<
"LargestPossibleRegion: " << std::endl;
548 this->GetLargestPossibleRegion().PrintSelf(os, indent.
GetNextIndent());
550 os << indent <<
"BufferedRegion: " << std::endl;
551 this->GetBufferedRegion().PrintSelf(os, indent.
GetNextIndent());
553 os << indent <<
"RequestedRegion: " << std::endl;
554 this->GetRequestedRegion().PrintSelf(os, indent.
GetNextIndent());
556 os << indent <<
"Spacing: " << this->GetSpacing() << std::endl;
558 os << indent <<
"Origin: " << this->GetOrigin() << std::endl;\
560 os << indent <<
"Direction: " << std::endl << this->GetDirection() << std::endl;
562 os << indent <<
"IndexToPointMatrix: " << std::endl;
563 os << indent << this->m_IndexToPhysicalPoint << std::endl;
565 os << indent <<
"PointToIndexMatrix: " << std::endl;
566 os << indent << this->m_PhysicalPointToIndex << std::endl;