From 0aea3c3876e975b63dfbde73a97372b79b2ba14c Mon Sep 17 00:00:00 2001 From: Kent Williams Date: Thu, 15 May 2014 13:34:46 -0500 Subject: [PATCH 01/50] COMP: Initial add for source --- Modules/IO/IOFDF/CMakeLists.txt | 3 + .../IO/IOFDF/include/itkFDFCommonImageIO.h | 95 +++ Modules/IO/IOFDF/include/itkFDFImageIO.h | 145 +++++ .../IO/IOFDF/include/itkFDFImageIOFactory.h | 71 +++ Modules/IO/IOFDF/itk-module.cmake | 16 + Modules/IO/IOFDF/src/CMakeLists.txt | 15 + Modules/IO/IOFDF/src/ImageReadWrite.cxx | 70 +++ Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx | 75 +++ Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 561 ++++++++++++++++++ Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 45 ++ Modules/IO/IOFDF/test/CMakeLists.txt | 13 + Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 44 ++ Modules/IO/IOFDF/test/test.fdf | Bin 0 -> 263088 bytes 13 files changed, 1153 insertions(+) create mode 100644 Modules/IO/IOFDF/CMakeLists.txt create mode 100644 Modules/IO/IOFDF/include/itkFDFCommonImageIO.h create mode 100644 Modules/IO/IOFDF/include/itkFDFImageIO.h create mode 100644 Modules/IO/IOFDF/include/itkFDFImageIOFactory.h create mode 100644 Modules/IO/IOFDF/itk-module.cmake create mode 100644 Modules/IO/IOFDF/src/CMakeLists.txt create mode 100644 Modules/IO/IOFDF/src/ImageReadWrite.cxx create mode 100644 Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx create mode 100644 Modules/IO/IOFDF/src/itkFDFImageIO.cxx create mode 100644 Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx create mode 100644 Modules/IO/IOFDF/test/CMakeLists.txt create mode 100644 Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx create mode 100644 Modules/IO/IOFDF/test/test.fdf diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt new file mode 100644 index 00000000000..008af3e126b --- /dev/null +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -0,0 +1,3 @@ +project(ITKIOFDF) +set(ITKIOFDF_LIBRARIES ITKIOFDF) +itk_module_impl() diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h new file mode 100644 index 00000000000..c3a6414e7c4 --- /dev/null +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -0,0 +1,95 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _FDFCommonImageIO_H_ +#define _FDFCommonImageIO_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include + +std::string +RemoveCharacters(std::string, char); + +void +Tokenize(const std::string & str, std::vector & tokens, const std::string & delimiters = " "); + +std::string +ParseLine(std::string line); + +template +void +ConvertFromString(std::string s, T & value) +{ + std::stringstream str; + str << s; + str >> value; +} + +template +void +StringToVector(std::string value, std::vector & values) +{ + std::vector tokens; + + // value consists of something like {256,256} + std::string::size_type startBracketPosition = value.find_first_of("{", 0); + std::string::size_type endBracketPosition = value.find_first_of("}", startBracketPosition); + + if (startBracketPosition != std::string::npos && endBracketPosition != std::string::npos) + { + std::string elements = value.substr(startBracketPosition + 1, endBracketPosition - startBracketPosition - 1); + + + Tokenize(elements, tokens, ","); + } + + T element; + + for (unsigned int i = 0; i < tokens.size(); i++) + { + ConvertFromString(tokens[i], element); + values.push_back(element); + } +} + +template +void +PrintVector(std::ostream & os, std::string name, const std::vector & vect) +{ + int size = vect.size(); + + os << name << " {"; + + for (int i = 0; i < size; i++) + { + os << vect[i]; + + if (i < size - 1) + os << ", "; + } + + os << "}" << std::endl; +} + +#endif diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h new file mode 100644 index 00000000000..6ae6c873de2 --- /dev/null +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -0,0 +1,145 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __itkFDFImageIO_h +#define __itkFDFImageIO_h + +#include "itkImageIOBase.h" + +namespace itk +{ + +/* \brief ImageIO object for reading and writing FDF images + * + * \ingroup IOFilters + * + */ +class ITK_EXPORT FDFImageIO : public ImageIOBase +{ +public: + /** Standard class typedefs. */ + typedef FDFImageIO Self; + typedef ImageIOBase Superclass; + typedef SmartPointer Pointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(FDFImageIO, ImageIOBase); + + virtual bool + SupportsDimension(unsigned long dim) + { + if (dim == 2 || dim == 3) + { + return true; + } + else + { + return false; + } + } + + + /*-------- This part of the interface deals with reading data. ------ */ + + /** Determine the file type. Returns true if this ImageIO can read the + * file specified. */ + virtual bool + CanReadFile(const char *); + + /** Set the spacing and diemention information for the set filename. */ + virtual void + ReadImageInformation(); + + /** Get the type of the pixel. */ + // virtual const std::type_info& GetPixelType() const; + + /** Reads the data from disk into the memory buffer provided. */ + virtual void + Read(void * buffer); + + /** Reads 3D data from multiple files assuming one slice per file. */ + virtual void + ReadVolume(void * buffer); + + /** Compute the size (in bytes) of the components of a pixel. For + * example, and RGB pixel of unsigned char would have a + * component size of 1 byte. */ + // virtual unsigned int GetComponentSize() const; + + /*-------- This part of the interfaces deals with writing data. ----- */ + + /** Determine the file type. Returns true if this ImageIO can read the + * file specified. */ + virtual bool + CanWriteFile(const char *); + + /** Writes the spacing and dimentions of the image. + * Assumes SetFileName has been called with a valid file name. */ + virtual void + WriteImageInformation(); + + /** Writes the data to disk from the memory buffer provided. Make sure + * that the IORegion has been set properly. */ + virtual void + Write(const void * buffer); + +protected: + FDFImageIO(); + ~FDFImageIO(); + void + PrintSelf(std::ostream & os, Indent indent) const; + + void + WriteSlice(std::string & fileName, const void * buffer); + + int + ReadHeader(const char * FileNameToRead); + +private: + FDFImageIO(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented + + void + SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels); + + // Position after ReadImageInformation. + size_t m_InputPosition; + + std::string m_SpatialRank; + std::string m_Checksum; + std::string m_Bits; + std::vector m_Size; + std::vector m_Location; + std::vector m_Span; + std::vector m_Roi; +}; + +} // end namespace itk + + +#define RAISE_EXCEPTION() \ + { \ + ExceptionObject exception(__FILE__, __LINE__); \ + exception.SetDescription("File cannot be read"); \ + throw exception; \ + } + +#endif diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h new file mode 100644 index 00000000000..0fdbdc3e301 --- /dev/null +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -0,0 +1,71 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef __itkFDFImageIOFactory_h +#define __itkFDFImageIOFactory_h + +#include "itkObjectFactoryBase.h" +#include "itkImageIOBase.h" + +namespace itk +{ +/** \class FDFImageIOFactory + * \ingroup ITKIOFDF + * \brief Create instances of FDFImageIO objects using an object factory. + */ +class ITK_EXPORT FDFImageIOFactory : public ObjectFactoryBase +{ +public: + /** Standard class typedefs. */ + typedef FDFImageIOFactory Self; + typedef ObjectFactoryBase Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Class methods used to interface with the registered factories. */ + virtual const char * + GetITKSourceVersion(void) const; + virtual const char * + GetDescription(void) const; + + /** Method for class instantiation. */ + itkFactorylessNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(DicomImageIOFactory, ObjectFactoryBase); + + /** Register one factory of this type */ + static void + RegisterOneFactory(void) + { + FDFImageIOFactory::Pointer FdfFactory = FDFImageIOFactory::New(); + ObjectFactoryBase::RegisterFactory(FdfFactory); + } + +protected: + FDFImageIOFactory(); + ~FDFImageIOFactory(); + +private: + FDFImageIOFactory(const Self &); // purposely not implemented + void + operator=(const Self &); // purposely not implemented +}; + + +} // end namespace itk + +#endif diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake new file mode 100644 index 00000000000..3b99f38fded --- /dev/null +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -0,0 +1,16 @@ +set( + DOCUMENTATION + "This modules contains an ImageIO class to read or write the +FDF image format." +) + +itk_module( + ITKIOFDF + DEPENDS + ITKNIFTI + ITKIOImageBase + TEST_DEPENDS + ITKTestKernel + ITKTransform + DESCRIPTION "${DOCUMENTATION}" +) diff --git a/Modules/IO/IOFDF/src/CMakeLists.txt b/Modules/IO/IOFDF/src/CMakeLists.txt new file mode 100644 index 00000000000..76b34c87062 --- /dev/null +++ b/Modules/IO/IOFDF/src/CMakeLists.txt @@ -0,0 +1,15 @@ +set( + ITKIOFDF_SRC + itkFDFImageIO.cxx + itkFDFCommonImageIO.cxx + itkFDFImageIOFactory.cxx +) + +add_library(ITKIOFDF ${ITKIOFDF_SRC}) + +target_link_libraries( + ITKIOFDF + ${ITKIOImageBase_LIBRARIES} + ${ITKTransform_LIBRARIES} +) +itk_module_target(ITKIOFDF) diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx new file mode 100644 index 00000000000..ff50534dc25 --- /dev/null +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -0,0 +1,70 @@ +#include "itkImageFileReader.h" +#include "itkImageToVTKImageFilter.h" +#include "itkNormalizeImageFilter.h" +#include "itkChangeInformationImageFilter.h" +#include + +#include "itkFDFImageIOFactory.h" +#include "itkFDFImageIO.h" + +#include + +#include "itkImage.h" + +int +main(int argc, char ** argv) +{ + typedef float PixelType; + const unsigned int Dimension = 2; + typedef itk::Image ImageType; + typedef itk::ImageFileReader ReaderType; + typedef itk::ImageToVTKImageFilter ImageToVTKType; + typedef itk::NormalizeImageFilter NormalizeFilter; + typedef itk::ChangeInformationImageFilter ChangeInformationFilter; + + // Register FDF Factory + itk::FDFImageIOFactory::RegisterOneFactory(); + + ReaderType::Pointer reader = ReaderType::New(); + NormalizeFilter::Pointer normalizer = NormalizeFilter::New(); + ChangeInformationFilter::Pointer movingChange = ChangeInformationFilter::New(); + + reader->SetFileName("/home/glenn/development/reader/test.fdf"); + + try + { + reader->Update(); + } + catch (itk::ExceptionObject & exp) + { + std::cerr << "Exception caught" << std::endl; + std::cerr << exp << std::endl; + } + + std::cout << reader << std::endl; + + normalizer->SetInput(reader->GetOutput()); + + movingChange->SetInput(normalizer->GetOutput()); + movingChange->CenterImageOn(); + + + vtkRenderWindowInteractor * iren = vtkRenderWindowInteractor::New(); + + ImageToVTKType::Pointer bridge = ImageToVTKType::New(); + bridge->SetInput(movingChange->GetOutput()); + + vtkImageViewer * viewer = vtkImageViewer::New(); + viewer->SetInput(bridge->GetOutput()); + viewer->SetColorWindow(1); + viewer->SetColorLevel(0.1); + // viewer->SetupInteractor(iren); + + while (1) + viewer->Render(); + + viewer->Delete(); + // iren->Delete(); + + return 0; +} diff --git a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx new file mode 100644 index 00000000000..52d9bf8b63c --- /dev/null +++ b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx @@ -0,0 +1,75 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "itkFDFCommonImageIO.h" + +// Remove a particular type of character from a string +std::string +RemoveCharacters(std::string line, char character) +{ + line.erase(std::remove(line.begin(), line.end(), character), line.end()); + return line; +} + +void +Tokenize(const std::string & str, std::vector & tokens, const std::string & delimiters) +{ + // Skip delimiters at beginning. + std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); + // Find first "non-delimiter". + std::string::size_type pos = str.find_first_of(delimiters, lastPos); + + while (std::string::npos != pos || std::string::npos != lastPos) + { + // Found a token, add it to the vector. + tokens.push_back(str.substr(lastPos, pos - lastPos)); + // Skip delimiters. Note the "not_of" + lastPos = str.find_first_not_of(delimiters, pos); + // Find next "non-delimiter" + pos = str.find_first_of(delimiters, lastPos); + } +} + +std::string +ParseLine(std::string line) +{ + // strip * + line = RemoveCharacters(line, '*'); + line = RemoveCharacters(line, '\"'); + line = RemoveCharacters(line, '['); + line = RemoveCharacters(line, ']'); + + // Need to deal with space between {} + std::string::size_type startBracketPosition = line.find_first_of("{", 0); + std::string::size_type endBracketPosition = line.find_first_of("}", startBracketPosition); + + if (startBracketPosition != std::string::npos && endBracketPosition != std::string::npos) + { + std::string element = line.substr(startBracketPosition, endBracketPosition - startBracketPosition); + + // Find whitespace within {} and erase + std::string::size_type whiteSpacePosition = line.find_first_of(" ", startBracketPosition); + + while (whiteSpacePosition != std::string::npos) + { + line.erase(whiteSpacePosition, 1); + whiteSpacePosition = line.find_first_of(" ", whiteSpacePosition); + } + } + + return line; +} diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx new file mode 100644 index 00000000000..0f297a2099d --- /dev/null +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -0,0 +1,561 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include "itkFDFImageIO.h" +#include "itkFDFCommonImageIO.h" + +#include "itkByteSwapper.h" +#include "itkRGBPixel.h" +#include "itkRGBAPixel.h" +#include +#include + +namespace itk +{ + +bool +FDFImageIO::CanReadFile(const char * file) +{ + this->SetFileName(file); + + // First check the extension + std::string filename = file; + if (filename == "") + { + itkDebugMacro(<< "No filename specified."); + return false; + } + + bool extensionFound = false; + std::string::size_type FDFPos = filename.rfind(".fdf"); + if ((FDFPos != std::string::npos) && (FDFPos == filename.length() - 4)) + { + extensionFound = true; + } + + FDFPos = filename.rfind(".FDF"); + if ((FDFPos != std::string::npos) && (FDFPos == filename.length() - 4)) + { + extensionFound = true; + } + + if (!extensionFound) + { + itkDebugMacro(<< "The filename extension is not recognized"); + return false; + } + + std::ifstream inFile; + inFile.open(m_FileName.c_str(), std::ios::in | std::ios::binary); + if (!inFile) + { + ExceptionObject exception(__FILE__, __LINE__); + std::string msg = "File \"" + m_FileName + "\" cannot be read."; + exception.SetDescription(msg.c_str()); + throw exception; + } + + // Check for a neccessary header variable + + + return true; +} + +void +FDFImageIO::ReadImageInformation() +{ + if (!this->CanReadFile(m_FileName.c_str())) + RAISE_EXCEPTION(); + + std::string line; + std::vector tokens; + std::string type, name, value; + + ImageIORegion region; + + std::ifstream inFile(m_FileName.c_str(), std::ios::in | std::ios::binary); + + // Check if there was an error opening the file + if (!inFile) + { + std::cout << "Unable to open the file\n"; + RAISE_EXCEPTION(); + } + + this->SetFileTypeToBinary(); + + while (getline(inFile, line, '\n')) + { + if (line == "\0") + { + break; + } + + // Formats the lines in the FDF header such as removing whitespace between {} + line = ParseLine(line); + Tokenize(line, tokens, " ;"); + + if (tokens.size() == 4) + { + type = tokens[0]; + name = tokens[1]; + value = tokens[3]; + + if (name == "spatial_rank") + { + this->m_SpatialRank = value; + } + + if (name == "matrix") + { + std::vector dimensions; + StringToVector(value, dimensions); + + // Set the number of dimensions + if (this->GetNumberOfDimensions() < dimensions.size()) + { + this->SetNumberOfDimensions(dimensions.size()); + } + + ImageIORegion::SizeType size(dimensions.size()); + ImageIORegion::IndexType index(dimensions.size()); + + for (unsigned int i = 0; i < dimensions.size(); i++) + { + this->SetDimensions(i, dimensions[i]); + size[i] = dimensions[i]; + index[i] = 0; + } + + region.SetSize(size); + region.SetIndex(index); + this->SetIORegion(region); + } + + if (name == "orientation") + { + std::vector orientation; + StringToVector(value, orientation); + + for (unsigned int i = 0; i < this->GetNumberOfDimensions(); i++) + { + std::vector componentVector; + for (unsigned int j = 0; j < this->GetNumberOfDimensions(); j++) + { + componentVector.push_back(orientation[i * this->GetNumberOfDimensions() + j]); + } + this->SetDirection(i, componentVector); + } + } + + if (name == "span") + { + StringToVector(value, this->m_Span); + } + + if (name == "origin") + { + std::vector origin; + StringToVector(value, origin); + + if (this->GetNumberOfDimensions() < origin.size()) + { + this->SetNumberOfDimensions(origin.size()); + } + + for (unsigned int i = 0; i < origin.size(); i++) + { + this->SetOrigin(i, origin[i] / 10.0); + } + } + + if (name == "roi") + { + StringToVector(value, this->m_Roi); + } + + if (name == "location") + { + StringToVector(value, this->m_Location); + } + + if (name == "bigendian") + { + if (value == "0") + { + this->SetByteOrderToLittleEndian(); + } + else + { + this->SetByteOrderToBigEndian(); + } + } + + // Get the binary data type + if (name == "storage") + { + this->SetPixelType(SCALAR); + + if (value == "double") + { + this->SetComponentType(DOUBLE); + } + else if (value == "float") + { + this->SetComponentType(FLOAT); + } + else if (value == "long") + { + this->SetComponentType(LONG); + } + else if (value == "unsigned long") + { + this->SetComponentType(ULONG); + } + else if (value == "int") + { + this->SetComponentType(INT); + } + else if (value == "unsigned int") + { + this->SetComponentType(UINT); + } + else if (value == "short") + { + this->SetComponentType(SHORT); + } + else if (value == "unsigned short") + { + this->SetComponentType(USHORT); + } + else if (value == "char") + { + this->SetComponentType(CHAR); + } + else if (value == "unsigned char") + { + this->SetComponentType(UCHAR); + } + else + { + itkExceptionMacro("Unknown component type: " << value); + } + } + + // Get the bits + if (name == "bits") + { + ConvertFromString(value, this->m_Bits); + } + + // Get the checksum + if (name == "checksum") + { + ConvertFromString(value, this->m_Checksum); + } + } + + tokens.clear(); + } + + inFile.seekg(0, std::ios::end); + long int fileSize = inFile.tellg(); + this->m_InputPosition = fileSize - this->GetImageSizeInBytes(); + + for (unsigned int i = 0; i < this->GetNumberOfDimensions(); i++) + { + this->SetSpacing(i, (this->m_Roi[i] * 10) / this->GetDimensions(i)); + } +} + + +void +FDFImageIO::ReadVolume(void *) +{} + +// const std::type_info& FDFImageIO::GetPixelType() const +// { +// switch(m_PixelType) +// { +// case UCHAR: +// return typeid(unsigned char); +// case USHORT: +// return typeid(unsigned short); +// case CHAR: +// return typeid(char); +// case SHORT: +// return typeid(short); +// case UINT: +// return typeid(unsigned int); +// case INT: +// return typeid(int); +// case ULONG: +// return typeid(unsigned long); +// case LONG: +// return typeid(long); +// case FLOAT: +// return typeid(float); +// case DOUBLE: +// return typeid(double); +// case RGB: +// return typeid(RGBPixel); +// case RGBA: +// return typeid(RGBAPixel); +// default: +// { +// itkExceptionMacro ("Invalid type: " << m_PixelType << ", only unsigned char, unsigned short, RGB +// are allowed."); return this->ConvertToTypeInfo(m_PixelType); +// } +// case UNKNOWN: +// itkExceptionMacro ("Unknown pixel type: " << m_PixelType); +// } +// return typeid(ImageIOBase::UnknownType); +// } + +// unsigned int FDFImageIO::GetComponentSize() const +// { +// switch(m_PixelType) +// { +// case UCHAR: +// return sizeof(unsigned char); +// case USHORT: +// return sizeof(unsigned short); +// case CHAR: +// return sizeof(char); +// case SHORT: +// return sizeof(short); +// case UINT: +// return sizeof(unsigned int); +// case INT: +// return sizeof(int); +// case ULONG: +// return sizeof(unsigned long); +// case LONG: +// return sizeof(long); +// case FLOAT: +// return sizeof(float); +// case DOUBLE: +// return sizeof(double); +// case RGB: +// return sizeof(unsigned char); +// case RGBA: +// return sizeof(unsigned char); +// case UNKNOWNPIXELTYPE: +// default: +// { +// itkExceptionMacro ("Invalid type: " << m_PixelType +// << ", only unsigned char and unsigned short are allowed."); +// return 0; +// } +// } +// +// return 1; +// } + +void +FDFImageIO::Read(void * buffer) +{ + std::ifstream inFile(m_FileName.c_str(), std::ios::in | std::ios::binary); + + // Check if there was an error opening the file + if (!inFile) + { + RAISE_EXCEPTION(); + } + + inFile.seekg(this->m_InputPosition); + + if (!inFile) + { + RAISE_EXCEPTION(); + } + + char * p = static_cast(buffer); + + inFile.read(p, this->GetImageSizeInBytes()); + + bool success = !inFile.bad(); + inFile.close(); + if (!success) + { + itkExceptionMacro("Error reading image data."); + } + + this->SwapBytesIfNecessary(buffer, this->GetImageSizeInPixels()); +} + + +FDFImageIO::FDFImageIO() {} + +FDFImageIO::~FDFImageIO() {} + +void +FDFImageIO::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + // os << indent << "PixelType " << m_PixelType << "\n"; + // os << indent << "Start of image in bytes from start of file " << this->m_InputPosition << "\n"; + // os << indent << "Number of pixels in image: " << this->GetImageSizeInPixels() << "\n"; + // os << indent << "Image size in bytes: " << this->GetImageSizeInBytes() << "\n"; + // os << indent << "Checksum: " << this->checksum << "\n"; + // os << indent << "Spatial Rank: " << this->spatial_rank << "\n"; + // os << indent << "Bits: " << this->bits << "\n"; + // os << indent; PrintVector(os, "Matrix", this->matrix); + // os << indent; PrintVector(os, "Location", this->location); + // os << indent; PrintVector(os, "ROI", this->roi); + // os << indent; PrintVector(os, "Span", this->span); +} + +bool +FDFImageIO::CanWriteFile(const char * /* name */) +{ + // not possible to write a fdf file + return false; +} + +void +FDFImageIO::SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels) +{ + switch (this->GetComponentType()) + { + case CHAR: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((char *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((char *)buffer, numberOfPixels); + } + break; + } + case FLOAT: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((float *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((float *)buffer, numberOfPixels); + } + break; + } + case UCHAR: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned char *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned char *)buffer, numberOfPixels); + } + break; + } + case SHORT: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((short *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((short *)buffer, numberOfPixels); + } + break; + } + case USHORT: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned short *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned short *)buffer, numberOfPixels); + } + break; + } + case INT: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((int *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((int *)buffer, numberOfPixels); + } + break; + } + case UINT: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned int *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned int *)buffer, numberOfPixels); + } + break; + } + case LONG: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((long *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((long *)buffer, numberOfPixels); + } + break; + } + case ULONG: + { + if (this->m_ByteOrder == LittleEndian) + { + ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned long *)buffer, numberOfPixels); + } + else if (this->m_ByteOrder == BigEndian) + { + ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned long *)buffer, numberOfPixels); + } + break; + } + default: + ExceptionObject exception(__FILE__, __LINE__); + exception.SetDescription("Pixel Type Unknown"); + throw exception; + } +} + +void +FDFImageIO::WriteImageInformation(void) +{ + // not possible to write a fdf file +} + +void +FDFImageIO::Write(const void * /* buffer */) +{ + // not possible to write a fdf file +} + +} // end namespace itk diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx new file mode 100644 index 00000000000..ca86c5b21cd --- /dev/null +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -0,0 +1,45 @@ +/* Copyright (C) 2004 Glenn Pierce. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "itkFDFImageIOFactory.h" +#include "itkCreateObjectFunction.h" +#include "itkFDFImageIO.h" +#include "itkVersion.h" + + +namespace itk +{ +FDFImageIOFactory::FDFImageIOFactory() +{ + this->RegisterOverride("itkImageIOBase", "itkFDFImageIO", "FDF Image IO", 1, CreateObjectFunction::New()); +} + +FDFImageIOFactory::~FDFImageIOFactory() {} + +const char * +FDFImageIOFactory::GetITKSourceVersion(void) const +{ + return ITK_SOURCE_VERSION; +} + +const char * +FDFImageIOFactory::GetDescription() const +{ + return "FDF ImageIO Factory, allows the loading of Varian FDF images into Insight"; +} + +} // end namespace itk diff --git a/Modules/IO/IOFDF/test/CMakeLists.txt b/Modules/IO/IOFDF/test/CMakeLists.txt new file mode 100644 index 00000000000..efbaee5d69f --- /dev/null +++ b/Modules/IO/IOFDF/test/CMakeLists.txt @@ -0,0 +1,13 @@ +itk_module_test() +set(ITKIOFDFTests itkFDFImageIOTest.cxx) + +createtestdriver(ITKIOFDF "${ITKIOFDF-Test_LIBRARIES}" "${ITKIOFDFTests}") + +itk_add_test( + NAME itkFDFImageIOTest + COMMAND + ITKIOFDFTestDriver + itkFDFImageIOTest + ${ITK_TEST_OUTPUT_DIR} + ${CMAKE_CURRENT_LIST_DIR}/test.fdf +) diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx new file mode 100644 index 00000000000..e0fb4e6e4c9 --- /dev/null +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -0,0 +1,44 @@ +#include +#include "itkImageFileReader.h" + +#include "itkFDFImageIOFactory.h" +#include "itkFDFImageIO.h" + +#include "itkImage.h" + +int +itkFDFImageIOTest(int argc, char ** argv) +{ + if (argc < 3) + { + std::cerr << "Usage: itkFDFImageIO ImageType; + typedef itk::ImageFileReader ReaderType; + + // Register FDF Factory + itk::FDFImageIOFactory::RegisterOneFactory(); + + ReaderType::Pointer reader = ReaderType::New(); + + reader->SetFileName(argv[2]); + + try + { + reader->Update(); + } + catch (itk::ExceptionObject & exp) + { + std::cerr << "Exception caught" << std::endl; + std::cerr << exp << std::endl; + return EXIT_FAILURE; + } + ImageType::Pointer im = reader->GetOutput(); + + std::cerr << im->GetDirection() << std::endl << im->GetOrigin() << std::endl << im->GetSpacing() << std::endl; + + return EXIT_SUCCESS; +} diff --git a/Modules/IO/IOFDF/test/test.fdf b/Modules/IO/IOFDF/test/test.fdf new file mode 100644 index 0000000000000000000000000000000000000000..06a385f4d7bbd5d3e794b275c4a8b1904ed836f5 GIT binary patch literal 263088 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

