// Copyright (c) 2016, 2017 GeometryFactory // All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // Author(s) : Laurent Rineau #ifndef CGAL_SEP_READER_IMAGEIO_HPP #define CGAL_SEP_READER_IMAGEIO_HPP #include "SEP_header.h" #include #include #include #include #include #include #include #ifndef BOOST_FILESYSTEM_VERSION // That macro was not defined in previous releases of Boost. # define BOOST_FILESYSTEM_VERSION 2 #endif #include namespace CGAL { template class SEP_to_ImageIO : public SEP_header { T* _data; _image* _im; CGAL::Image_3* _cgal_image; bool valid; std::string err_msg; public: bool is_valid() const { return valid; } std::string error_msg() const { return err_msg; } SEP_to_ImageIO(std::string fileName) : SEP_header(fileName), _data(0), _im(0), _cgal_image(0), valid(false), err_msg() { if(dimension() < 0) { err_msg = "Invalid header file \""; err_msg += fileName; err_msg += "\""; return; } display_information(fileName, std::cout); boost::filesystem::path headerFile(fileName); boost::filesystem::path dataFile(string_field("in")); #if BOOST_FILESYSTEM_VERSION == 2 dataFile = boost::filesystem::complete(dataFile, boost::filesystem::complete(headerFile.parent_path())); #else dataFile = boost::filesystem::absolute(dataFile, boost::filesystem::absolute(headerFile.parent_path())); #endif if(!load_data(dataFile.string())) { return; err_msg = "Invalid data file \""; err_msg += dataFile.string(); err_msg += "\""; } valid = true; } ~SEP_to_ImageIO() { if(_cgal_image != 0) delete _cgal_image; } CGAL::Image_3* cgal_image() { return _cgal_image; } const CGAL::Image_3* cgal_image() const { return _cgal_image; } protected : bool load_data(std::string dataFilename) { if(_im) delete _im; _im = new _image; _im->xdim = static_cast(n(1)); _im->ydim = static_cast(n(2)); _im->zdim = static_cast(n(3)); _im->vdim = 1; // spacing _im->vx = d(1); _im->vy = d(2); _im->vz = d(3); if(_im->vz == 0.f) _im->vz=1.f; // image offset _im->tx = static_cast(o(1)); _im->ty = static_cast(o(2)); _im->tz = static_cast(o(3)); // image center _im->cx = _im->cy = _im->cz = 0; // image rotation _im->rx = _im->ry = _im->rz = 0.0; _im->fd = NULL; _im->openMode = OM_CLOSE; if(string_field("data_format") == "native_float" || string_field("data_format") == "\"native_float\"") { _im->endianness = END_LITTLE; } else { _im->endianness = END_BIG; } _im->dataMode = DM_BINARY; // no user string _im->user = NULL; _im->nuser = 0; // word type (unsigned byte) _im->wdim = sizeof(T); _im->wordKind = WK_FLOAT; _im->vectMode = VM_SCALAR; _im->sign = SGN_SIGNED; _im->imageFormat = NULL; ::_openReadImage(_im, dataFilename.c_str()); if(!_im->fd) return false; // Compute number of element const std::size_t size = n(1) * n(2) * n(3); // Allocate array _data = new T[size]; _im->data = (void*)_data; // // Read file if(_readImageData(_im) < 0) return false; // char* buffer = reinterpret_cast(_data); // in.read (buffer, size * sizeof(T)); ImageIO_close(_im); _cgal_image = new CGAL::Image_3(_im); return true; } }; } // end namespace CGAL #endif // CGAL_SEP_READER_IMAGEIO_HPP