Skip to content

Commit 236a49f

Browse files
committed
fix(OutputImage): computation of buffer size
1 parent 3da8798 commit 236a49f

File tree

10 files changed

+48
-4
lines changed

10 files changed

+48
-4
lines changed

include/itkImportVectorImageFilter.hxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ ImportVectorImageFilter<TOutputImage>::GenerateOutputInformation()
138138
outputPtr->SetDirection(m_Direction);
139139
outputPtr->SetLargestPossibleRegion(m_LargestPossibleRegion);
140140

141-
if (outputPtr->GetNameOfClass() == "VectorImage")
141+
if (outputPtr->GetNameOfClass() == std::string("VectorImage"))
142142
{
143143
outputPtr->SetNumberOfComponentsPerPixel(m_VectorImageComponentsPerPixel);
144144
}

include/itkOutputImage.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,15 @@ class ITK_TEMPLATE_EXPORT OutputImage
8484

8585
const auto dataAddress = reinterpret_cast< size_t >( wasmImage->GetImage()->GetBufferPointer() );
8686
using ConvertPixelTraits = DefaultConvertPixelTraits<typename ImageType::PixelType>;
87-
const auto dataSize = wasmImage->GetImage()->GetPixelContainer()->Size() * sizeof(typename ConvertPixelTraits::ComponentType) * ConvertPixelTraits::GetNumberOfComponents();
87+
const auto dataSize =
88+
wasmImage->GetImage()->GetBufferedRegion().GetNumberOfPixels()
89+
* sizeof(typename ConvertPixelTraits::ComponentType)
90+
* wasmImage->GetImage()->GetNumberOfComponentsPerPixel();
91+
if (dataSize <= 0)
92+
{
93+
std::cerr << "dataSize cannot be zero or negative." << std::endl;
94+
abort();
95+
}
8896
setMemoryStoreOutputArray(0, index, 0, dataAddress, dataSize);
8997

9098
const auto directionAddress = reinterpret_cast< size_t >( wasmImage->GetImage()->GetDirection().GetVnlMatrix().begin() );

test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ itk_add_test(NAME itkPipelineMemoryIOTest
242242
${ITK_TEST_OUTPUT_DIR}/itkPipelineMemoryIOTestOutputCompositeTransform.h5
243243
DATA{Input/cow.vtk}
244244
${ITK_TEST_OUTPUT_DIR}/itkPipelineMemoryIOTestOutputPointSet.vtk
245+
DATA{Input/apple.jpg}
246+
${ITK_TEST_OUTPUT_DIR}/itkPipelineMemoryIOTestOutputVectorImage.mha
245247
)
246248