10C!BdB8sq2;E^co@ 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�t=(lH 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 KhhmNS+y4V9`YpNu literal 0 HcmV?d00001 From 4104fdba796aad5c5c56827946191a14913cbe15 Mon Sep 17 00:00:00 2001 From: Kent Williams Date: Thu, 15 May 2014 16:18:54 -0500 Subject: [PATCH 02/50] BUG: workaround degenerate direction matrix FDF files seem to have 3D rotation matrices even if the image is 2D. This can give them degenerate directions cosines. If that's the case punt and use identity direction cosines. --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 31 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index 0f297a2099d..d8693e4cfde 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -20,6 +20,7 @@ #include "itkByteSwapper.h" #include "itkRGBPixel.h" #include "itkRGBAPixel.h" +#include "vnl/vnl_matrix.h" #include #include @@ -147,20 +148,42 @@ FDFImageIO::ReadImageInformation() if (name == "orientation") { + const unsigned numDim(this->GetNumberOfDimensions()); std::vector orientation; StringToVector(value, orientation); - for (unsigned int i = 0; i < this->GetNumberOfDimensions(); i++) + vnl_matrix testDirections(numDim, numDim); + + for (unsigned int i = 0; i < numDim; i++) { std::vector componentVector; - for (unsigned int j = 0; j < this->GetNumberOfDimensions(); j++) + for (unsigned int j = 0; j < numDim; j++) { - componentVector.push_back(orientation[i * this->GetNumberOfDimensions() + j]); + double val = orientation[i * numDim + j]; + testDirections(j, i) = val; + componentVector.push_back(val); } this->SetDirection(i, componentVector); } + // check for degenerate dimensions. this will happen + // if the dimension of the image is 2 but the + // direction matrix in the file is 3x3. + // if direction matrix is degenerate, punt and set + // directions to identity + if (vnl_determinant(testDirections) == 0) + { + for (unsigned int i = 0; i < numDim; i++) + { + std::vector componentVector; + for (unsigned int j = 0; j < numDim; j++) + { + double val = i == j ? 1.0 : 0.0; + componentVector.push_back(val); + } + this->SetDirection(i, componentVector); + } + } } - if (name == "span") { StringToVector(value, this->m_Span); From 370dd7dfd5ae11bf74f16fcc52bfd23d3687ff12 Mon Sep 17 00:00:00 2001 From: Kent Williams Date: Thu, 15 May 2014 16:25:21 -0500 Subject: [PATCH 03/50] COMP: Added ITK wrapping subdirectory --- Modules/IO/IOFDF/wrapping/CMakeLists.txt | 3 +++ Modules/IO/IOFDF/wrapping/itkFDFImageIO.wrap | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 Modules/IO/IOFDF/wrapping/CMakeLists.txt create mode 100644 Modules/IO/IOFDF/wrapping/itkFDFImageIO.wrap diff --git a/Modules/IO/IOFDF/wrapping/CMakeLists.txt b/Modules/IO/IOFDF/wrapping/CMakeLists.txt new file mode 100644 index 00000000000..8dd4e4b78db --- /dev/null +++ b/Modules/IO/IOFDF/wrapping/CMakeLists.txt @@ -0,0 +1,3 @@ +itk_wrap_module(ITKIOFDF) +itk_auto_load_submodules() +itk_end_wrap_module() diff --git a/Modules/IO/IOFDF/wrapping/itkFDFImageIO.wrap b/Modules/IO/IOFDF/wrapping/itkFDFImageIO.wrap new file mode 100644 index 00000000000..bdaad6f2abb --- /dev/null +++ b/Modules/IO/IOFDF/wrapping/itkFDFImageIO.wrap @@ -0,0 +1,2 @@ +itk_wrap_simple_class("itk::FDFImageIO" POINTER) +itk_wrap_simple_class("itk::FDFImageIOFactory" POINTER) From 0f1c7224385dc76bbdb72611c90df0295182ef36 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Mon, 24 Nov 2014 13:08:45 -0500 Subject: [PATCH 04/50] BUG: Add export linkage specification to external classes. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 4 ++-- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 4 ++-- Modules/IO/IOFDF/itk-module.cmake | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 6ae6c873de2..240d9b31ec0 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -17,7 +17,7 @@ #ifndef __itkFDFImageIO_h #define __itkFDFImageIO_h - +#include "ITKIOFDFExport.h" #include "itkImageIOBase.h" namespace itk @@ -28,7 +28,7 @@ namespace itk * \ingroup IOFilters * */ -class ITK_EXPORT FDFImageIO : public ImageIOBase +class ITKIOFDF_EXPORT FDFImageIO : public ImageIOBase { public: /** Standard class typedefs. */ diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 0fdbdc3e301..531616b125c 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -16,7 +16,7 @@ */ #ifndef __itkFDFImageIOFactory_h #define __itkFDFImageIOFactory_h - +#include "ITKIOFDFExport.h" #include "itkObjectFactoryBase.h" #include "itkImageIOBase.h" @@ -26,7 +26,7 @@ namespace itk * \ingroup ITKIOFDF * \brief Create instances of FDFImageIO objects using an object factory. */ -class ITK_EXPORT FDFImageIOFactory : public ObjectFactoryBase +class ITKIOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { public: /** Standard class typedefs. */ diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 3b99f38fded..b250f9d353d 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -6,6 +6,7 @@ FDF image format." itk_module( ITKIOFDF + ENABLE_SHARED DEPENDS ITKNIFTI ITKIOImageBase From 8e0001e6b3cdd5c09f3a5e53e9133ee0810b84b2 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Mon, 24 Nov 2014 13:10:14 -0500 Subject: [PATCH 05/50] BUG: Add missing FDFImageIOFactoryRegister__Private method This method is expected and with out it a link error is generated. --- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index ca86c5b21cd..8c61c8f0644 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -42,4 +42,21 @@ FDFImageIOFactory::GetDescription() const return "FDF ImageIO Factory, allows the loading of Varian FDF images into Insight"; } + +// Undocumented API used to register during static initialization. +// DO NOT CALL DIRECTLY. + +static bool FDFImageIOFactoryHasBeenRegistered; + +void ITKIOFDF_EXPORT +FDFImageIOFactoryRegister__Private(void) +{ + if (!FDFImageIOFactoryHasBeenRegistered) + { + FDFImageIOFactoryHasBeenRegistered = true; + FDFImageIOFactory::RegisterOneFactory(); + } +} + + } // end namespace itk From f07f7b5f56194fb67110ef7efa179ae703d37176 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Fri, 12 Dec 2014 10:19:36 -0500 Subject: [PATCH 06/50] BUG: Rename Module to IOFDF The modules name is inconsistent and causing not to be used as a module in ITK. Previously ITK was calling itk FDFImageIO, while internally it was called ITKFDFImageIO. Neither name followed ITK conventions. The correct name for an external module does not begin with the ITK prefix and for this case should be: IOFDF The name of the module and related variable, libraries, export specifications etc, have been rename consistently. --- Modules/IO/IOFDF/CMakeLists.txt | 4 ++-- Modules/IO/IOFDF/include/itkFDFImageIO.h | 4 ++-- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 4 ++-- Modules/IO/IOFDF/itk-module.cmake | 2 +- Modules/IO/IOFDF/src/CMakeLists.txt | 8 ++++---- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 2 +- Modules/IO/IOFDF/test/CMakeLists.txt | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt index 008af3e126b..e8ac7c27fb1 100644 --- a/Modules/IO/IOFDF/CMakeLists.txt +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -1,3 +1,3 @@ -project(ITKIOFDF) -set(ITKIOFDF_LIBRARIES ITKIOFDF) +project(IOFDF) +set(IOFDF_LIBRARIES IOFDF) itk_module_impl() diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 240d9b31ec0..2d621f3a4d8 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -17,7 +17,7 @@ #ifndef __itkFDFImageIO_h #define __itkFDFImageIO_h -#include "ITKIOFDFExport.h" +#include "IOFDFExport.h" #include "itkImageIOBase.h" namespace itk @@ -28,7 +28,7 @@ namespace itk * \ingroup IOFilters * */ -class ITKIOFDF_EXPORT FDFImageIO : public ImageIOBase +class IOFDF_EXPORT FDFImageIO : public ImageIOBase { public: /** Standard class typedefs. */ diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 531616b125c..7cc1d27670d 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -16,7 +16,7 @@ */ #ifndef __itkFDFImageIOFactory_h #define __itkFDFImageIOFactory_h -#include "ITKIOFDFExport.h" +#include "IOFDFExport.h" #include "itkObjectFactoryBase.h" #include "itkImageIOBase.h" @@ -26,7 +26,7 @@ namespace itk * \ingroup ITKIOFDF * \brief Create instances of FDFImageIO objects using an object factory. */ -class ITKIOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase +class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { public: /** Standard class typedefs. */ diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index b250f9d353d..1d32b2e0f0c 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -5,7 +5,7 @@ FDF image format." ) itk_module( - ITKIOFDF + IOFDF ENABLE_SHARED DEPENDS ITKNIFTI diff --git a/Modules/IO/IOFDF/src/CMakeLists.txt b/Modules/IO/IOFDF/src/CMakeLists.txt index 76b34c87062..4871611aa2e 100644 --- a/Modules/IO/IOFDF/src/CMakeLists.txt +++ b/Modules/IO/IOFDF/src/CMakeLists.txt @@ -1,15 +1,15 @@ set( - ITKIOFDF_SRC + IOFDF_SRC itkFDFImageIO.cxx itkFDFCommonImageIO.cxx itkFDFImageIOFactory.cxx ) -add_library(ITKIOFDF ${ITKIOFDF_SRC}) +add_library(IOFDF ${IOFDF_SRC}) target_link_libraries( - ITKIOFDF + IOFDF ${ITKIOImageBase_LIBRARIES} ${ITKTransform_LIBRARIES} ) -itk_module_target(ITKIOFDF) +itk_module_target(IOFDF) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index 8c61c8f0644..d36104f5ab8 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -48,7 +48,7 @@ FDFImageIOFactory::GetDescription() const static bool FDFImageIOFactoryHasBeenRegistered; -void ITKIOFDF_EXPORT +void IOFDF_EXPORT FDFImageIOFactoryRegister__Private(void) { if (!FDFImageIOFactoryHasBeenRegistered) diff --git a/Modules/IO/IOFDF/test/CMakeLists.txt b/Modules/IO/IOFDF/test/CMakeLists.txt index efbaee5d69f..dd8b99cab77 100644 --- a/Modules/IO/IOFDF/test/CMakeLists.txt +++ b/Modules/IO/IOFDF/test/CMakeLists.txt @@ -1,12 +1,12 @@ itk_module_test() -set(ITKIOFDFTests itkFDFImageIOTest.cxx) +set(IOFDFTests itkFDFImageIOTest.cxx) -createtestdriver(ITKIOFDF "${ITKIOFDF-Test_LIBRARIES}" "${ITKIOFDFTests}") +createtestdriver(IOFDF "${IOFDF-Test_LIBRARIES}" "${IOFDFTests}") itk_add_test( NAME itkFDFImageIOTest COMMAND - ITKIOFDFTestDriver + IOFDFTestDriver itkFDFImageIOTest ${ITK_TEST_OUTPUT_DIR} ${CMAKE_CURRENT_LIST_DIR}/test.fdf From 5079eafd4a16b4caeaef62440eedfcba93d1fd52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Lehmann?= Date: Wed, 18 Feb 2015 18:25:29 +0100 Subject: [PATCH 07/50] BUG: fix wrapping module name --- Modules/IO/IOFDF/wrapping/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/wrapping/CMakeLists.txt b/Modules/IO/IOFDF/wrapping/CMakeLists.txt index 8dd4e4b78db..20a5cc43f48 100644 --- a/Modules/IO/IOFDF/wrapping/CMakeLists.txt +++ b/Modules/IO/IOFDF/wrapping/CMakeLists.txt @@ -1,3 +1,3 @@ -itk_wrap_module(ITKIOFDF) +itk_wrap_module(IOFDF) itk_auto_load_submodules() itk_end_wrap_module() From 75d6ebc76aa2de659eb8be76b96a95bba0b543ac Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Thu, 19 Feb 2015 08:25:22 -0500 Subject: [PATCH 08/50] COMP: Update itk-module.cmake Exclude from default. When this remote module was already downloaded, it was automatically turned enabled by default. Remove modules should not be enable by default --- Modules/IO/IOFDF/itk-module.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 1d32b2e0f0c..7fd8c5fcd2b 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -14,4 +14,5 @@ itk_module( ITKTestKernel ITKTransform DESCRIPTION "${DOCUMENTATION}" + EXCLUDE_FROM_DEFAULT ) From dcf3c193db6127081c0d2805176f33f37a4279d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Lehmann?= Date: Thu, 26 Feb 2015 08:57:02 +0100 Subject: [PATCH 09/50] BUG: fix factory class name --- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 7cc1d27670d..9daad710fce 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -45,7 +45,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase itkFactorylessNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(DicomImageIOFactory, ObjectFactoryBase); + itkTypeMacro(FDFImageIOFactory, ObjectFactoryBase); /** Register one factory of this type */ static void From bdee27c68e017cf6c17b541cf1f0ec48a97e0ff7 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Fri, 13 Mar 2015 10:21:36 -0400 Subject: [PATCH 10/50] STYLE: fixes according to KWStyle Moved "common" code to itk namespace. Fixed variable alignment and header guarders. --- Modules/IO/IOFDF/include/itkFDFCommonImageIO.h | 9 +++++++-- Modules/IO/IOFDF/include/itkFDFImageIO.h | 7 ++++--- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 4 ++-- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 5 +++-- Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx | 4 ++++ Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 5 +++-- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index c3a6414e7c4..a79d3a68a06 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -15,8 +15,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _FDFCommonImageIO_H_ -#define _FDFCommonImageIO_H_ +#ifndef itkFDFCommonImageIO_h +#define itkFDFCommonImageIO_h #include #include @@ -28,6 +28,9 @@ #include #include +namespace itk +{ + std::string RemoveCharacters(std::string, char); @@ -92,4 +95,6 @@ PrintVector(std::ostream & os, std::string name, const std::vector & vect) os << "}" << std::endl; } +} // namespace itk + #endif diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 2d621f3a4d8..a283ca9a060 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -15,15 +15,16 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __itkFDFImageIO_h -#define __itkFDFImageIO_h +#ifndef itkFDFImageIO_h +#define itkFDFImageIO_h #include "IOFDFExport.h" #include "itkImageIOBase.h" namespace itk { -/* \brief ImageIO object for reading and writing FDF images +/** \class FDFImageIO + * \brief ImageIO object for reading and writing FDF images * * \ingroup IOFilters * diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 9daad710fce..7b18527fb64 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -14,8 +14,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __itkFDFImageIOFactory_h -#define __itkFDFImageIOFactory_h +#ifndef itkFDFImageIOFactory_h +#define itkFDFImageIOFactory_h #include "IOFDFExport.h" #include "itkObjectFactoryBase.h" #include "itkImageIOBase.h" diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index ff50534dc25..864adf044c9 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -14,8 +14,9 @@ int main(int argc, char ** argv) { - typedef float PixelType; - const unsigned int Dimension = 2; + typedef float PixelType; + const unsigned int Dimension = 2; + typedef itk::Image ImageType; typedef itk::ImageFileReader ReaderType; typedef itk::ImageToVTKImageFilter ImageToVTKType; diff --git a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx index 52d9bf8b63c..3f20792d4c9 100644 --- a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx @@ -17,6 +17,9 @@ #include "itkFDFCommonImageIO.h" +namespace itk +{ + // Remove a particular type of character from a string std::string RemoveCharacters(std::string line, char character) @@ -73,3 +76,4 @@ ParseLine(std::string line) return line; } +} // namespace itk diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index e0fb4e6e4c9..9b23a737cf8 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -14,8 +14,9 @@ itkFDFImageIOTest(int argc, char ** argv) std::cerr << "Usage: itkFDFImageIO ImageType; typedef itk::ImageFileReader ReaderType; From 3ab52244f272ddb7b8b545eeeca71d2531cec263 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Tue, 31 Mar 2015 15:36:29 -0400 Subject: [PATCH 11/50] BUG: Fix IOFDFInDoxygenGroup test Set the required doxygen ingroup. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index a283ca9a060..9a3d2204061 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -26,7 +26,7 @@ namespace itk /** \class FDFImageIO * \brief ImageIO object for reading and writing FDF images * - * \ingroup IOFilters + * \ingroup IOIOFDF * */ class IOFDF_EXPORT FDFImageIO : public ImageIOBase From 0d7d2f31faaf386b3ffdaec663e56f2972295706 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Fri, 3 Apr 2015 08:42:30 -0400 Subject: [PATCH 12/50] BUG: Correct test function signature for windows --- Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index 9b23a737cf8..029587f8332 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -7,7 +7,7 @@ #include "itkImage.h" int -itkFDFImageIOTest(int argc, char ** argv) +itkFDFImageIOTest(int argc, char * argv[]) { if (argc < 3) { From 99e3f2c466f116486d3f6caf0c2610bf139a5fa7 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 3 May 2015 13:33:09 -0400 Subject: [PATCH 13/50] STYLE: Add missing ITK_OVERRIDE and license headers. Suggested-by: Hans Johnson --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 17 +++++++++-------- .../IO/IOFDF/include/itkFDFImageIOFactory.h | 4 ++-- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 17 +++++++++++++++++ Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 18 +++++++++++++++++- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 9a3d2204061..22f108c1555 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -24,6 +24,7 @@ namespace itk { /** \class FDFImageIO + * * \brief ImageIO object for reading and writing FDF images * * \ingroup IOIOFDF @@ -44,7 +45,7 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase itkTypeMacro(FDFImageIO, ImageIOBase); virtual bool - SupportsDimension(unsigned long dim) + SupportsDimension(unsigned long dim) ITK_OVERRIDE { if (dim == 2 || dim == 3) { @@ -62,18 +63,18 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ virtual bool - CanReadFile(const char *); + CanReadFile(const char *) ITK_OVERRIDE; /** Set the spacing and diemention information for the set filename. */ virtual void - ReadImageInformation(); + ReadImageInformation() ITK_OVERRIDE; /** Get the type of the pixel. */ // virtual const std::type_info& GetPixelType() const; /** Reads the data from disk into the memory buffer provided. */ virtual void - Read(void * buffer); + Read(void * buffer) ITK_OVERRIDE; /** Reads 3D data from multiple files assuming one slice per file. */ virtual void @@ -89,23 +90,23 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ virtual bool - CanWriteFile(const char *); + CanWriteFile(const char *) ITK_OVERRIDE; /** Writes the spacing and dimentions of the image. * Assumes SetFileName has been called with a valid file name. */ virtual void - WriteImageInformation(); + WriteImageInformation() ITK_OVERRIDE; /** Writes the data to disk from the memory buffer provided. Make sure * that the IORegion has been set properly. */ virtual void - Write(const void * buffer); + Write(const void * buffer) ITK_OVERRIDE; protected: FDFImageIO(); ~FDFImageIO(); void - PrintSelf(std::ostream & os, Indent indent) const; + PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; void WriteSlice(std::string & fileName, const void * buffer); diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 7b18527fb64..fac0e988735 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -37,9 +37,9 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase /** Class methods used to interface with the registered factories. */ virtual const char * - GetITKSourceVersion(void) const; + GetITKSourceVersion(void) const ITK_OVERRIDE; virtual const char * - GetDescription(void) const; + GetDescription(void) const ITK_OVERRIDE; /** Method for class instantiation. */ itkFactorylessNewMacro(Self); diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index 864adf044c9..f2950ef985c 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -1,3 +1,20 @@ +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #include "itkImageFileReader.h" #include "itkImageToVTKImageFilter.h" #include "itkNormalizeImageFilter.h" diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index 029587f8332..467e1476b0f 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -1,4 +1,20 @@ -#include +/*========================================================================= + * + * Copyright Insight Software Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #include "itkImageFileReader.h" #include "itkFDFImageIOFactory.h" From afdb19854268d0f2978c42fd5242ae238892504a Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 7 Jun 2015 23:38:38 -0400 Subject: [PATCH 14/50] ENH: Update the license header to the ISC copyright. Assign copyright to the Insight Software Consortium and use the Apache 2 license, ITK's current license. This will be merged pending approval by Glenn Pierce. --- .../IO/IOFDF/include/itkFDFCommonImageIO.h | 28 +++++++++---------- Modules/IO/IOFDF/include/itkFDFImageIO.h | 27 +++++++++--------- .../IO/IOFDF/include/itkFDFImageIOFactory.h | 27 +++++++++--------- Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx | 27 +++++++++--------- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 27 +++++++++--------- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 27 +++++++++--------- 6 files changed, 84 insertions(+), 79 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index a79d3a68a06..31acfce9b7f 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -1,20 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #ifndef itkFDFCommonImageIO_h #define itkFDFCommonImageIO_h diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 22f108c1555..27344b91b0d 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -1,19 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #ifndef itkFDFImageIO_h #define itkFDFImageIO_h diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index fac0e988735..ba498af35ee 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -1,19 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #ifndef itkFDFImageIOFactory_h #define itkFDFImageIOFactory_h #include "IOFDFExport.h" diff --git a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx index 3f20792d4c9..f597a1ff4a6 100644 --- a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx @@ -1,19 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #include "itkFDFCommonImageIO.h" diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index d8693e4cfde..af40fcaa877 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -1,19 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #include "itkFDFImageIO.h" #include "itkFDFCommonImageIO.h" diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index d36104f5ab8..d25167f3def 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -1,19 +1,20 @@ -/* Copyright (C) 2004 Glenn Pierce. +/*========================================================================= * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Copyright Insight Software Consortium * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ #include "itkFDFImageIOFactory.h" #include "itkCreateObjectFunction.h" From cc31fa8e838b5330b9558d67c8afc224374a2721 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Fri, 4 Dec 2015 03:46:43 -0500 Subject: [PATCH 15/50] BUG: Ensure factory is registered once. This commit updates CMakeLists.txt to ensure built library is shared. It also uses "RegisterFactoryInternal" to make sure the factory is registered once into the ImageIOFactory. See InsightSoftwareConsortium/ITK@39b4ab3 (BUG: Internal factory must use RegisterFactoryInternal method) for more details. See ITK issue #3393 https://issues.itk.org/jira/browse/ITK-3393 --- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- Modules/IO/IOFDF/src/CMakeLists.txt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index ba498af35ee..9d3d6fe2a40 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -53,7 +53,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase RegisterOneFactory(void) { FDFImageIOFactory::Pointer FdfFactory = FDFImageIOFactory::New(); - ObjectFactoryBase::RegisterFactory(FdfFactory); + ObjectFactoryBase::RegisterFactoryInternal(FdfFactory); } protected: diff --git a/Modules/IO/IOFDF/src/CMakeLists.txt b/Modules/IO/IOFDF/src/CMakeLists.txt index 4871611aa2e..6e2aafc082e 100644 --- a/Modules/IO/IOFDF/src/CMakeLists.txt +++ b/Modules/IO/IOFDF/src/CMakeLists.txt @@ -5,7 +5,11 @@ set( itkFDFImageIOFactory.cxx ) -add_library(IOFDF ${IOFDF_SRC}) +add_library( + IOFDF + ${ITK_LIBRARY_BUILD_TYPE} + ${IOFDF_SRC} +) target_link_libraries( IOFDF From 40c2b29ce5002b61ec455f323deebee7bc4d7b02 Mon Sep 17 00:00:00 2001 From: Zach Williamson Date: Wed, 29 Jun 2016 09:20:42 -0500 Subject: [PATCH 16/50] STYLE: Use Macro for Function Deletion --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 4 +--- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 27344b91b0d..69131234b86 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -116,9 +116,7 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase ReadHeader(const char * FileNameToRead); private: - FDFImageIO(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIO); void SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels); diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 9d3d6fe2a40..71869850051 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -61,9 +61,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase ~FDFImageIOFactory(); private: - FDFImageIOFactory(const Self &); // purposely not implemented - void - operator=(const Self &); // purposely not implemented + ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); }; From bf16ff05f1daed973d8a5fe642b7f1dfaca3bbe2 Mon Sep 17 00:00:00 2001 From: Francois Budin Date: Thu, 26 Oct 2017 16:49:50 -0400 Subject: [PATCH 17/50] ENH: Add FACTORY_NAMES parameter to itk_module() declaration This new parameter allows ITK to be aware any object that needs to be registered to the ITK factory. Remote modules that offer IO capabilities can be more easily integrated in ITK. --- Modules/IO/IOFDF/CMakeLists.txt | 2 ++ Modules/IO/IOFDF/itk-module.cmake | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt index e8ac7c27fb1..95af60a4700 100644 --- a/Modules/IO/IOFDF/CMakeLists.txt +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -1,3 +1,5 @@ +cmake_minimum_required(VERSION 2.8.12) project(IOFDF) set(IOFDF_LIBRARIES IOFDF) + itk_module_impl() diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 7fd8c5fcd2b..15ad40f7f4d 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -13,6 +13,8 @@ itk_module( TEST_DEPENDS ITKTestKernel ITKTransform + FACTORY_NAMES + ImageIO::FDF DESCRIPTION "${DOCUMENTATION}" EXCLUDE_FROM_DEFAULT ) From aa2d4336d7f16bcc39ef930779a5abd59845b78d Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Wed, 17 Jan 2018 17:52:19 +0100 Subject: [PATCH 18/50] ENH: Require cmake minimum version to be 3.9.5. Require CMake minimum version to be 3.9.5 following ITKv5 requiring C++11: https://discourse.itk.org/t/minimum-cmake-version-update/585 --- Modules/IO/IOFDF/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt index 95af60a4700..b857dd2fd4a 100644 --- a/Modules/IO/IOFDF/CMakeLists.txt +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.9.5) project(IOFDF) set(IOFDF_LIBRARIES IOFDF) From 1f70ee062802d6f8233bf9af30dd690fef47ca67 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 16 Dec 2017 19:16:59 -0600 Subject: [PATCH 19/50] ENH: ITKv5 override consistency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provide remove virtual and override Use clang-tidy to add ITK_OVERRIDE, and to remove redundant virtual on functions. cd ../ITK; clang-tidy -p ITK-clangtidy $find Modules/[A-J]* -name *.cxx |fgrep -v ThirdParty) -checks=-*,modernize-use-override -header-filter=.* -fix clang-tidy -p ITK-clangtidy $(find Modules/[K-Z]* -name *.cxx |fgrep -v ThirdParty) -checks=-*,modernize-use-override -header-filter=.* -fix https://stackoverflow.com/questions/39932391/virtual-override-or-both-c When you override a function you don't technically need to write either virtual or override. The original base class declaration needs the keyword virtual to mark it as virtual. In the derived class the function is virtual by way of having the ¹same type as the base class function. However, an override can help avoid bugs by producing a compilation error when the intended override isn't technically an override. E.g. that the function type isn't exactly like the base class function. Or that a maintenance of the base class changes that function's type, e.g. adding a defaulted argument. In the same way, a virtual keyword in the derived class can make such a bug more subtle, by ensuring that the function is still is virtual in further derived classes. So the general advice is, virtual for the base class function declaration. This is technically necessary. Use override (only) for a derived class' override. This helps with maintenance. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 16 ++++++++-------- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 69131234b86..71668b2e94e 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -45,7 +45,7 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Run-time type information (and related methods). */ itkTypeMacro(FDFImageIO, ImageIOBase); - virtual bool + bool SupportsDimension(unsigned long dim) ITK_OVERRIDE { if (dim == 2 || dim == 3) @@ -63,18 +63,18 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ - virtual bool + bool CanReadFile(const char *) ITK_OVERRIDE; /** Set the spacing and diemention information for the set filename. */ - virtual void + void ReadImageInformation() ITK_OVERRIDE; /** Get the type of the pixel. */ // virtual const std::type_info& GetPixelType() const; /** Reads the data from disk into the memory buffer provided. */ - virtual void + void Read(void * buffer) ITK_OVERRIDE; /** Reads 3D data from multiple files assuming one slice per file. */ @@ -90,22 +90,22 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ - virtual bool + bool CanWriteFile(const char *) ITK_OVERRIDE; /** Writes the spacing and dimentions of the image. * Assumes SetFileName has been called with a valid file name. */ - virtual void + void WriteImageInformation() ITK_OVERRIDE; /** Writes the data to disk from the memory buffer provided. Make sure * that the IORegion has been set properly. */ - virtual void + void Write(const void * buffer) ITK_OVERRIDE; protected: FDFImageIO(); - ~FDFImageIO(); + ~FDFImageIO() ITK_OVERRIDE; void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 71869850051..ed856a49b3d 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -37,9 +37,9 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase typedef SmartPointer ConstPointer; /** Class methods used to interface with the registered factories. */ - virtual const char * + const char * GetITKSourceVersion(void) const ITK_OVERRIDE; - virtual const char * + const char * GetDescription(void) const ITK_OVERRIDE; /** Method for class instantiation. */ @@ -58,7 +58,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase protected: FDFImageIOFactory(); - ~FDFImageIOFactory(); + ~FDFImageIOFactory() ITK_OVERRIDE; private: ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); From 1cca8f2800f547d918b2b36c3e62be5e64a56e8e Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sat, 16 Dec 2017 19:36:25 -0600 Subject: [PATCH 20/50] COMP: Use C++11 override directly git grep -l "ITK_OVERRIDE" | fgrep -v itk_compiler_detection.h | fgrep -v CMakeLists.txt |fgrep -v .cmake | xargs sed -i '' -e "s/ITK_OVERRIDE/override/g" --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 18 +++++++++--------- .../IO/IOFDF/include/itkFDFImageIOFactory.h | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 71668b2e94e..809db51a802 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -46,7 +46,7 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase itkTypeMacro(FDFImageIO, ImageIOBase); bool - SupportsDimension(unsigned long dim) ITK_OVERRIDE + SupportsDimension(unsigned long dim) override { if (dim == 2 || dim == 3) { @@ -64,18 +64,18 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ bool - CanReadFile(const char *) ITK_OVERRIDE; + CanReadFile(const char *) override; /** Set the spacing and diemention information for the set filename. */ void - ReadImageInformation() ITK_OVERRIDE; + ReadImageInformation() override; /** Get the type of the pixel. */ // virtual const std::type_info& GetPixelType() const; /** Reads the data from disk into the memory buffer provided. */ void - Read(void * buffer) ITK_OVERRIDE; + Read(void * buffer) override; /** Reads 3D data from multiple files assuming one slice per file. */ virtual void @@ -91,23 +91,23 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase /** Determine the file type. Returns true if this ImageIO can read the * file specified. */ bool - CanWriteFile(const char *) ITK_OVERRIDE; + CanWriteFile(const char *) override; /** Writes the spacing and dimentions of the image. * Assumes SetFileName has been called with a valid file name. */ void - WriteImageInformation() ITK_OVERRIDE; + WriteImageInformation() override; /** Writes the data to disk from the memory buffer provided. Make sure * that the IORegion has been set properly. */ void - Write(const void * buffer) ITK_OVERRIDE; + Write(const void * buffer) override; protected: FDFImageIO(); - ~FDFImageIO() ITK_OVERRIDE; + ~FDFImageIO() override; void - PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE; + PrintSelf(std::ostream & os, Indent indent) const override; void WriteSlice(std::string & fileName, const void * buffer); diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index ed856a49b3d..92e041c5abf 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -38,9 +38,9 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase /** Class methods used to interface with the registered factories. */ const char * - GetITKSourceVersion(void) const ITK_OVERRIDE; + GetITKSourceVersion(void) const override; const char * - GetDescription(void) const ITK_OVERRIDE; + GetDescription(void) const override; /** Method for class instantiation. */ itkFactorylessNewMacro(Self); @@ -58,7 +58,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase protected: FDFImageIOFactory(); - ~FDFImageIOFactory() ITK_OVERRIDE; + ~FDFImageIOFactory() override; private: ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); From 6245535ed73b6a3d51fadc627fb9ae9fe2a3b478 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 14 Jan 2018 10:51:03 -0700 Subject: [PATCH 21/50] COMP: Use C++ headers over C header Some headers from C library were deprecated in C++ and are no longer welcome in C++ codebases. Some have no effect in C++. For more details refer to the C++ 14 Standard [depr.c.headers] section. This patch replaces C standard library headers with their C++ alternatives and removes redundant ones. --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index af40fcaa877..dc6ff46b328 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -22,7 +22,7 @@ #include "itkRGBPixel.h" #include "itkRGBAPixel.h" #include "vnl/vnl_matrix.h" -#include +#include #include namespace itk From 8775ca7fa8b47825f3dbf8222d3e62fa9887785f Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 15:21:00 -0600 Subject: [PATCH 22/50] STYLE: Modernize to C++11 conventions STYLE: Use auto for variable creation This check is responsible for using the auto type specifier for variable declarations to improve code readability and maintainability. The auto type specifier will only be introduced in situations where the variable type matches the type of the initializer expression. In other words auto should deduce the same type that was originally spelled in the source cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-use-auto -header-filter=.* -fix use auto when declaring iterators use auto when initializing with a cast to avoid duplicating the type name use auto when initializing with a template cast to avoid duplicating the type name use auto when initializing with new to avoid duplicating the type name SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD PERF: Replace explicit return calls of constructor Replaces explicit calls to the constructor in a return with a braced initializer list. This way the return type is not needlessly duplicated in the function definition and the return statement. SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-return-braced-init-list -header-filter=.* -fix PERF: Allow compiler to choose best way to construct a copy With move semantics added to the language and the standard library updated with move constructors added for many types it is now interesting to take an argument directly by value, instead of by const-reference, and then copy. This check allows the compiler to take care of choosing the best way to construct the copy. The transformation is usually beneficial when the calling code passes an rvalue and assumes the move construction is a cheap operation. This short example illustrates how the construction of the value happens: class Foo { public: - Foo(const std::string &Copied, const std::string &ReadOnly) - : Copied(Copied), ReadOnly(ReadOnly) {} + Foo(std::string Moved, const std::string &ReadOnly) + : Copied(std::move(Moved)), ReadOnly(ReadOnly) {} private: private: std::string Copied; const std::string &ReadOnly; }; SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-pass-by-value -header-filter=.* -fix STYLE: Use range-based loops from C++11 Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container, in the forward direction. ==== Range based loopes are more explicit for only computing the end location once for containers. for ( ImageIORegion::IndexType::const_iterator i = this->GetIndex().begin(); i != this->GetIndex().end(); //<- NOTE: Compute end every loop iteration ++i ) for (long i : this->GetIndex()) //<- NOTE: Implicitly only compute end once ==== Explicitly reduce the amount of index computations: (The compiler probably does this too) for(int i = 0; i < 11; i++) { pos[0] = testPoints[i][0]; pos[1] = testPoints[i][1]; ^^^^ for(auto & testPoint : testPoints) { pos[0] = testPoint[0]; pos[1] = testPoint[1]; ==== SRCDIR=/Users/johnsonhj/Dashboard/src/ITK #My local SRC BLDDIR=/Users/johnsonhj/Dashboard/src/ITK-clangtidy/ #My local BLD cd /Users/johnsonhj/Dashboard/src/ITK-clangtidy/ run-clang-tidy.py -checks=-*,modernize-loop-convert -header-filter=.* -fix --- Modules/IO/IOFDF/include/itkFDFCommonImageIO.h | 4 ++-- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index 31acfce9b7f..66c92ec7c42 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -69,9 +69,9 @@ StringToVector(std::string value, std::vector & values) T element; - for (unsigned int i = 0; i < tokens.size(); i++) + for (auto & token : tokens) { - ConvertFromString(tokens[i], element); + ConvertFromString(token, element); values.push_back(element); } } diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index dc6ff46b328..cea7bb1ce22 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -407,7 +407,7 @@ FDFImageIO::Read(void * buffer) RAISE_EXCEPTION(); } - char * p = static_cast(buffer); + auto * p = static_cast(buffer); inFile.read(p, this->GetImageSizeInBytes()); From c92b16e3b7887fb27913ea50b8742d96983d3d75 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 12 Feb 2018 23:29:53 -0600 Subject: [PATCH 23/50] STYLE: Prefer C++11 type alias over typedef == http://en.cppreference.com/w/cpp/language/type_alias == Type alias is a name that refers to a previously defined type (similar to typedef). A type alias declaration introduces a name which can be used as a synonym for the type denoted by type-id. It does not introduce a new type and it cannot change the meaning of an existing type name. There is no difference between a type alias declaration and typedef declaration. This declaration may appear in block scope, class scope, or namespace scope. == https://www.quora.com/Is-using-typedef-in-C++-considered-a-bad-practice == While typedef is still available for backward compatibility, the new Type Alias syntax 'using Alias = ExistingLongName;' is more consistent with the flow of C++ than the old typedef syntax 'typedef ExistingLongName Alias;', and it also works for templates (Type alias, alias template (since C++11)), so leftover 'typedef' aliases will differ in style from any alias templates. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 8 ++++---- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 10 +++++----- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 12 ++++++------ Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 6 +++--- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 809db51a802..c586eff896d 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -34,10 +34,10 @@ namespace itk class IOFDF_EXPORT FDFImageIO : public ImageIOBase { public: - /** Standard class typedefs. */ - typedef FDFImageIO Self; - typedef ImageIOBase Superclass; - typedef SmartPointer Pointer; + /** Standard class type alias. */ + using Self = FDFImageIO; + using Superclass = ImageIOBase; + using Pointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 92e041c5abf..5d56b3a5829 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -30,11 +30,11 @@ namespace itk class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { public: - /** Standard class typedefs. */ - typedef FDFImageIOFactory Self; - typedef ObjectFactoryBase Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; + /** Standard class type alias. */ + using Self = FDFImageIOFactory; + using Superclass = ObjectFactoryBase; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; /** Class methods used to interface with the registered factories. */ const char * diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index f2950ef985c..4edc079db36 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -31,14 +31,14 @@ int main(int argc, char ** argv) { - typedef float PixelType; + using PixelType = float; const unsigned int Dimension = 2; - typedef itk::Image ImageType; - typedef itk::ImageFileReader ReaderType; - typedef itk::ImageToVTKImageFilter ImageToVTKType; - typedef itk::NormalizeImageFilter NormalizeFilter; - typedef itk::ChangeInformationImageFilter ChangeInformationFilter; + using ImageType = itk::Image; + using ReaderType = itk::ImageFileReader; + using ImageToVTKType = itk::ImageToVTKImageFilter; + using NormalizeFilter = itk::NormalizeImageFilter; + using ChangeInformationFilter = itk::ChangeInformationImageFilter; // Register FDF Factory itk::FDFImageIOFactory::RegisterOneFactory(); diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index 467e1476b0f..194f529e760 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -30,11 +30,11 @@ itkFDFImageIOTest(int argc, char * argv[]) std::cerr << "Usage: itkFDFImageIO ImageType; - typedef itk::ImageFileReader ReaderType; + using ImageType = itk::Image; + using ReaderType = itk::ImageFileReader; // Register FDF Factory itk::FDFImageIOFactory::RegisterOneFactory(); From 34540112142a54d6d36db37bc14b5febb34b7893 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 13 Feb 2018 08:24:20 -0600 Subject: [PATCH 24/50] STYLE: Prefer constexpr for const numeric literals Use constexpr for constant numeric literals. --- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 2 +- Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index 4edc079db36..c6413a32f12 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -32,7 +32,7 @@ int main(int argc, char ** argv) { using PixelType = float; - const unsigned int Dimension = 2; + constexpr unsigned int Dimension = 2; using ImageType = itk::Image; using ReaderType = itk::ImageFileReader; diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index 194f529e760..e4501166251 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -31,7 +31,7 @@ itkFDFImageIOTest(int argc, char * argv[]) return EXIT_FAILURE; } using PixelType = float; - const unsigned int Dimension = 2; + constexpr unsigned int Dimension = 2; using ImageType = itk::Image; using ReaderType = itk::ImageFileReader; From 12c49fb68e9686511d5c71221f722a31a544e1dd Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Sat, 14 Apr 2018 19:07:58 +0200 Subject: [PATCH 25/50] COMP: Move ITK_DISALLOW_COPY_AND_ASSIGN calls to public section. Move `ITK_DISALLOW_COPY_AND_ASSIGN` calls to public section following the discussion in https://discourse.itk.org/t/noncopyable If legacy (pre-macro) copy and assing methods existed, subsitute them for the `ITK_DISALLOW_COPY_AND_ASSIGN` macro. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 4 ++-- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index c586eff896d..09b99452cf2 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -34,6 +34,8 @@ namespace itk class IOFDF_EXPORT FDFImageIO : public ImageIOBase { public: + ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIO); + /** Standard class type alias. */ using Self = FDFImageIO; using Superclass = ImageIOBase; @@ -116,8 +118,6 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase ReadHeader(const char * FileNameToRead); private: - ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIO); - void SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels); diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 5d56b3a5829..190d075e2eb 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -30,6 +30,8 @@ namespace itk class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { public: + ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); + /** Standard class type alias. */ using Self = FDFImageIOFactory; using Superclass = ObjectFactoryBase; @@ -59,9 +61,6 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase protected: FDFImageIOFactory(); ~FDFImageIOFactory() override; - -private: - ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); }; From 4428d1e7e95f5e8c638f4e717a3f7afd0c19723a Mon Sep 17 00:00:00 2001 From: Jon Haitz Legarreta Date: Sat, 5 May 2018 12:21:45 +0200 Subject: [PATCH 26/50] COMP: Set the minimum required CMake version to 3.10.2. As agreed in: https://discourse.itk.org/t/cmake-update/870/ Set the `cmake_minimum_required` to version **3.10.2**. --- Modules/IO/IOFDF/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt index b857dd2fd4a..7301a35fa51 100644 --- a/Modules/IO/IOFDF/CMakeLists.txt +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.9.5) +cmake_minimum_required(VERSION 3.10.2) project(IOFDF) set(IOFDF_LIBRARIES IOFDF) From 59bbd6ebeb82fdc166254af396663ea33e8e3255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Mon, 22 Oct 2018 20:46:26 -0400 Subject: [PATCH 27/50] STYLE: Use "typename" for template parameters. As discussed in: http://review.source.kitware.com/#/c/12655/ the use of the template keyword "class" was substituted by "typename" in the toolkit for the reasons stated in that topic. --- Modules/IO/IOFDF/include/itkFDFCommonImageIO.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index 66c92ec7c42..407abd20fb8 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -40,7 +40,7 @@ Tokenize(const std::string & str, std::vector & tokens, const std:: std::string ParseLine(std::string line); -template +template void ConvertFromString(std::string s, T & value) { @@ -49,7 +49,7 @@ ConvertFromString(std::string s, T & value) str >> value; } -template +template void StringToVector(std::string value, std::vector & values) { @@ -76,7 +76,7 @@ StringToVector(std::string value, std::vector & values) } } -template +template void PrintVector(std::ostream & os, std::string name, const std::vector & vect) { From df231cb77d3196f34f697b5d6a838418374ff961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 10 Nov 2018 15:36:09 -0500 Subject: [PATCH 28/50] DOC: Add license file. Add the `LICENSE` license file, in conformance to the license notice in the header of the source files. --- Modules/IO/IOFDF/LICENSE | 202 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 Modules/IO/IOFDF/LICENSE diff --git a/Modules/IO/IOFDF/LICENSE b/Modules/IO/IOFDF/LICENSE new file mode 100644 index 00000000000..d6456956733 --- /dev/null +++ b/Modules/IO/IOFDF/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From bf9b8b514b4188fab5297b87610cb8a9634efdd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Sat, 10 Nov 2018 15:47:16 -0500 Subject: [PATCH 29/50] ENH: Add CI. Add CI for the module: - Add Circle, Travis and AppVeyor CI configuration `*.yml` files. - Add the `CTestConfig.cmake` file to submit builds to the **Inisght** project in the **open.cdash.org** dashboard. - Add the Python setup `setup.py` file. - Re-use the `README` file documentation in the `itk-module.cmake` file. --- Modules/IO/IOFDF/itk-module.cmake | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 15ad40f7f4d..32e827daac0 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -1,9 +1,14 @@ -set( - DOCUMENTATION - "This modules contains an ImageIO class to read or write the -FDF image format." -) +# the top-level README is used for describing this module, just +# re-used it for documentation here +get_filename_component(MY_CURENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(READ "${MY_CURENT_DIR}/README.md" DOCUMENTATION) + +# itk_module() defines the module dependencies in IOFDF +# The testing module in IOFDF depends on ITKTestKernel +# By convention those modules outside of ITK are not prefixed with +# ITK +# define the dependencies of the include module and the tests itk_module( IOFDF ENABLE_SHARED From dd8f06323a973c05247dbad8344f5b67d60fa7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Haitz=20Legarreta=20Gorro=C3=B1o?= Date: Wed, 30 Jan 2019 16:04:41 -0500 Subject: [PATCH 30/50] STYLE: Fix `itk-module.cmake` local variable typo. Fix `itk-module.cmake` local variable typo: change `MY_CURENT_DIR` to `MY_CURRENT_DIR`. --- Modules/IO/IOFDF/itk-module.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 32e827daac0..242b43c8ba2 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -1,7 +1,7 @@ # the top-level README is used for describing this module, just # re-used it for documentation here -get_filename_component(MY_CURENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -file(READ "${MY_CURENT_DIR}/README.md" DOCUMENTATION) +get_filename_component(MY_CURRENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(READ "${MY_CURRENT_DIR}/README.md" DOCUMENTATION) # itk_module() defines the module dependencies in IOFDF # The testing module in IOFDF depends on ITKTestKernel From cbacbdb19685aeeeb039e2487606c6f282ad98c9 Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Tue, 18 Feb 2020 09:01:46 -0600 Subject: [PATCH 31/50] ENH: Update enums from recent enum changes in ITK --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 76 +++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index cea7bb1ce22..c32c8a60610 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -231,47 +231,47 @@ FDFImageIO::ReadImageInformation() // Get the binary data type if (name == "storage") { - this->SetPixelType(SCALAR); + this->SetPixelType(IOPixelEnum::SCALAR); if (value == "double") { - this->SetComponentType(DOUBLE); + this->SetComponentType(IOComponentEnum::DOUBLE); } else if (value == "float") { - this->SetComponentType(FLOAT); + this->SetComponentType(IOComponentEnum::FLOAT); } else if (value == "long") { - this->SetComponentType(LONG); + this->SetComponentType(IOComponentEnum::LONG); } else if (value == "unsigned long") { - this->SetComponentType(ULONG); + this->SetComponentType(IOComponentEnum::ULONG); } else if (value == "int") { - this->SetComponentType(INT); + this->SetComponentType(IOComponentEnum::INT); } else if (value == "unsigned int") { - this->SetComponentType(UINT); + this->SetComponentType(IOComponentEnum::UINT); } else if (value == "short") { - this->SetComponentType(SHORT); + this->SetComponentType(IOComponentEnum::SHORT); } else if (value == "unsigned short") { - this->SetComponentType(USHORT); + this->SetComponentType(IOComponentEnum::USHORT); } else if (value == "char") { - this->SetComponentType(CHAR); + this->SetComponentType(IOComponentEnum::CHAR); } else if (value == "unsigned char") { - this->SetComponentType(UCHAR); + this->SetComponentType(IOComponentEnum::UCHAR); } else { @@ -455,109 +455,109 @@ FDFImageIO::SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels) { switch (this->GetComponentType()) { - case CHAR: + case IOComponentEnum::CHAR: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((char *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((char *)buffer, numberOfPixels); } break; } - case FLOAT: + case IOComponentEnum::FLOAT: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((float *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((float *)buffer, numberOfPixels); } break; } - case UCHAR: + case IOComponentEnum::UCHAR: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned char *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned char *)buffer, numberOfPixels); } break; } - case SHORT: + case IOComponentEnum::SHORT: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((short *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((short *)buffer, numberOfPixels); } break; } - case USHORT: + case IOComponentEnum::USHORT: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned short *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned short *)buffer, numberOfPixels); } break; } - case INT: + case IOComponentEnum::INT: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((int *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((int *)buffer, numberOfPixels); } break; } - case UINT: + case IOComponentEnum::UINT: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned int *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned int *)buffer, numberOfPixels); } break; } - case LONG: + case IOComponentEnum::LONG: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((long *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((long *)buffer, numberOfPixels); } break; } - case ULONG: + case IOComponentEnum::ULONG: { - if (this->m_ByteOrder == LittleEndian) + if (this->m_ByteOrder == IOByteOrderEnum::LittleEndian) { ByteSwapper::SwapRangeFromSystemToLittleEndian((unsigned long *)buffer, numberOfPixels); } - else if (this->m_ByteOrder == BigEndian) + else if (this->m_ByteOrder == IOByteOrderEnum::BigEndian) { ByteSwapper::SwapRangeFromSystemToBigEndian((unsigned long *)buffer, numberOfPixels); } From 2c460ee0a175fd39c07274dcf44652877b24abd9 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 16 Feb 2020 18:26:29 -0600 Subject: [PATCH 32/50] STYLE: Remove redundant void argument lists Find and remove redundant void argument lists. --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index c32c8a60610..ba201d41069 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -571,7 +571,7 @@ FDFImageIO::SwapBytesIfNecessary(void * buffer, unsigned long numberOfPixels) } void -FDFImageIO::WriteImageInformation(void) +FDFImageIO::WriteImageInformation() { // not possible to write a fdf file } diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index d25167f3def..ad4227baa34 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -32,7 +32,7 @@ FDFImageIOFactory::FDFImageIOFactory() FDFImageIOFactory::~FDFImageIOFactory() {} const char * -FDFImageIOFactory::GetITKSourceVersion(void) const +FDFImageIOFactory::GetITKSourceVersion() const { return ITK_SOURCE_VERSION; } @@ -50,7 +50,7 @@ FDFImageIOFactory::GetDescription() const static bool FDFImageIOFactoryHasBeenRegistered; void IOFDF_EXPORT -FDFImageIOFactoryRegister__Private(void) +FDFImageIOFactoryRegister__Private() { if (!FDFImageIOFactoryHasBeenRegistered) { From 2f768b591622d9e8362a85370bd83a37fae020f8 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 16 Feb 2020 22:07:44 -0600 Subject: [PATCH 33/50] STYLE: Replace integer literals which are cast to bool. Finds and replaces integer literals which are cast to bool. SRCDIR= #My local SRC BLDDIR= #My local BLD cd run-clang-tidy.py -extra-arg=-D__clang__ -checks=-*,modernize-use-bool-literals -header-filter=.* -fix --- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index ad4227baa34..392ca9f9f02 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -26,7 +26,8 @@ namespace itk { FDFImageIOFactory::FDFImageIOFactory() { - this->RegisterOverride("itkImageIOBase", "itkFDFImageIO", "FDF Image IO", 1, CreateObjectFunction::New()); + this->RegisterOverride( + "itkImageIOBase", "itkFDFImageIO", "FDF Image IO", true, CreateObjectFunction::New()); } FDFImageIOFactory::~FDFImageIOFactory() {} From dce66d71a8e52e46c6dbf85080c57ab7cc6c26f5 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 17 Feb 2020 14:29:59 -0600 Subject: [PATCH 34/50] STYLE: Prefer = default to explicitly trivial implementations This check replaces default bodies of special member functions with = default;. The explicitly defaulted function declarations enable more opportunities in optimization, because the compiler might treat explicitly defaulted functions as trivial. Additionally, the C++11 use of = default more clearly expreses the intent for the special member functions. --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 4 ++-- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index ba201d41069..5f09985f1ac 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -422,9 +422,9 @@ FDFImageIO::Read(void * buffer) } -FDFImageIO::FDFImageIO() {} +FDFImageIO::FDFImageIO() = default; -FDFImageIO::~FDFImageIO() {} +FDFImageIO::~FDFImageIO() = default; void FDFImageIO::PrintSelf(std::ostream & os, Indent indent) const diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index 392ca9f9f02..42f8cad7596 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -30,7 +30,7 @@ FDFImageIOFactory::FDFImageIOFactory() "itkImageIOBase", "itkFDFImageIO", "FDF Image IO", true, CreateObjectFunction::New()); } -FDFImageIOFactory::~FDFImageIOFactory() {} +FDFImageIOFactory::~FDFImageIOFactory() = default; const char * FDFImageIOFactory::GetITKSourceVersion() const From 9b5744bc3cf4988609998e3d9121e6683a9b6e67 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 17 Feb 2020 14:48:34 -0600 Subject: [PATCH 35/50] STYLE: Remove redundant void argument lists Find and remove redundant void argument lists. --- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 190d075e2eb..dd1dddffd3e 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -40,9 +40,9 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase /** Class methods used to interface with the registered factories. */ const char * - GetITKSourceVersion(void) const override; + GetITKSourceVersion() const override; const char * - GetDescription(void) const override; + GetDescription() const override; /** Method for class instantiation. */ itkFactorylessNewMacro(Self); @@ -52,7 +52,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase /** Register one factory of this type */ static void - RegisterOneFactory(void) + RegisterOneFactory() { FDFImageIOFactory::Pointer FdfFactory = FDFImageIOFactory::New(); ObjectFactoryBase::RegisterFactoryInternal(FdfFactory); From 5272fa1cc7f95da1dd9768c20f89c5dc4e8ba5fa Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 17 Feb 2020 23:52:05 -0600 Subject: [PATCH 36/50] PERF: readability container size empty The emptiness of a container should be checked using the empty() method instead of the size() method. It is not guaranteed that size() is a constant-time function, and it is generally more efficient and also shows clearer intent to use empty(). Furthermore some containers may implement the empty() method but not implement the size() method. Using empty() whenever possible makes it easier to switch to another container in the future. SRCDIR= #My local SRC BLDDIR= #My local BLD cd run-clang-tidy.py -extra-arg=-D__clang__ -checks=-*,readability-container-size-empty -header-filter=.* -fix --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index 5f09985f1ac..a169b7f5921 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -35,7 +35,7 @@ FDFImageIO::CanReadFile(const char * file) // First check the extension std::string filename = file; - if (filename == "") + if (filename.empty()) { itkDebugMacro(<< "No filename specified."); return false; From 069b0c94bba1cd70580d2ecdac3c779c05222c53 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 19 Feb 2020 10:45:25 -0600 Subject: [PATCH 37/50] DOC: Update copyright assignment to NumFOCUS The mission of NumFOCUS is to promote open practices in research, data, and scientific computing. https://numfocus.org --- Modules/IO/IOFDF/include/itkFDFCommonImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 2 +- Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index 407abd20fb8..b01b176fcb6 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 09b99452cf2..1c8e9eea1ec 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index dd1dddffd3e..0f1a8617682 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index c6413a32f12..e0aec2b52f9 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx index f597a1ff4a6..d69dc48c59c 100644 --- a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index a169b7f5921..b2a80e788c4 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index 42f8cad7596..751b1ecfed0 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index e4501166251..268f98033fa 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -1,6 +1,6 @@ /*========================================================================= * - * Copyright Insight Software Consortium + * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From f99e07f9a15f21e92d4d210632d4cf0838ea257f Mon Sep 17 00:00:00 2001 From: Mathew Seng Date: Wed, 14 Oct 2020 11:12:47 -0500 Subject: [PATCH 38/50] STYLE: Rename ITK_DISALLOW_COPY_AND_ASSIGN to ITK_DISALLOW_COPY_AND_MOVE Fixes changes made in #2053. ITK_DISALLOW_COPY_AND_ASSIGN will be used if ITK_FUTURE_LEGACY_REMOVE=OFF. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 1c8e9eea1ec..e5c1eaf2f65 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -34,7 +34,7 @@ namespace itk class IOFDF_EXPORT FDFImageIO : public ImageIOBase { public: - ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIO); + ITK_DISALLOW_COPY_AND_MOVE(FDFImageIO); /** Standard class type alias. */ using Self = FDFImageIO; diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 0f1a8617682..0a892939b3a 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -30,7 +30,7 @@ namespace itk class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { public: - ITK_DISALLOW_COPY_AND_ASSIGN(FDFImageIOFactory); + ITK_DISALLOW_COPY_AND_MOVE(FDFImageIOFactory); /** Standard class type alias. */ using Self = FDFImageIOFactory; From 4094524bb680ef12bcb89e825b2e6a3f0f8cd3a4 Mon Sep 17 00:00:00 2001 From: Tom Birdsong Date: Tue, 31 May 2022 11:27:39 -0400 Subject: [PATCH 39/50] ENH: Bump ITK and replace http with https using script --- Modules/IO/IOFDF/LICENSE | 4 ++-- Modules/IO/IOFDF/include/itkFDFCommonImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 2 +- Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx | 2 +- Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Modules/IO/IOFDF/LICENSE b/Modules/IO/IOFDF/LICENSE index d6456956733..62589edd12a 100644 --- a/Modules/IO/IOFDF/LICENSE +++ b/Modules/IO/IOFDF/LICENSE @@ -1,7 +1,7 @@ Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -193,7 +193,7 @@ you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h index b01b176fcb6..23abae67226 100644 --- a/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFCommonImageIO.h @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index e5c1eaf2f65..3e9beac02ff 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 0a892939b3a..3788c18ace1 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx index e0aec2b52f9..4d7e2878e60 100644 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ b/Modules/IO/IOFDF/src/ImageReadWrite.cxx @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx index d69dc48c59c..f5c3e5bf7fe 100644 --- a/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFCommonImageIO.cxx @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index b2a80e788c4..a862fdcc1d4 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx index 751b1ecfed0..4cd6f1cf669 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIOFactory.cxx @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx index 268f98033fa..50cb957769e 100644 --- a/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx +++ b/Modules/IO/IOFDF/test/itkFDFImageIOTest.cxx @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0.txt + * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, From 10030287c001d5e1d6043541752ed44070037ab0 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 26 Jan 2025 08:58:25 -0600 Subject: [PATCH 40/50] STYLE: Add itkVirtualGetNameOfClassMacro + itkOverrideGetNameOfClassMacro Added two new macro's, intended to replace the old 'itkTypeMacro' and 'itkTypeMacroNoParent'. The main aim is to be clearer about what those macro's do: add a virtual 'GetNameOfClass()' member function and override it. Unlike 'itkTypeMacro', 'itkOverrideGetNameOfClassMacro' does not have a 'superclass' parameter, as it was not used anyway. Note that originally 'itkTypeMacro' did not use its 'superclass' parameter either, looking at commit 699b66cb04d410e555656828e8892107add38ccb, Will Schroeder, June 27, 2001: https://github.com/InsightSoftwareConsortium/ITK/blob/699b66cb04d410e555656828e8892107add38ccb/Code/Common/itkMacro.h#L331-L337 --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 3e9beac02ff..8b93cce927e 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -45,7 +45,7 @@ class IOFDF_EXPORT FDFImageIO : public ImageIOBase itkNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(FDFImageIO, ImageIOBase); + itkOverrideGetNameOfClassMacro(FDFImageIO); bool SupportsDimension(unsigned long dim) override diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index 3788c18ace1..d676e17f91d 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -48,7 +48,7 @@ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase itkFactorylessNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(FDFImageIOFactory, ObjectFactoryBase); + itkOverrideGetNameOfClassMacro(FDFImageIOFactory); /** Register one factory of this type */ static void From babc7364f86b4c7a6ea113ab2e60473f37c272aa Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Tue, 27 Jan 2026 00:20:37 +0000 Subject: [PATCH 41/50] ENH: Modernize CMake to use itk_module_add_library Replace add_library with itk_module_add_library macro for better integration with ITK module system. This provides automatic dependency linking, include directory setup, and consistent target naming. --- Modules/IO/IOFDF/src/CMakeLists.txt | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/Modules/IO/IOFDF/src/CMakeLists.txt b/Modules/IO/IOFDF/src/CMakeLists.txt index 6e2aafc082e..0944c41cd86 100644 --- a/Modules/IO/IOFDF/src/CMakeLists.txt +++ b/Modules/IO/IOFDF/src/CMakeLists.txt @@ -1,19 +1,6 @@ -set( - IOFDF_SRC +set(IOFDF_SRC itkFDFImageIO.cxx itkFDFCommonImageIO.cxx - itkFDFImageIOFactory.cxx -) + itkFDFImageIOFactory.cxx) -add_library( - IOFDF - ${ITK_LIBRARY_BUILD_TYPE} - ${IOFDF_SRC} -) - -target_link_libraries( - IOFDF - ${ITKIOImageBase_LIBRARIES} - ${ITKTransform_LIBRARIES} -) -itk_module_target(IOFDF) +itk_module_add_library(IOFDF ${IOFDF_SRC}) From 22aafa0568d3b0fccd6b89d21210d930ddc0af8d Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:01:46 -0500 Subject: [PATCH 42/50] DOC: Add IOFDF module README pointing at archived upstream --- Modules/IO/IOFDF/README.md | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Modules/IO/IOFDF/README.md diff --git a/Modules/IO/IOFDF/README.md b/Modules/IO/IOFDF/README.md new file mode 100644 index 00000000000..d18486112a1 --- /dev/null +++ b/Modules/IO/IOFDF/README.md @@ -0,0 +1,41 @@ +# IOFDF + +In-tree ITK module providing read support for the **FDF** (Flexible +Data Format) image files produced by Varian / Agilent MR scanners. +Implements `itk::FDFImageIO` and registers `itk::FDFImageIOFactory` +so FDF files are auto-detected by `itk::ImageFileReader`. + +## Origin + +Ingested from the standalone remote module +[**InsightSoftwareConsortium/ITKIOFDF**](https://github.com/InsightSoftwareConsortium/ITKIOFDF) +on 2026-05-05, at upstream commit +[`3a3ff84c`](https://github.com/InsightSoftwareConsortium/ITKIOFDF/commit/3a3ff84c803d4226176078d32ddd0760c71a5b2c). +The upstream repository will be archived read-only after this PR +merges; it remains reachable at the URL above. + +## What lives here + +Per the v4 ingestion strategy (see +`Utilities/Maintenance/RemoteModuleIngest/INGESTION_STRATEGY_v4.md`), +only paths matching the narrow whitelist +(`Utilities/Maintenance/RemoteModuleIngest/whitelists/IOFDF.list`) +crossed the merge boundary: + +- `include/` — public C++ headers (`itkFDFImageIO.h`, + `itkFDFImageIOFactory.h`, `itkFDFCommonImageIO.h`). +- `src/` — implementation sources. +- `test/` — CTest drivers and content-link stubs. +- `wrapping/` — Python wrapping descriptors. +- `CMakeLists.txt`, `itk-module.cmake` — module metadata. +- `LICENSE` — original Apache-2.0 license text. + +Upstream-only artifacts (CI dashboards, packaging, +`pyproject.toml`, `.github/`, etc.) were explicitly excluded; the +upstream commit graph and authorship history are otherwise preserved +through a `--no-ff --allow-unrelated-histories` Mode-A merge. + +## Building + +IOFDF is enabled by default once `Module_IOFDF=ON` is set; in CI it +is enabled via `pyproject.toml`'s `configure-ci` task. From 6e0b2785bb2dc0f8a184439694382cff919ed46f Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:01:49 -0500 Subject: [PATCH 43/50] COMP: Remove IOFDF remote-fetch cmake (now in-tree) --- Modules/Remote/IOFDF.remote.cmake | 50 ------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 Modules/Remote/IOFDF.remote.cmake diff --git a/Modules/Remote/IOFDF.remote.cmake b/Modules/Remote/IOFDF.remote.cmake deleted file mode 100644 index 5159e664d68..00000000000 --- a/Modules/Remote/IOFDF.remote.cmake +++ /dev/null @@ -1,50 +0,0 @@ -#-- # Grading Level Criteria Report -#-- EVALUATION DATE: 2020-03-01 -#-- EVALUATORS: [<>,<>] -#-- -#-- ## Compliance level 5 star (AKA ITK main modules, or remote modules that could become core modules) -#-- - [ ] Widespread community dependance -#-- - [ ] Above 90% code coverage -#-- - [ ] CI dashboards and testing monitored rigorously -#-- - [ ] Key API features are exposed in wrapping interface -#-- - [ ] All requirements of Levels 4,3,2,1 -#-- -#-- ## Compliance Level 4 star (Very high-quality code, perhaps small community dependance) -#-- - [ ] Meets all ITK code style standards -#-- - [ ] No external requirements beyond those needed by ITK proper -#-- - [ ] Builds and passes tests on all supported platforms within 1 month of each core tagged release -#-- - [ ] Windows Shared Library Build with Visual Studio -#-- - [ ] Mac with clang compiller -#-- - [ ] Linux with gcc compiler -#-- - [ ] Active developer community dedicated to maintaining code-base -#-- - [ ] 75% code coverage demonstrated for testing suite -#-- - [ ] Continuous integration testing performed -#-- - [ ] All requirements of Levels 3,2,1 -#-- -#-- ## Compliance Level 3 star (Quality beta code) -#-- - [ ] API | executable interface is considered mostly stable and feature complete -#-- - [ ] 10% C0-code coverage demonstrated for testing suite -#-- - [ ] Some tests exist and pass on at least some platform -#-- - [X] All requirements of Levels 2,1 -#-- -#-- ## Compliance Level 2 star (Alpha code feature API development or niche community/execution environment dependance ) -#-- - [X] Compiles for at least 1 niche set of execution envirionments, and perhaps others -#-- (may depend on specific external tools like a java environment, or specific external libraries to work ) -#-- - [X] All requirements of Levels 1 -#-- -#-- ## Compliance Level 1 star (Pre-alpha features under development and code of unknown quality) -#-- - [X] Code complies on at least 1 platform -#-- -#-- ## Compliance Level 0 star ( Code/Feature of known poor-quality or deprecated status ) -#-- - [ ] Code reviewed and explicitly identified as not recommended for use -#-- -#-- ### Please document here any justification for the criteria above -# Code style enforced by clang-format on 2020-02-19, and clang-tidy modernizations completed - -itk_fetch_module( - IOFDF - "FDFImageIO plugin for ITK. Authors Gleen Pierce/Nick Tustison/Kent Williams" - MODULE_COMPLIANCE_LEVEL 2 - GIT_REPOSITORY https://github.com/InsightSoftwareConsortium/ITKIOFDF.git - GIT_TAG 8e0bafbcabb1eca99a8fd6a3747971bb87b2da32 - ) From cf9a8997c8aadec2813c807b05871251e51ee241 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:01:51 -0500 Subject: [PATCH 44/50] ENH: Enable Module_IOFDF in configure-ci pixi task --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index a2ee7171614..cf4dc7d016b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,7 @@ cmd = '''cmake -DModule_MGHIO:BOOL=ON -DModule_SplitComponents:BOOL=ON -DModule_IOMeshMZ3:BOOL=ON + -DModule_IOFDF:BOOL=ON -DITK_COMPUTER_MEMORY_SIZE:STRING=11 -DModule_StructuralSimilarity:BOOL=ON''' description = "Configure ITK for CI (with ccache compiler launcher)" From e94fada839ffc3042e530e1893435292bd4138dd Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:03:32 -0500 Subject: [PATCH 45/50] STYLE: gersemi-format IOFDF src/CMakeLists.txt The Phase A sanitizer's text/cmake classifier did not pick this small file up as 'cmake' (its sniff treated it as 'text'), so gersemi's pass was skipped. Apply the formatter now to satisfy ITK's pre-commit gersemi hook. --- Modules/IO/IOFDF/src/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/src/CMakeLists.txt b/Modules/IO/IOFDF/src/CMakeLists.txt index 0944c41cd86..d7d5756fcad 100644 --- a/Modules/IO/IOFDF/src/CMakeLists.txt +++ b/Modules/IO/IOFDF/src/CMakeLists.txt @@ -1,6 +1,8 @@ -set(IOFDF_SRC +set( + IOFDF_SRC itkFDFImageIO.cxx itkFDFCommonImageIO.cxx - itkFDFImageIOFactory.cxx) + itkFDFImageIOFactory.cxx +) itk_module_add_library(IOFDF ${IOFDF_SRC}) From e6fc9abb0c08aa5e18f434d6aaaa030c205be2c0 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:29:48 -0500 Subject: [PATCH 46/50] BUG: Fix IOFDF P1 issues from Greptile review Three upstream bugs caught by Greptile review on PR #6215: 1. CanReadFile threw an ITK ExceptionObject when the file couldn't be opened. ITK's ImageIOFactory contract requires CanReadFile to return false for unreadable files; throwing aborts every probe of non-FDF files in itk::ImageIOFactory::CreateImageIO. Replaced the throw with a return false. 2. ReadImageInformation() iterated 'i < GetNumberOfDimensions()' and indexed m_Roi[i] without checking m_Roi.size(). Files lacking a 'roi' header field would silently read out-of-bounds. Added an itkExceptionMacro guard that surfaces the missing entries. 3. itk-module.cmake DEPENDS listed ITKNIFTI as a copy-paste artefact; no FDF source includes any NIFTI header or uses any NIFTI type. Removed the spurious dependency. --- Modules/IO/IOFDF/itk-module.cmake | 1 - Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Modules/IO/IOFDF/itk-module.cmake b/Modules/IO/IOFDF/itk-module.cmake index 242b43c8ba2..7a70bffc890 100644 --- a/Modules/IO/IOFDF/itk-module.cmake +++ b/Modules/IO/IOFDF/itk-module.cmake @@ -13,7 +13,6 @@ itk_module( IOFDF ENABLE_SHARED DEPENDS - ITKNIFTI ITKIOImageBase TEST_DEPENDS ITKTestKernel diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index a862fdcc1d4..dd3497ca4bf 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -64,15 +64,10 @@ FDFImageIO::CanReadFile(const char * file) inFile.open(m_FileName.c_str(), std::ios::in | std::ios::binary); if (!inFile) { - ExceptionObject exception(__FILE__, __LINE__); - std::string msg = "File \"" + m_FileName + "\" cannot be read."; - exception.SetDescription(msg.c_str()); - throw exception; + itkDebugMacro(<< "File \"" << m_FileName << "\" cannot be opened."); + return false; } - // Check for a neccessary header variable - - return true; } @@ -299,6 +294,11 @@ FDFImageIO::ReadImageInformation() long int fileSize = inFile.tellg(); this->m_InputPosition = fileSize - this->GetImageSizeInBytes(); + if (this->m_Roi.size() < this->GetNumberOfDimensions()) + { + itkExceptionMacro("FDF header missing 'roi' entries: have " << this->m_Roi.size() << ", need " + << this->GetNumberOfDimensions()); + } for (unsigned int i = 0; i < this->GetNumberOfDimensions(); i++) { this->SetSpacing(i, (this->m_Roi[i] * 10) / this->GetDimensions(i)); From 970e87d2b80b54bcd1d33c71f2440a30f482b00a Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:29:55 -0500 Subject: [PATCH 47/50] COMP: Drop leftover IOFDF developer scratch ImageReadWrite.cxx Not listed in src/CMakeLists.txt (so the build is unaffected by its presence), but carries a hardcoded /home/glenn absolute path, imports VTK headers the IOFDF module does not declare as dependencies, and runs an infinite while(1) viewer->Render() loop. Pure noise from the upstream remote module's developer environment. --- Modules/IO/IOFDF/src/ImageReadWrite.cxx | 88 ------------------------- 1 file changed, 88 deletions(-) delete mode 100644 Modules/IO/IOFDF/src/ImageReadWrite.cxx diff --git a/Modules/IO/IOFDF/src/ImageReadWrite.cxx b/Modules/IO/IOFDF/src/ImageReadWrite.cxx deleted file mode 100644 index 4d7e2878e60..00000000000 --- a/Modules/IO/IOFDF/src/ImageReadWrite.cxx +++ /dev/null @@ -1,88 +0,0 @@ -/*========================================================================= - * - * Copyright NumFOCUS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0.txt - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *=========================================================================*/ -#include "itkImageFileReader.h" -#include "itkImageToVTKImageFilter.h" -#include "itkNormalizeImageFilter.h" -#include "itkChangeInformationImageFilter.h" -#include - -#include "itkFDFImageIOFactory.h" -#include "itkFDFImageIO.h" - -#include - -#include "itkImage.h" - -int -main(int argc, char ** argv) -{ - using PixelType = float; - constexpr unsigned int Dimension = 2; - - using ImageType = itk::Image; - using ReaderType = itk::ImageFileReader; - using ImageToVTKType = itk::ImageToVTKImageFilter; - using NormalizeFilter = itk::NormalizeImageFilter; - using ChangeInformationFilter = itk::ChangeInformationImageFilter; - - // Register FDF Factory - itk::FDFImageIOFactory::RegisterOneFactory(); - - ReaderType::Pointer reader = ReaderType::New(); - NormalizeFilter::Pointer normalizer = NormalizeFilter::New(); - ChangeInformationFilter::Pointer movingChange = ChangeInformationFilter::New(); - - reader->SetFileName("/home/glenn/development/reader/test.fdf"); - - try - { - reader->Update(); - } - catch (itk::ExceptionObject & exp) - { - std::cerr << "Exception caught" << std::endl; - std::cerr << exp << std::endl; - } - - std::cout << reader << std::endl; - - normalizer->SetInput(reader->GetOutput()); - - movingChange->SetInput(normalizer->GetOutput()); - movingChange->CenterImageOn(); - - - vtkRenderWindowInteractor * iren = vtkRenderWindowInteractor::New(); - - ImageToVTKType::Pointer bridge = ImageToVTKType::New(); - bridge->SetInput(movingChange->GetOutput()); - - vtkImageViewer * viewer = vtkImageViewer::New(); - viewer->SetInput(bridge->GetOutput()); - viewer->SetColorWindow(1); - viewer->SetColorLevel(0.1); - // viewer->SetupInteractor(iren); - - while (1) - viewer->Render(); - - viewer->Delete(); - // iren->Delete(); - - return 0; -} From 24fd0e305c55c307d40be2d4c5a53909accbdc6b Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 09:30:04 -0500 Subject: [PATCH 48/50] STYLE: Fix IOFDF Doxygen \ingroup tags itkFDFImageIO.h had \ingroup IOIOFDF (typo), itkFDFImageIOFactory.h had \ingroup ITKIOFDF (the old upstream remote-module name). The in-tree module is named 'IOFDF', so both must use \ingroup IOFDF for the classes to appear in the module's Doxygen group. --- Modules/IO/IOFDF/include/itkFDFImageIO.h | 2 +- Modules/IO/IOFDF/include/itkFDFImageIOFactory.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/IOFDF/include/itkFDFImageIO.h b/Modules/IO/IOFDF/include/itkFDFImageIO.h index 8b93cce927e..734e46818be 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIO.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIO.h @@ -28,7 +28,7 @@ namespace itk * * \brief ImageIO object for reading and writing FDF images * - * \ingroup IOIOFDF + * \ingroup IOFDF * */ class IOFDF_EXPORT FDFImageIO : public ImageIOBase diff --git a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h index d676e17f91d..0f5eac04330 100644 --- a/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h +++ b/Modules/IO/IOFDF/include/itkFDFImageIOFactory.h @@ -24,8 +24,8 @@ namespace itk { /** \class FDFImageIOFactory - * \ingroup ITKIOFDF * \brief Create instances of FDFImageIO objects using an object factory. + * \ingroup IOFDF */ class IOFDF_EXPORT FDFImageIOFactory : public ObjectFactoryBase { From 18e6bf1c1c03ec4aa20d02c7a3a15cbe08308cc5 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 11:03:35 -0500 Subject: [PATCH 49/50] COMP: Drop redundant cmake_minimum_required from IOFDF/CMakeLists.txt The line cmake_minimum_required(VERSION 3.10.2) survived the upstream ingest. ITK's top-level CMakeLists already pins a higher minimum (and the project's policy is that ingested module CMakeLists do not declare their own minimum), so the per-module line is dead code. Address @dzenanz review comment. --- Modules/IO/IOFDF/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/IO/IOFDF/CMakeLists.txt b/Modules/IO/IOFDF/CMakeLists.txt index 7301a35fa51..6634dc019cb 100644 --- a/Modules/IO/IOFDF/CMakeLists.txt +++ b/Modules/IO/IOFDF/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 3.10.2) project(IOFDF) set(IOFDF_LIBRARIES IOFDF) From e6e26eda3789feafe0c78ab55e05f1ccbbd2acd3 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 5 May 2026 11:03:40 -0500 Subject: [PATCH 50/50] BUG: Fix IOFDF multi-word storage type parser (Greptile P1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReadImageInformation() guarded its parsing block on tokens.size() == 4, which silently drops every header line whose value contains a space — notably 'unsigned char' / 'unsigned short' / 'unsigned int' / 'unsigned long' storage types. ParseLine strips the FDF C-style decoration and Tokenize splits on ' ;', producing five tokens for those values; the == 4 check then filtered them out and the value-comparison branches that handled them became unreachable. Loosen the guard to tokens.size() >= 4 and re-join tokens[3..N-1] into a single space-separated value so the existing 'unsigned char' / 'unsigned short' / etc. branches actually fire. Header lines with multi-word vector values (e.g. orientation, span, origin, roi) were already handled correctly because their parsers split on ',' / StringToVector, which tokenize the value internally; the only behaviour change is that previously-skipped scalar 'unsigned X' storage types now reach the SetComponentType dispatch. --- Modules/IO/IOFDF/src/itkFDFImageIO.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx index dd3497ca4bf..c66ff0cd3f8 100644 --- a/Modules/IO/IOFDF/src/itkFDFImageIO.cxx +++ b/Modules/IO/IOFDF/src/itkFDFImageIO.cxx @@ -105,11 +105,20 @@ FDFImageIO::ReadImageInformation() line = ParseLine(line); Tokenize(line, tokens, " ;"); - if (tokens.size() == 4) + if (tokens.size() >= 4) { type = tokens[0]; name = tokens[1]; + // Re-join tokens[3..] so multi-word values (e.g. storage = + // "unsigned char") are not silently dropped by the size==4 + // gate. Header values like vector matrices are also space- + // separated; the StringToVector callers below parse them again. value = tokens[3]; + for (size_t k = 4; k < tokens.size(); ++k) + { + value += ' '; + value += tokens[k]; + } if (name == "spatial_rank") {