1 // Copyright (c) 2005-2008 INRIA Sophia-Antipolis (France). 2 // 2008 GeometryFactory 3 // All rights reserved. 4 // 5 // This file is part of CGAL (www.cgal.org) 6 // 7 // $URL: https://github.com/CGAL/cgal/blob/v5.3/CGAL_ImageIO/include/CGAL/IO/read_vtk_image_data.h $ 8 // $Id: read_vtk_image_data.h 22be867 2021-05-04T14:59:28+02:00 Sébastien Loriot 9 // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial 10 // 11 // 12 // Author(s) : Laurent Rineau, Pierre Alliez 13 14 #ifndef CGAL_IO_READ_VTK_IMAGE_DATA_H 15 #define CGAL_IO_READ_VTK_IMAGE_DATA_H 16 17 #include <CGAL/Image_3.h> 18 #include <CGAL/Image_3_vtk_interface.h> 19 20 namespace CGAL { 21 22 namespace { 23 24 struct VTK_to_ImageIO_type_mapper { 25 WORD_KIND wordKind; 26 SIGN sign; 27 unsigned int wdim; 28 }; 29 30 static const VTK_to_ImageIO_type_mapper VTK_to_ImageIO_type[VTK_ID_TYPE] = 31 { { WK_UNKNOWN, SGN_UNKNOWN, 0}, // 0=VTK_VOID 32 { WK_UNKNOWN, SGN_UNKNOWN, 0}, // 1=VTK_BIT 33 { WK_FIXED, SGN_SIGNED, 1}, // 2=VTK_CHAR 34 { WK_FIXED, SGN_UNSIGNED, 1}, // 3=VTK_UNSIGNED_CHAR 35 { WK_FIXED, SGN_SIGNED, 2}, // 4=VTK_SHORT 36 { WK_FIXED, SGN_UNSIGNED, 2}, // 5=VTK_UNSIGNED_SHORT 37 { WK_FIXED, SGN_SIGNED, 4}, // 6=VTK_INT 38 { WK_FIXED, SGN_UNSIGNED, 4}, // 7=VTK_UNSIGNED_INT 39 { WK_FIXED, SGN_SIGNED, 8}, // 8=VTK_LONG 40 { WK_FIXED, SGN_UNSIGNED, 8}, // 9=VTK_UNSIGNED_LONG 41 { WK_FLOAT, SGN_SIGNED, 4}, // 10=VTK_FLOAT 42 { WK_FIXED, SGN_SIGNED, 8} // 11=VTK_DOUBLE 43 }; 44 45 } //end anonymous namespace 46 47 namespace IO { 48 49 inline 50 Image_3 51 read_vtk_image_data(vtkImageData* vtk_image, Image_3::Own owning = Image_3::OWN_THE_DATA) 52 { 53 if(!vtk_image) 54 return Image_3(); 55 56 _image* image = ::_initImage(); 57 const int* dims = vtk_image->GetDimensions(); 58 const double* spacing = vtk_image->GetSpacing(); 59 const double* offset = vtk_image->GetOrigin(); 60 image->vectMode = VM_SCALAR; 61 image->xdim = dims[0]; 62 image->ydim = dims[1]; 63 image->zdim = dims[2]; 64 image->vdim = 1; 65 image->vx = (spacing[0] == 0) ? 1 : spacing[0]; 66 image->vy = (spacing[1] == 0) ? 1 : spacing[1]; 67 image->vz = (spacing[2] == 0) ? 1 : spacing[2]; 68 image->tx = static_cast<float>(offset[0]); 69 image->ty = static_cast<float>(offset[1]); 70 image->tz = static_cast<float>(offset[2]); 71 image->endianness = ::_getEndianness(); 72 int vtk_type = vtk_image->GetScalarType(); 73 if(vtk_type == VTK_SIGNED_CHAR) vtk_type = VTK_CHAR; 74 if(vtk_type < 0 || vtk_type > VTK_DOUBLE) 75 vtk_type = VTK_DOUBLE; 76 const VTK_to_ImageIO_type_mapper& imageio_type = 77 VTK_to_ImageIO_type[vtk_type]; 78 image->wdim = imageio_type.wdim; 79 image->wordKind = imageio_type.wordKind; 80 image->sign = imageio_type.sign; 81 if (!vtk_image->GetPointData() || !vtk_image->GetPointData()->GetScalars()) { 82 ::_freeImage(image); 83 return Image_3(); 84 } 85 CGAL_assertion(vtk_image->GetPointData()->GetScalars()->GetNumberOfTuples() == dims[0]*dims[1]*dims[2]); 86 if(owning == Image_3::OWN_THE_DATA) { 87 image->data = ::ImageIO_alloc(dims[0]*dims[1]*dims[2]*image->wdim); 88 // std::cerr << "GetNumberOfTuples()=" << vtk_image->GetPointData()->GetScalars()->GetNumberOfTuples() 89 // << "\nimage->size()=" << dims[0]*dims[1]*dims[2] 90 // << "\nwdim=" << image->wdim << '\n'; 91 vtk_image->GetPointData()->GetScalars()->ExportToVoidPointer(image->data); 92 } else { 93 image->data = vtk_image->GetPointData()->GetScalars()->GetVoidPointer(0); 94 } 95 96 return Image_3(image, owning); 97 } 98 99 } // namespace IO 100 101 #ifndef CGAL_NO_DEPRECATED_CODE 102 using IO::read_vtk_image_data; 103 #endif 104 105 } // namespace CGAL 106 107 108 #endif // CGAL_IO_READ_VTK_IMAGE_DATA_H 109