/usr/include/InsightToolkit/Common/itkPeriodicBoundaryCondition.txx is in libinsighttoolkit3-dev 3.20.1+git20120521-6build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkPeriodicBoundaryCondition.txx
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/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 notices for more information.
=========================================================================*/
#ifndef __itkPeriodicBoundaryCondition_txx
#define __itkPeriodicBoundaryCondition_txx
#include "itkConstNeighborhoodIterator.h"
#include "itkPeriodicBoundaryCondition.h"
namespace itk
{
template<class TImage>
typename PeriodicBoundaryCondition<TImage>::PixelType
PeriodicBoundaryCondition<TImage>
::operator()(const OffsetType& point_index, const OffsetType& boundary_offset,
const NeighborhoodType *data) const
{
typedef typename OffsetType::OffsetValueType OffsetValueType;
const ConstNeighborhoodIterator<TImage> * iterator
= dynamic_cast<const ConstNeighborhoodIterator<TImage> *>(data);
typename TImage::PixelType *ptr;
int linear_index = 0;
unsigned int i;
// Find the pointer of the closest boundary pixel
// Return the value of the pixel at the closest boundary point.
for (i = 0; i < ImageDimension; ++i)
{
linear_index += (point_index[i] + boundary_offset[i]) * data->GetStride(i);
}
ptr = data->operator[](linear_index);
// Wrap the pointer around the image in the necessary dimensions. If we have
// reached this point, we can assume that we are on the edge of the BUFFERED
// region of the image. Boundary conditions are only invoked if touching the
// actual memory boundary.
// These are the step sizes for increments in each dimension of the image.
const typename TImage::OffsetValueType * offset_table
= iterator->GetImagePointer()->GetOffsetTable();
for (i = 0; i < ImageDimension; ++i)
{
if (boundary_offset[i] != 0)
{ // If the neighborhood overlaps on the low edge, then wrap from the
// high edge of the image.
if (point_index[i] < static_cast<OffsetValueType>(iterator->GetRadius(i)))
{
ptr += iterator->GetImagePointer()->GetBufferedRegion().GetSize()[i] *
offset_table[i] - boundary_offset[i] * offset_table[i];
}
else // wrap from the low side of the image
{
ptr -= iterator->GetImagePointer()->GetBufferedRegion().GetSize()[i] *
offset_table[i] + boundary_offset[i] * offset_table[i];
}
}
}
return *ptr;
}
template<class TImage>
typename PeriodicBoundaryCondition<TImage>::PixelType
PeriodicBoundaryCondition<TImage>
::operator()(const OffsetType& point_index, const OffsetType& boundary_offset,
const NeighborhoodType *data,
const NeighborhoodAccessorFunctorType &neighborhoodAccessorFunctor) const
{
typedef typename OffsetType::OffsetValueType OffsetValueType;
const ConstNeighborhoodIterator<TImage> * iterator
= dynamic_cast<const ConstNeighborhoodIterator<TImage> *>(data);
typename TImage::PixelType *ptr;
int linear_index = 0;
unsigned int i;
// Find the pointer of the closest boundary pixel
// std::cout << "Boundary offset = " << boundary_offset << std::endl;
// std::cout << "point index = " << point_index << std::endl;
// Return the value of the pixel at the closest boundary point.
for (i = 0; i < ImageDimension; ++i)
{
linear_index += (point_index[i] + boundary_offset[i]) * data->GetStride(i);
}
ptr = data->operator[](linear_index);
// Wrap the pointer around the image in the necessary dimensions. If we have
// reached this point, we can assume that we are on the edge of the BUFFERED
// region of the image. Boundary conditions are only invoked if touching the
// actual memory boundary.
// These are the step sizes for increments in each dimension of the image.
const typename TImage::OffsetValueType * offset_table
= iterator->GetImagePointer()->GetOffsetTable();
for (i = 0; i < ImageDimension; ++i)
{
if (boundary_offset[i] != 0)
{ // If the neighborhood overlaps on the low edge, then wrap from the
// high edge of the image.
if (point_index[i] < static_cast<OffsetValueType>(iterator->GetRadius(i)))
{
ptr += iterator->GetImagePointer()->GetBufferedRegion().GetSize()[i] *
offset_table[i] - boundary_offset[i] * offset_table[i];
}
else // wrap from the low side of the image
{
ptr -= iterator->GetImagePointer()->GetBufferedRegion().GetSize()[i] *
offset_table[i] + boundary_offset[i] * offset_table[i];
}
}
}
return neighborhoodAccessorFunctor.Get(ptr);
}
} // end namespace itk
#endif
|