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