From 795c9ef709152304f3044a05f15bd69bd7d566dd Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 7 Oct 2026 12:53:01 -0500 Subject: [PATCH 1/7] COMP: Do not include UseITK when building as an external module UseITK registers every IO factory of the ITK build as a directory-wide compile definition, so each test object references the *ImageIOFactoryRegister__Private symbols of modules this module never links, and the test driver fails to link against an ITK that has ITKIOGE or ITKIOFDF enabled. ITKModuleExternal already applies ITK's flags, and the module template does not include the use file. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef2ae9ae..a27deba3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,6 @@ project(LesionSizingToolkit) if(NOT ITK_SOURCE_DIR) find_package(ITK REQUIRED) - include(${ITK_USE_FILE}) list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) include(ITKModuleExternal) else() From 7b023ac2a20996ee6a185348756abbf75a03e174 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 7 Oct 2026 13:20:48 -0500 Subject: [PATCH 2/7] COMP: Build and test against ITK 5.4 and ITK 6 src/CMakeLists.txt linked ITK::LesionSizingToolkitModule, an interface library that exists only in ITK 6, so configuring against ITK 5.4 failed and every CI job has been red since 2026-01-27. Pick the module library at configure time and fall back to LesionSizingToolkit_LIBRARIES. Run the C++ and Python workflows twice, pinned to the v5.4.6 and v6.0b02 releases of ITKRemoteModuleBuildTestPackageAction, so both supported ITK majors are covered. Only the ITK 6 Python job publishes. --- .github/workflows/build-test-package.yml | 18 ++++++++++----- src/CMakeLists.txt | 28 +++++++++++++++--------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-test-package.yml b/.github/workflows/build-test-package.yml index 7a8e4a12..063c007a 100644 --- a/.github/workflows/build-test-package.yml +++ b/.github/workflows/build-test-package.yml @@ -11,14 +11,20 @@ on: - main jobs: - cxx-build-workflow: - uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v5.4.4 + cxx-build-workflow-itk5: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v5.4.6 - python-build-workflow: - uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v5.4.4 + cxx-build-workflow-itk6: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v6.0b02 + + python-build-workflow-itk5: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v5.4.6 + with: + test-notebooks: false + + python-build-workflow-itk6: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v6.0b02 with: - itk-wheel-tag: 'v5.4.5' - itk-python-package-tag: 'v5.4.5' test-notebooks: false secrets: pypi_password: ${{ secrets.pypi_password }} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3de6d09e..9a976e31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,31 +1,39 @@ include_directories("${LesionSizingToolkit_SOURCE_DIR}/src") # to include itkIncludeRequiredIOFactories.h include_directories("${LesionSizingToolkit_SOURCE_DIR}/include") +# ITK 6 exports one interface library per module; ITK 5.4 provides only the list variable. +if(TARGET ITK::LesionSizingToolkitModule) + set(_lstk_libraries ITK::LesionSizingToolkitModule) +elseif(TARGET LesionSizingToolkitModule) + set(_lstk_libraries LesionSizingToolkitModule) +else() + set(_lstk_libraries ${LesionSizingToolkit_LIBRARIES}) +endif() add_executable(itkCannyEdgeDetectionImageFilter1 itkCannyEdgeDetectionImageFilter1.cxx ) -target_link_libraries(itkCannyEdgeDetectionImageFilter1 ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkCannyEdgeDetectionImageFilter1 ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkCannyEdgeDetectionImageFilter2 itkCannyEdgeDetectionImageFilter2.cxx ) -target_link_libraries(itkCannyEdgeDetectionImageFilter2 ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkCannyEdgeDetectionImageFilter2 ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkDicomSeriesReadImageWrite itkDicomSeriesReadImageWrite.cxx) -target_link_libraries(itkDicomSeriesReadImageWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkDicomSeriesReadImageWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkGradientMagnitudeImageFilter itkGradientMagnitudeImageFilter.cxx) -target_link_libraries(itkGradientMagnitudeImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkGradientMagnitudeImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkGradientMagnitudeRecursiveGaussianImageFilter itkGradientMagnitudeRecursiveGaussianImageFilter.cxx) -target_link_libraries(itkGradientMagnitudeRecursiveGaussianImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkGradientMagnitudeRecursiveGaussianImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadRegionOfInterestAroundSeedWrite itkImageReadRegionOfInterestAroundSeedWrite.cxx) -target_link_libraries(itkImageReadRegionOfInterestAroundSeedWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadRegionOfInterestAroundSeedWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadRegionOfInterestWrite itkImageReadRegionOfInterestWrite.cxx) -target_link_libraries(itkImageReadRegionOfInterestWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadRegionOfInterestWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadWrite itkImageReadWrite.cxx) -target_link_libraries(itkImageReadWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkLaplacianRecursiveGaussianImageFilter itkLaplacianRecursiveGaussianImageFilter.cxx) -target_link_libraries(itkLaplacianRecursiveGaussianImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkLaplacianRecursiveGaussianImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkResampleVolumeToBeIsotropic itkResampleVolumeToBeIsotropic.cxx) -target_link_libraries(itkResampleVolumeToBeIsotropic ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkResampleVolumeToBeIsotropic ${_lstk_libraries} ${ITK_LIBRARIES}) From e98d8014d914c128b097a153cdd988617ab291a4 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 7 Oct 2026 12:33:15 -0500 Subject: [PATCH 3/7] BUG: Name the real superclass in ITK_EXERCISE_BASIC_OBJECT_METHODS calls ITK_EXERCISE_BASIC_OBJECT_METHODS compares Superclass::GetNameOfClass() with the stringified third argument and fails the test on a mismatch. Nine calls named a class that is not the object's direct superclass: - MaximumFeatureAggregator derives from FeatureAggregator, not UnaryFunctorImageFilter (itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1). - LesionSegmentationMethod derives from ProcessObject, not LightObject (itkLesionSegmentationMethodTest10). - SatoVesselnessSigmoidFeatureGenerator derives from SatoVesselnessFeatureGenerator, not FeatureGenerator (itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1, four calls; itkFeatureAggregatorTest1, one call). - LungWallFeatureGenerator and SigmoidFeatureGenerator derive from FeatureGenerator, not FeatureAggregator (itkFeatureAggregatorTest1). The first three tests fail identically against ITK main and ITK release-5.4 in the downstream build matrix. itkFeatureAggregatorTest1 is only built when TEST_CORNELL_DATA_ROOT is set, so its three mismatches were latent. --- ...teauxSheetnessFeatureGeneratorMultiScaleTest1.cxx | 2 +- test/itkFeatureAggregatorTest1.cxx | 7 ++++--- test/itkLesionSegmentationMethodTest10.cxx | 2 +- ...selnessSigmoidFeatureGeneratorMultiScaleTest1.cxx | 12 ++++++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx b/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx index 5edf5fef..62278003 100644 --- a/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx +++ b/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx @@ -60,7 +60,7 @@ itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1(int argc, char * argv[]) AggregatorType::Pointer featureAggregator = AggregatorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureAggregator, MaximumFeatureAggregator, UnaryFunctorImageFilter); + ITK_EXERCISE_BASIC_OBJECT_METHODS(featureAggregator, MaximumFeatureAggregator, FeatureAggregator); using DescoteauxSheetnessFeatureGeneratorType = itk::DescoteauxSheetnessFeatureGenerator; using SpatialObjectType = DescoteauxSheetnessFeatureGeneratorType::SpatialObjectType; diff --git a/test/itkFeatureAggregatorTest1.cxx b/test/itkFeatureAggregatorTest1.cxx index a341466b..207a1138 100644 --- a/test/itkFeatureAggregatorTest1.cxx +++ b/test/itkFeatureAggregatorTest1.cxx @@ -158,18 +158,19 @@ itkFeatureAggregatorTest1(int argc, char * argv[]) using VesselnessGeneratorType = itk::SatoVesselnessSigmoidFeatureGenerator; VesselnessGeneratorType::Pointer vesselnessGenerator = VesselnessGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(vesselnessGenerator, SatoVesselnessSigmoidFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + vesselnessGenerator, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); using LungWallGeneratorType = itk::LungWallFeatureGenerator; LungWallGeneratorType::Pointer lungWallGenerator = LungWallGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(lungWallGenerator, LungWallFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS(lungWallGenerator, LungWallFeatureGenerator, FeatureGenerator); using SigmoidFeatureGeneratorType = itk::SigmoidFeatureGenerator; SigmoidFeatureGeneratorType::Pointer sigmoidGenerator = SigmoidFeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(sigmoidGenerator, SigmoidFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS(sigmoidGenerator, SigmoidFeatureGenerator, FeatureGenerator); featureAggregator->AddFeatureGenerator(lungWallGenerator); featureAggregator->AddFeatureGenerator(vesselnessGenerator); diff --git a/test/itkLesionSegmentationMethodTest10.cxx b/test/itkLesionSegmentationMethodTest10.cxx index 48e506b5..f12fa341 100644 --- a/test/itkLesionSegmentationMethodTest10.cxx +++ b/test/itkLesionSegmentationMethodTest10.cxx @@ -73,7 +73,7 @@ itkLesionSegmentationMethodTest10(int argc, char * argv[]) MethodType::Pointer lesionSegmentationMethod = MethodType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(lesionSegmentationMethod, LesionSegmentationMethod, LightObject); + ITK_EXERCISE_BASIC_OBJECT_METHODS(lesionSegmentationMethod, LesionSegmentationMethod, ProcessObject); using ImageMaskSpatialObjectType = itk::ImageMaskSpatialObject; diff --git a/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx b/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx index 206214c6..ada025e8 100644 --- a/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx +++ b/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx @@ -57,19 +57,23 @@ itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1(int argc, char * argv[]) FeatureGeneratorType::Pointer featureGenerator1 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator1, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator1, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator2 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator2, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator2, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator3 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator3, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator3, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator4 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator4, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator4, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); double smallestSigma = 1.0; From 7316dbb77598a83956255dc78059e96f278543a2 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 7 Oct 2026 15:37:35 -0500 Subject: [PATCH 4/7] COMP: Wrap only the pixel types the filters accept CannyEdgeDetectionRecursiveGaussianImageFilter requires floating-point input and output, which ITK 5.4's concept checks enforce, so its integer instantiations fail castxml. LesionSegmentationImageFilter8 grafts the float image of its segmentation module onto its output, so a double output cannot be const_cast from it; wrap the output as float. --- wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap | 2 +- wrapping/itkLesionSegmentationImageFilter8.wrap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap b/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap index 299a54bb..c88f5a5d 100644 --- a/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap +++ b/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::CannyEdgeDetectionRecursiveGaussianImageFilter" POINTER) - itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2+) + itk_wrap_image_filter("${WRAP_ITK_REAL}" 2+) itk_end_wrap_class() diff --git a/wrapping/itkLesionSegmentationImageFilter8.wrap b/wrapping/itkLesionSegmentationImageFilter8.wrap index b0f8f8c6..e6161cf0 100644 --- a/wrapping/itkLesionSegmentationImageFilter8.wrap +++ b/wrapping/itkLesionSegmentationImageFilter8.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::LesionSegmentationImageFilter8" POINTER) - itk_wrap_image_filter_combinations("${WRAP_ITK_SCALAR}" "${WRAP_ITK_REAL}" 3) + itk_wrap_image_filter_combinations("${WRAP_ITK_SCALAR}" "F" 3) itk_end_wrap_class() From 033c429fb60bc772347198f0796dddbe0a7886e9 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 7 Oct 2026 15:55:05 -0500 Subject: [PATCH 5/7] COMP: Name the Python package itk-lesionsizingtoolkit ITKRemoteModuleBuildTestPackageAction validates that each job produced an itk_* wheel, and every published ITK remote module uses the itk- prefix. Neither name is on PyPI. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 48f114bd..ef26862d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["scikit-build-core"] build-backend = "scikit_build_core.build" [project] -name = "lesionsizingtoolkit" +name = "itk-lesionsizingtoolkit" version = "1.0.1" description = "A generic and extensible ITK module for lesion segmentation" readme = "README.rst" From fa845909d333c06449bfce1b1d855aa355dfe42a Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Wed, 7 Oct 2026 16:13:33 -0500 Subject: [PATCH 6/7] COMP: Test the ITK 6 C++ build against current ITK main The v6.0b02 release of ITKRemoteModuleBuildTestPackageAction builds ITK at c6e1c1be (2026-03-10), which is older than the v6.0b02 tag and 6,400 commits behind main. Three tests segfault on Windows against that snapshot and pass against main, so pin the C++ job to the main commit the module was verified with. --- .github/workflows/build-test-package.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-test-package.yml b/.github/workflows/build-test-package.yml index 063c007a..7cef0fd3 100644 --- a/.github/workflows/build-test-package.yml +++ b/.github/workflows/build-test-package.yml @@ -16,6 +16,9 @@ jobs: cxx-build-workflow-itk6: uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v6.0b02 + with: + # ITK main as of 2026-10-01; the action's own default predates v6.0b02. Replace with v6.0.0 once released. + itk-git-tag: '5d31af3cfdf2071d14dfc331d169111487b80597' python-build-workflow-itk5: uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v5.4.6 From d108038fe9aa8eb37d56c525b7b6496bef499bcd Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Thu, 8 Oct 2026 09:45:17 -0500 Subject: [PATCH 7/7] BUG: Copy the image offset table as OffsetValueType Both flooding filters copied the offset table with memcpy sized by sizeof(unsigned long), which is 4 bytes on Windows while OffsetValueType is 8 bytes there (ITK_USE_64BITS_IDS defaults to ON on 64-bit Windows). Only the first two strides were copied and the slice and volume strides kept whatever the heap held, so neighbor offsets were garbage: silently wrong on platforms that happened to hand back zeros, and access violations under ITK 6 on Windows. Copy the table element-wise and accumulate the neighbor offset in OffsetValueType. --- include/itkRegionCompetitionImageFilter.hxx | 8 ++++---- include/itkVotingBinaryHoleFillFloodingImageFilter.hxx | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/itkRegionCompetitionImageFilter.hxx b/include/itkRegionCompetitionImageFilter.hxx index bf5338c6..53087691 100644 --- a/include/itkRegionCompetitionImageFilter.hxx +++ b/include/itkRegionCompetitionImageFilter.hxx @@ -24,6 +24,8 @@ #include "itkNeighborhoodAlgorithm.h" #include "itkOffset.h" +#include + namespace itk { @@ -459,9 +461,7 @@ RegionCompetitionImageFilter::ComputeArrayOfNeighborh // Copy the offsets from the Input image. // We assume that they are the same for the output image. // - const size_t sizeOfOffsetTableInBytes = (InputImageDimension + 1) * sizeof(unsigned long); - - memcpy(this->m_OffsetTable, this->m_OutputImage->GetOffsetTable(), sizeOfOffsetTableInBytes); + std::copy_n(this->m_OutputImage->GetOffsetTable(), InputImageDimension + 1, this->m_OffsetTable); // @@ -482,7 +482,7 @@ RegionCompetitionImageFilter::ComputeArrayOfNeighborh { NeighborOffsetType offset = this->m_Neighborhood.GetOffset(i); - signed int bufferOffset = 0; // must be a signed number + OffsetValueType bufferOffset = 0; for (unsigned int d = 0; d < InputImageDimension; d++) { diff --git a/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx b/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx index 760112d7..6863d916 100644 --- a/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx +++ b/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx @@ -25,6 +25,8 @@ #include "itkOffset.h" #include "itkProgressReporter.h" +#include + namespace itk { @@ -414,9 +416,7 @@ VotingBinaryHoleFillFloodingImageFilter::ComputeArray // Copy the offsets from the Input image. // We assume that they are the same for the output image. // - const size_t sizeOfOffsetTableInBytes = (InputImageDimension + 1) * sizeof(unsigned long); - - memcpy(this->m_OffsetTable, this->m_OutputImage->GetOffsetTable(), sizeOfOffsetTableInBytes); + std::copy_n(this->m_OutputImage->GetOffsetTable(), InputImageDimension + 1, this->m_OffsetTable); // @@ -437,7 +437,7 @@ VotingBinaryHoleFillFloodingImageFilter::ComputeArray { NeighborOffsetType offset = this->m_Neighborhood.GetOffset(i); - signed int bufferOffset = 0; // must be a signed number + OffsetValueType bufferOffset = 0; for (unsigned int d = 0; d < InputImageDimension; d++) {