247249
itk_add_test(NAME itkPipelineInterfaceJSONTest

test/itkPipelineMemoryIOTest.cxx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,28 @@ itkPipelineMemoryIOTest(int argc, char * argv[])
216216
void * readWasmPointSetPointer = reinterpret_cast< void * >( itk_wasm_input_json_alloc(0, 7, readPointSetJSON.size()));
217217
std::memcpy(readWasmPointSetPointer, readPointSetJSON.data(), readPointSetJSON.size());
218218

219-
const char * mockArgv[] = {"itkPipelineMemoryIOTest", "--memory-io", "0", "0", "1", "1", "2", "2", "3", "3", "4", "4", "5", "5", "6", "6", "7", "7", NULL};
220-
itk::wasm::Pipeline pipeline("pipeline-test", "A test ITK Wasm Pipeline", 18, const_cast< char ** >(mockArgv));
219+
using VectorImageType = itk::VectorImage<PixelType, Dimension>;
220+
// VectorImage test
221+
const char * inputVectorImageFile = argv[18];
222+
auto readVectorInputImage = itk::ReadImage<VectorImageType>(inputVectorImageFile);
223+
using VectorImageToWasmImageFilterType = itk::ImageToWasmImageFilter<VectorImageType>;
224+
auto vectorImageToWasmImageFilter = VectorImageToWasmImageFilterType::New();
225+
vectorImageToWasmImageFilter->SetInput(readVectorInputImage);
226+
vectorImageToWasmImageFilter->Update();
227+
auto readWasmVectorImage = vectorImageToWasmImageFilter->GetOutput();
228+
229+
auto readWasmVectorImageData = reinterpret_cast< const void * >(readWasmVectorImage->GetImage()->GetBufferPointer());
230+
const auto readWasmVectorImageDataSize = readWasmVectorImage->GetImage()->GetPixelContainer()->Size();
231+
const size_t readWasmVectorImageDataPointerAddress = itk_wasm_input_array_alloc(0, 8, 0, readWasmVectorImageDataSize);
232+
auto readWasmVectorImageDataPointer = reinterpret_cast< void * >(readWasmVectorImageDataPointerAddress);
233+
std::memcpy(readWasmVectorImageDataPointer, readWasmVectorImageData, readWasmVectorImageDataSize);
234+
235+
auto readVectorImageJSON = readWasmVectorImage->GetJSON();
236+
void * readWasmVectorImagePointer = reinterpret_cast< void * >( itk_wasm_input_json_alloc(0, 8, readVectorImageJSON.size()));
237+
std::memcpy(readWasmVectorImagePointer, readVectorImageJSON.data(), readVectorImageJSON.size());
238+
239+
const char * mockArgv[] = {"itkPipelineMemoryIOTest", "--memory-io", "0", "0", "1", "1", "2", "2", "3", "3", "4", "4", "5", "5", "6", "6", "7", "7", "8", "8", NULL};
240+
itk::wasm::Pipeline pipeline("pipeline-test", "A test ITK Wasm Pipeline", 20, const_cast< char ** >(mockArgv));
221241

222242
std::string example_string_option = "default";
223243
pipeline.add_option("-s,--string", example_string_option, "A help string");
@@ -294,6 +314,14 @@ itkPipelineMemoryIOTest(int argc, char * argv[])
294314
OutputPointSetType outputPointSet;
295315
pipeline.add_option("output-point-set", outputPointSet, "The output point set")->required()->type_name("OUTPUT_POINTSET");
296316

317+
using InputVectorImageType = itk::wasm::InputImage<VectorImageType>;
318+
InputVectorImageType inputVectorImage;
319+
pipeline.add_option("input-vector-image", inputVectorImage, "The inputImage")->required()->type_name("INPUT_IMAGE");
320+
321+
using OutputVectorImageType = itk::wasm::OutputImage<VectorImageType>;
322+
OutputVectorImageType outputVectorImage;
323+
pipeline.add_option("output-vector-image", outputVectorImage, "The outputVectorImage")->required()->type_name("OUTPUT_IMAGE");
324+
297325
ITK_WASM_PARSE(pipeline);
298326

299327
outputImage.Set(inputImage.Get());
@@ -318,5 +346,7 @@ itkPipelineMemoryIOTest(int argc, char * argv[])
318346
outputTransform.Set(inputTransform.Get());
319347
outputCompositeTransform.Set(inputCompositeTransform.Get());
320348

349+
outputVectorImage.Set(inputVectorImage.Get());
350+
321351
return EXIT_SUCCESS;
322352
}

test/itkPipelineTest.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ itkPipelineTest(int argc, char * argv[])
145145

146146
const std::string inputBinaryStreamContent{ std::istreambuf_iterator<char>(inputBinaryStream.Get()),
147147
std::istreambuf_iterator<char>() };
148+
#if defined(_WIN64) || defined(_WIN32)
149+
ITK_TEST_EXPECT_TRUE(inputBinaryStreamContent == "test 123\r\n");
150+
#else
148151
ITK_TEST_EXPECT_TRUE(inputBinaryStreamContent == "test 123\n");
152+
#endif
149153

150154
outputBinaryStream.Get() << inputBinaryStreamContent;
151155

0 commit comments

Comments
 (0)