From 1edf1e066ca16f4bdd025fe68bfb12c62ff37963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 27 Jan 2020 11:03:53 +0100 Subject: [PATCH] Integrate File_scanner_OFF_impl into the header --- .../include/CGAL/IO/OFF/File_header_OFF.h | 134 +- .../include/CGAL/IO/OFF/File_scanner_OFF.h | 1456 ++++++++++------- .../CGAL/IO/OFF/File_scanner_OFF_impl.h | 125 -- .../include/CGAL/IO/OFF/File_writer_OFF.h | 4 +- Stream_support/src/CGAL/File_scanner_OFF.cpp | 24 - 5 files changed, 907 insertions(+), 836 deletions(-) delete mode 100644 Stream_support/include/CGAL/IO/OFF/File_scanner_OFF_impl.h delete mode 100644 Stream_support/src/CGAL/File_scanner_OFF.cpp diff --git a/Stream_support/include/CGAL/IO/OFF/File_header_OFF.h b/Stream_support/include/CGAL/IO/OFF/File_header_OFF.h index 2ad7d2219c0..e3a1f64ee37 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_header_OFF.h +++ b/Stream_support/include/CGAL/IO/OFF/File_header_OFF.h @@ -14,98 +14,100 @@ // // Author(s) : Lutz Kettner - #ifndef CGAL_IO_OFF_FILE_HEADER_OFF_H -#define CGAL_IO_OFF_FILE_HEADER_OFF_H 1 +#define CGAL_IO_OFF_FILE_HEADER_OFF_H #include + #include namespace CGAL { // Info structure for OFF file headers // =================================== -class CGAL_EXPORT File_header_OFF : public File_header_extended_OFF { +class CGAL_EXPORT File_header_OFF + : public File_header_extended_OFF +{ private: - // Publicly accessible file informations. - std::size_t n_vertices; + // Publicly accessible file informations. + std::size_t n_vertices; std::size_t n_facets; - bool m_skel; // SKEL format instead of OFF. - bool m_binary; // OFF in binary format. - bool m_no_comments; // no comments in output. - std::size_t m_offset; // index offset for vertices, usually 0. + bool m_skel; // SKEL format instead of OFF. + bool m_binary; // OFF in binary format. + bool m_no_comments; // no comments in output. + std::size_t m_offset; // index offset for vertices, usually 0. - // Publicly accessible but not that well supported file informations. - bool m_colors; // COFF detected. - bool m_normals; // NOFF format stores also normals at vertices. + // Publicly accessible but not that well supported file informations. + bool m_colors; // COFF detected. + bool m_normals; // NOFF format stores also normals at vertices. + + // More privately used file informations to scan the file. + bool m_tag4; // 4OFF detected. + bool m_tagDim; // nOFF detected (will not be supported). + int m_dim; // dimension for nOFF (will not be supported). - // More privately used file informations to scan the file. - bool m_tag4; // 4OFF detected. - bool m_tagDim; // nOFF detected (will not be supported). - int m_dim; // dimension for nOFF (will not be supported). public: - typedef File_header_OFF Self; - typedef File_header_extended_OFF Base; + typedef File_header_OFF Self; + typedef File_header_extended_OFF Base; - explicit File_header_OFF( bool verbose = false); - File_header_OFF( bool binary, bool noc, bool skel, - bool verbose = false); - //File_header_OFF( int v, int h, int f, bool verbose = false); - File_header_OFF( std::size_t v, std::size_t h, std::size_t f, - bool binary, bool noc, bool skel, - bool verbose = false); - File_header_OFF( const File_header_extended_OFF& ext_header); - File_header_OFF( const File_header_extended_OFF& ext_header, - bool binary, bool noc, bool skel); - File_header_OFF( std::size_t v, std::size_t h, std::size_t f, - const File_header_extended_OFF& ext_header); - File_header_OFF( std::size_t v, std::size_t h, std::size_t f, - const File_header_extended_OFF& ext_header, - bool binary, bool noc, bool skel); + explicit File_header_OFF(bool verbose = false); + File_header_OFF(bool binary, bool noc, bool skel, bool verbose = false); + //File_header_OFF(int v, int h, int f, bool verbose = false); + File_header_OFF(std::size_t v, std::size_t h, std::size_t f, + bool binary, bool noc, bool skel, bool verbose = false); - Self& operator= ( const Base& base) { (Base&)(*this) = base; - return *this; - } - std::size_t size_of_vertices() const { return n_vertices; } - std::size_t size_of_facets() const { return n_facets; } + File_header_OFF(const File_header_extended_OFF& ext_header); + File_header_OFF(const File_header_extended_OFF& ext_header, + bool binary, bool noc, bool skel); + File_header_OFF(std::size_t v, std::size_t h, std::size_t f, + const File_header_extended_OFF& ext_header); + File_header_OFF(std::size_t v, std::size_t h, std::size_t f, + const File_header_extended_OFF& ext_header, + bool binary, bool noc, bool skel); - bool skel() const { return m_skel; } // SKEL format. - bool off() const { return ! m_skel; } // OFF format. - bool binary() const { return m_binary; } // binary format. - bool ascii() const { return ! m_binary; } // ASCII format. - bool no_comments() const { return m_no_comments; } - bool comments() const { return ! m_no_comments; } + Self& operator= (const Base& base) { (Base&)(*this) = base; return *this; } - std::size_t index_offset() const { return m_offset; } - bool has_colors() const { return m_colors; } // COFF detected. - bool has_normals() const { return m_normals;} // NOFF format. - bool is_homogeneous() const { return m_tag4; } // 4OFF detected. - // nOFF detected. (will not be supported). - bool n_dimensional() const { return m_tagDim; } - // dimension for nOFF (will not be supported). - int dimension() const { return m_dim; } + std::size_t size_of_vertices() const { return n_vertices; } + std::size_t size_of_facets() const { return n_facets; } - void set_vertices( std::size_t n) { n_vertices = n; } - void set_facets( std::size_t n) { n_facets = n; } + bool skel() const { return m_skel; } // SKEL format. + bool off() const { return ! m_skel; } // OFF format. + bool binary() const { return m_binary; } // binary format. + bool ascii() const { return ! m_binary; } // ASCII format. + bool no_comments() const { return m_no_comments; } + bool comments() const { return ! m_no_comments; } - void set_skel( bool b) { m_skel = b; } - void set_binary( bool b) { m_binary = b; } - void set_no_comments( bool b) { m_no_comments = b; } - void set_index_offset( std::size_t i) { m_offset = i; } + std::size_t index_offset() const { return m_offset; } + bool has_colors() const { return m_colors; } // COFF detected. + bool has_normals() const { return m_normals;} // NOFF format. + bool is_homogeneous() const { return m_tag4; } // 4OFF detected. - void set_colors( bool b) { m_colors = b; } - void set_normals( bool b) { m_normals = b;} - void set_homogeneous( bool b) { m_tag4 = b; } - void set_dimensional( bool b) { m_tagDim = b; } - void set_dimension( int i) { m_dim = i; } - Self& operator+=( const Self& header); + // nOFF detected. (will not be supported). + bool n_dimensional() const { return m_tagDim; } + // dimension for nOFF (will not be supported). + int dimension() const { return m_dim; } + + void set_vertices(std::size_t n) { n_vertices = n; } + void set_facets(std::size_t n) { n_facets = n; } + + void set_skel(bool b) { m_skel = b; } + void set_binary(bool b) { m_binary = b; } + void set_no_comments(bool b) { m_no_comments = b; } + void set_index_offset(std::size_t i) { m_offset = i; } + + void set_colors(bool b) { m_colors = b; } + void set_normals(bool b) { m_normals = b;} + void set_homogeneous(bool b) { m_tag4 = b; } + void set_dimensional(bool b) { m_tagDim = b; } + void set_dimension(int i) { m_dim = i; } + Self& operator+=(const Self& header); }; // Write header. -CGAL_EXPORT std::ostream& operator<<( std::ostream& out, const File_header_OFF& h); +CGAL_EXPORT std::ostream& operator<<(std::ostream& out, const File_header_OFF& h); // Scan header. Marks streams badbit if not in SKEL format nor in OFF. -CGAL_EXPORT std::istream& operator>>( std::istream& in, File_header_OFF& h); +CGAL_EXPORT std::istream& operator>>(std::istream& in, File_header_OFF& h); } //namespace CGAL diff --git a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h b/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h index 7f0b996c623..2bd29e1aafb 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h +++ b/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h @@ -1,4 +1,4 @@ -// Copyright (c) 1997 +// Copyright (c) 1997 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -15,684 +15,902 @@ // Author(s) : Lutz Kettner #ifndef CGAL_IO_OFF_FILE_SCANNER_OFF_H -#define CGAL_IO_OFF_FILE_SCANNER_OFF_H 1 - -#include +#define CGAL_IO_OFF_FILE_SCANNER_OFF_H #include -#include #include #include -#include -#include + #include -#include -#include +#include +#include +#include namespace CGAL { -class CGAL_EXPORT File_scanner_OFF : public File_header_OFF { - std::istream& m_in; - bool normals_read; - void skip_comment() { m_in >> skip_comment_OFF; } +class File_scanner_OFF + : public File_header_OFF +{ + std::istream& m_in; + bool normals_read; + + void skip_comment() { m_in >> skip_comment_OFF; } + public: - File_scanner_OFF( std::istream& in, bool verbose = false) - : File_header_OFF(verbose), m_in(in), normals_read(false) { - in >> static_cast( *this); - } - File_scanner_OFF( std::istream& in, const File_header_OFF& header) - : File_header_OFF(header), m_in(in), normals_read(false) {} + File_scanner_OFF(std::istream& in, bool verbose = false) + : File_header_OFF(verbose), m_in(in), normals_read(false) + { + in >> static_cast(*this); + } - std::istream& in() { return m_in; } + File_scanner_OFF(std::istream& in, const File_header_OFF& header) + : + File_header_OFF(header), m_in(in), normals_read(false) + { } - // The scan_vertex() routine is provided for multiple - // coordinate types to support parameterized polytopes. - void scan_vertex( float& x, float& y, float& z) { - if ( binary()) { - I_Binary_read_big_endian_float32( m_in, x); - I_Binary_read_big_endian_float32( m_in, y); - I_Binary_read_big_endian_float32( m_in, z); - if ( is_homogeneous()) { - float w; - I_Binary_read_big_endian_float32( m_in, w); - x /= w; - y /= w; - z /= w; - } - } else { - skip_comment(); - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) { - float w; - m_in >> iformat(w); - x /= w; - y /= w; - z /= w; - } - } - } - void scan_vertex( double& x, double& y, double& z) { - if ( binary()) { - float f; - I_Binary_read_big_endian_float32( m_in, f); - x = f; - I_Binary_read_big_endian_float32( m_in, f); - y = f; - I_Binary_read_big_endian_float32( m_in, f); - z = f; - if ( is_homogeneous()) { - I_Binary_read_big_endian_float32( m_in, f); - x /= f; - y /= f; - z /= f; - } - } else { - skip_comment(); - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) { - double w; - m_in >> iformat(w); - x /= w; - y /= w; - z /= w; - } - } - } - void scan_vertex( int& x, int& y, int& z) { - if ( binary()) { - float fx, fy, fz; - I_Binary_read_big_endian_float32( m_in, fx); - I_Binary_read_big_endian_float32( m_in, fy); - I_Binary_read_big_endian_float32( m_in, fz); - if ( is_homogeneous()) { - float fw; - I_Binary_read_big_endian_float32( m_in, fw); - x = int( fx / fw); - y = int( fy / fw); - z = int( fz / fw); - } else { - x = int(fx); - y = int(fy); - z = int(fz); - } - } else { - skip_comment(); - if ( is_homogeneous()) { - double fx, fy, fz, fw; - m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); - x = int( fx / fw); - y = int( fy / fw); - z = int( fz / fw); - } else { - double d; - m_in >> iformat(d); - x = int(d); - m_in >> iformat(d); - y = int(d); - m_in >> iformat(d); - z = int(d); - } - } - } + std::istream& in() { return m_in; } - void scan_vertex( float& x, float& y, float& z, float& w) { - w = 1; - if ( binary()) { - I_Binary_read_big_endian_float32( m_in, x); - I_Binary_read_big_endian_float32( m_in, y); - I_Binary_read_big_endian_float32( m_in, z); - if ( is_homogeneous()) - I_Binary_read_big_endian_float32( m_in, w); - } else { - skip_comment(); - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) - m_in >> iformat(w); - } - } - void scan_vertex( double& x, double& y, double& z, double& w) { - w = 1; - if ( binary()) { - float f; - I_Binary_read_big_endian_float32( m_in, f); - x = f; - I_Binary_read_big_endian_float32( m_in, f); - y = f; - I_Binary_read_big_endian_float32( m_in, f); - z = f; - if ( is_homogeneous()) { - I_Binary_read_big_endian_float32( m_in, f); - w = f; - } - } else { - skip_comment(); - m_in >> iformat(x); - m_in >> iformat(y); - m_in >> iformat(z); - if ( is_homogeneous()) - m_in >> iformat(w); - } - } - void scan_vertex( int& x, int& y, int& z, int& w) { - w = 1; - if ( binary()) { - float f; - I_Binary_read_big_endian_float32( m_in, f); - x = int(f); - I_Binary_read_big_endian_float32( m_in, f); - y = int(f); - I_Binary_read_big_endian_float32( m_in, f); - z = int(f); - if ( is_homogeneous()) { - I_Binary_read_big_endian_float32( m_in, f); - w = int(f); - } - } else { - skip_comment(); - double d; - m_in >> iformat(d); - x = int(d); - m_in >> iformat(d); - y = int(d); - m_in >> iformat(d); - z = int(d); - if ( is_homogeneous()) { - m_in >> iformat(d); - w = int(d); - } - } - } - - void scan_normal( float& x, float& y, float& z) { - if ( has_normals()) { - normals_read = true; - if ( binary()) { - I_Binary_read_big_endian_float32( m_in, x); - I_Binary_read_big_endian_float32( m_in, y); - I_Binary_read_big_endian_float32( m_in, z); - if ( is_homogeneous()) { - float w; - I_Binary_read_big_endian_float32( m_in, w); - x /= w; - y /= w; - z /= w; - } - } else { - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) { - float w; - m_in >> iformat(w); - x /= w; - y /= w; - z /= w; - } - } - } - } - void scan_normal( double& x, double& y, double& z) { - if ( has_normals()) { - normals_read = true; - if ( binary()) { - float fx, fy, fz; - I_Binary_read_big_endian_float32( m_in, fx); - I_Binary_read_big_endian_float32( m_in, fy); - I_Binary_read_big_endian_float32( m_in, fz); - if ( is_homogeneous()) { - float fw; - I_Binary_read_big_endian_float32( m_in, fw); - x = fx / fw; - y = fy / fw; - z = fz / fw; - } else { - x = fx; - y = fy; - z = fz; - } - } else { - if ( is_homogeneous()) { - float fx, fy, fz, fw; - m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); - x = fx / fw; - y = fy / fw; - z = fz / fw; - } else - m_in >> iformat(x) >> iformat(y) >> iformat(z); - } - } - } - void scan_normal( int& x, int& y, int& z) { - if ( has_normals()) { - normals_read = true; - if ( binary()) { - float fx, fy, fz; - I_Binary_read_big_endian_float32( m_in, fx); - I_Binary_read_big_endian_float32( m_in, fy); - I_Binary_read_big_endian_float32( m_in, fz); - if ( is_homogeneous()) { - float fw; - I_Binary_read_big_endian_float32( m_in, fw); - x = int( fx / fw); - y = int( fy / fw); - z = int( fz / fw); - } else { - x = int(fx); - y = int(fy); - z = int(fz); - } - } else { - if ( is_homogeneous()) { - float fx, fy, fz, fw; - m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); - x = int( fx / fw); - y = int( fy / fw); - z = int( fz / fw); - } else { - double d; - m_in >> iformat(d); - x = int(d); - m_in >> iformat(d); - y = int(d); - m_in >> iformat(d); - z = int(d); - } - } - } - } - - void scan_normal( float& x, float& y, float& z, float& w) { - w = 1; - if ( has_normals()) { - normals_read = true; - if ( binary()) { - I_Binary_read_big_endian_float32( m_in, x); - I_Binary_read_big_endian_float32( m_in, y); - I_Binary_read_big_endian_float32( m_in, z); - if ( is_homogeneous()) - I_Binary_read_big_endian_float32( m_in, w); - } else { - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) - m_in >> iformat(w); - } - } - } - void scan_normal( double& x, double& y, double& z, double& w) { - w = 1; - if ( has_normals()) { - normals_read = true; - if ( binary()) { - float f; - I_Binary_read_big_endian_float32( m_in, f); - x = f; - I_Binary_read_big_endian_float32( m_in, f); - y = f; - I_Binary_read_big_endian_float32( m_in, f); - z = f; - if ( is_homogeneous()) { - I_Binary_read_big_endian_float32( m_in, f); - w = f; - } - } else { - m_in >> iformat(x) >> iformat(y) >> iformat(z); - if ( is_homogeneous()) - m_in >> iformat(w); - } - } - } - void scan_normal( int& x, int& y, int& z, int& w) { - w = 1; - if ( has_normals()) { - normals_read = true; - if ( binary()) { - float f; - I_Binary_read_big_endian_float32( m_in, f); - x = int(f); - I_Binary_read_big_endian_float32( m_in, f); - y = int(f); - I_Binary_read_big_endian_float32( m_in, f); - z = int(f); - if ( is_homogeneous()) { - I_Binary_read_big_endian_float32( m_in, f); - w = int(f); - } - } else { - double d; - m_in >> iformat(d); - x = int(d); - m_in >> iformat(d); - y = int(d); - m_in >> iformat(d); - z = int(d); - if ( is_homogeneous()) { - m_in >> iformat(d); - w = int(d); - } - } - } - } - - static const Color& get_indexed_color(int id) + // The scan_vertex() routine is provided for multiple + // coordinate types to support parameterized polytopes. + void scan_vertex(float& x, float& y, float& z) + { + if(binary()) { - static const Color color[149] = { - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(178, 38, 25, 191), - Color(51, 51, 204, 191), - Color(229, 153, 5, 191), - Color(25, 76, 204, 191), - Color(25, 178, 51, 191), - Color(204, 204, 102, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 51, 191), - Color(51, 229, 0, 191), - Color(0, 51, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(204, 102, 0, 191), - Color(0, 102, 204, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(204, 0, 102, 191), - Color(178, 127, 51, 191), - Color(178, 127, 51, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(255, 255, 255, 191), - Color(12, 76, 25, 191), - Color(178, 2, 25, 191), - Color(51, 12, 153, 191), - Color(229, 229, 5, 191), - Color(0, 51, 102, 191), - Color(25, 102, 102, 191), - Color(204, 204, 204, 191), - Color(178, 178, 0, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(204, 102, 0, 191), - Color(0, 102, 204, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(204, 0, 102, 191), - Color(178, 127, 51, 191), - Color(178, 127, 51, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(178, 178, 0, 191), - Color(178, 0, 178, 191), - Color(0, 178, 178, 191), - Color(229, 0, 0, 191), - Color(0, 229, 0, 191), - Color(0, 0, 229, 191), - Color(191, 191, 191, 191), - Color(204, 102, 0, 191), - Color(102, 204, 0, 191), - Color(0, 102, 204, 191), - Color(0, 204, 102, 191), - Color(102, 0, 204, 191), - Color(204, 0, 102, 191), - Color(120, 120, 120, 120) }; - if(id > 148) id =148; - return color[id]; + I_Binary_read_big_endian_float32(m_in, x); + I_Binary_read_big_endian_float32(m_in, y); + I_Binary_read_big_endian_float32(m_in, z); + if(is_homogeneous()) { + float w; + I_Binary_read_big_endian_float32(m_in, w); + x /= w; + y /= w; + z /= w; + } } - - static CGAL::Color get_color_from_line(std::istream &is) + else { + skip_comment(); + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + { + float w; + m_in >> iformat(w); + x /= w; + y /= w; + z /= w; + } + } + } - std::string color_info; - bool is_float = false; + void scan_vertex(double& x, double& y, double& z) + { + if(binary()) + { + float f; + I_Binary_read_big_endian_float32(m_in, f); + x = f; + I_Binary_read_big_endian_float32(m_in, f); + y = f; + I_Binary_read_big_endian_float32(m_in, f); + z = f; + if(is_homogeneous()) + { + I_Binary_read_big_endian_float32(m_in, f); + x /= f; + y /= f; + z /= f; + } + } + else + { + skip_comment(); + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + { + double w; + m_in >> iformat(w); + x /= w; + y /= w; + z /= w; + } + } + } - std::string col; - //get the line content - std::getline(is, col); - //split it into strings - std::istringstream iss(col); - //holds the rgb values - unsigned char rgb[3]; - int index =0; - //split the string into numbers - while(iss>>color_info){ - //stop if comment is read - if(color_info.at(0) == '#') - break; - //detect if the value is float - for(int c = 0; c(color_info.length()); c++) - { - if(color_info.at(c) == '.') - { - is_float = true; - break; - } - } - //if the value is of float type, convert it into an int - if(is_float) - rgb[index] = static_cast(atof(color_info.c_str())*255); - //else stores the value - else - rgb[index] = static_cast(atoi(color_info.c_str())); - index++; - if(index == 3) - break; + void scan_vertex(int& x, int& y, int& z) + { + if(binary()) + { + float fx, fy, fz; + I_Binary_read_big_endian_float32(m_in, fx); + I_Binary_read_big_endian_float32(m_in, fy); + I_Binary_read_big_endian_float32(m_in, fz); + if(is_homogeneous()) { + float fw; + I_Binary_read_big_endian_float32(m_in, fw); + x = int(fx / fw); + y = int(fy / fw); + z = int(fz / fw); + } else { + x = int(fx); + y = int(fy); + z = int(fz); + } + } + else + { + skip_comment(); + if(is_homogeneous()) + { + double fx, fy, fz, fw; + m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); + x = int(fx / fw); + y = int(fy / fw); + z = int(fz / fw); + } + else + { + double d; + m_in >> iformat(d); + x = int(d); + m_in >> iformat(d); + y = int(d); + m_in >> iformat(d); + z = int(d); + } + } + } + + void scan_vertex(float& x, float& y, float& z, float& w) + { + w = 1; + if(binary()) + { + I_Binary_read_big_endian_float32(m_in, x); + I_Binary_read_big_endian_float32(m_in, y); + I_Binary_read_big_endian_float32(m_in, z); + if(is_homogeneous()) + I_Binary_read_big_endian_float32(m_in, w); + } + else + { + skip_comment(); + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + m_in >> iformat(w); + } + } + void scan_vertex(double& x, double& y, double& z, double& w) + { + w = 1; + if(binary()) + { + float f; + I_Binary_read_big_endian_float32(m_in, f); + x = f; + I_Binary_read_big_endian_float32(m_in, f); + y = f; + I_Binary_read_big_endian_float32(m_in, f); + z = f; + if(is_homogeneous()) + { + I_Binary_read_big_endian_float32(m_in, f); + w = f; + } + } + else + { + skip_comment(); + m_in >> iformat(x); + m_in >> iformat(y); + m_in >> iformat(z); + if(is_homogeneous()) + m_in >> iformat(w); + } + } + + void scan_vertex(int& x, int& y, int& z, int& w) + { + w = 1; + if(binary()) + { + float f; + I_Binary_read_big_endian_float32(m_in, f); + x = int(f); + I_Binary_read_big_endian_float32(m_in, f); + y = int(f); + I_Binary_read_big_endian_float32(m_in, f); + z = int(f); + if(is_homogeneous()) + { + I_Binary_read_big_endian_float32(m_in, f); + w = int(f); + } + } + else + { + skip_comment(); + double d; + m_in >> iformat(d); + x = int(d); + m_in >> iformat(d); + y = int(d); + m_in >> iformat(d); + z = int(d); + if(is_homogeneous()) + { + m_in >> iformat(d); + w = int(d); + } + } + } + + void scan_normal(float& x, float& y, float& z) + { + if(has_normals()) + { + normals_read = true; + if(binary()) { + I_Binary_read_big_endian_float32(m_in, x); + I_Binary_read_big_endian_float32(m_in, y); + I_Binary_read_big_endian_float32(m_in, z); + if(is_homogeneous()) + { + float w; + I_Binary_read_big_endian_float32(m_in, w); + x /= w; + y /= w; + z /= w; + } + } + else + { + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + { + float w; + m_in >> iformat(w); + x /= w; + y /= w; + z /= w; + } + } + } + } + + void scan_normal(double& x, double& y, double& z) + { + if(has_normals()) + { + normals_read = true; + if(binary()) + { + float fx, fy, fz; + I_Binary_read_big_endian_float32(m_in, fx); + I_Binary_read_big_endian_float32(m_in, fy); + I_Binary_read_big_endian_float32(m_in, fz); + if(is_homogeneous()) + { + float fw; + I_Binary_read_big_endian_float32(m_in, fw); + x = fx / fw; + y = fy / fw; + z = fz / fw; + } else + { + x = fx; + y = fy; + z = fz; + } + } + else + { + if(is_homogeneous()) + { + float fx, fy, fz, fw; + m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); + x = fx / fw; + y = fy / fw; + z = fz / fw; } - CGAL::Color color; - //if there were only one number, fetch the color in the color map - if(index<2) - color = get_indexed_color(rgb[0]); - //else create the coor with the 3 values; else - color = CGAL::Color(rgb[0], rgb[1], rgb[2]); - return color; - } - - void scan_color( unsigned char& r, unsigned char& g, unsigned char& b) { - if ( binary()) { - float fr, fg, fb; - I_Binary_read_big_endian_float32( m_in, fr); - I_Binary_read_big_endian_float32( m_in, fg); - I_Binary_read_big_endian_float32( m_in, fb); - r = (unsigned char)(fr); - g = (unsigned char)(fg); - b = (unsigned char)(fb); - - } else { - CGAL::Color color = get_color_from_line(m_in); - r = color.red(); - g = color.green(); - b = color.blue(); + { + m_in >> iformat(x) >> iformat(y) >> iformat(z); } + } } + } - void skip_to_next_vertex( std::size_t current_vertex); - - void scan_facet( std::size_t& size, std::size_t CGAL_assertion_code(current_facet)) { - CGAL_assertion( current_facet < size_of_facets()); - if ( binary()){ - boost::int32_t i32; - I_Binary_read_big_endian_integer32( m_in, i32); - size = i32; + void scan_normal(int& x, int& y, int& z) + { + if(has_normals()) + { + normals_read = true; + if(binary()) + { + float fx, fy, fz; + I_Binary_read_big_endian_float32(m_in, fx); + I_Binary_read_big_endian_float32(m_in, fy); + I_Binary_read_big_endian_float32(m_in, fz); + if(is_homogeneous()) { + float fw; + I_Binary_read_big_endian_float32(m_in, fw); + x = int(fx / fw); + y = int(fy / fw); + z = int(fz / fw); } else { - skip_comment(); - m_in >> size; + x = int(fx); + y = int(fy); + z = int(fz); } + } + else + { + if(is_homogeneous()) + { + float fx, fy, fz, fw; + m_in >> iformat(fx) >> iformat(fy) >> iformat(fz) >> iformat(fw); + x = int(fx / fw); + y = int(fy / fw); + z = int(fz / fw); + } + else + { + double d; + m_in >> iformat(d); + x = int(d); + m_in >> iformat(d); + y = int(d); + m_in >> iformat(d); + z = int(d); + } + } + } + } + + void scan_normal(float& x, float& y, float& z, float& w) + { + w = 1; + if(has_normals()) + { + normals_read = true; + if(binary()) + { + I_Binary_read_big_endian_float32(m_in, x); + I_Binary_read_big_endian_float32(m_in, y); + I_Binary_read_big_endian_float32(m_in, z); + if(is_homogeneous()) + I_Binary_read_big_endian_float32(m_in, w); + } + else + { + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + m_in >> iformat(w); + } + } + } + + void scan_normal(double& x, double& y, double& z, double& w) + { + w = 1; + if(has_normals()) + { + normals_read = true; + if(binary()) + { + float f; + I_Binary_read_big_endian_float32(m_in, f); + x = f; + I_Binary_read_big_endian_float32(m_in, f); + y = f; + I_Binary_read_big_endian_float32(m_in, f); + z = f; + if(is_homogeneous()) + { + I_Binary_read_big_endian_float32(m_in, f); + w = f; + } + } + else + { + m_in >> iformat(x) >> iformat(y) >> iformat(z); + if(is_homogeneous()) + m_in >> iformat(w); + } + } + } + + void scan_normal(int& x, int& y, int& z, int& w) + { + w = 1; + if(has_normals()) + { + normals_read = true; + if(binary()) + { + float f; + I_Binary_read_big_endian_float32(m_in, f); + x = int(f); + I_Binary_read_big_endian_float32(m_in, f); + y = int(f); + I_Binary_read_big_endian_float32(m_in, f); + z = int(f); + if(is_homogeneous()) { + I_Binary_read_big_endian_float32(m_in, f); + w = int(f); + } + } + else + { + double d; + m_in >> iformat(d); + x = int(d); + m_in >> iformat(d); + y = int(d); + m_in >> iformat(d); + z = int(d); + if(is_homogeneous()) + { + m_in >> iformat(d); + w = int(d); + } + } + } + } + + static const Color& get_indexed_color(int id) + { + static const Color color[149] = { + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(178, 38, 25, 191), + Color(51, 51, 204, 191), + Color(229, 153, 5, 191), + Color(25, 76, 204, 191), + Color(25, 178, 51, 191), + Color(204, 204, 102, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 51, 191), + Color(51, 229, 0, 191), + Color(0, 51, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(204, 102, 0, 191), + Color(0, 102, 204, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(204, 0, 102, 191), + Color(178, 127, 51, 191), + Color(178, 127, 51, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(255, 255, 255, 191), + Color(12, 76, 25, 191), + Color(178, 2, 25, 191), + Color(51, 12, 153, 191), + Color(229, 229, 5, 191), + Color(0, 51, 102, 191), + Color(25, 102, 102, 191), + Color(204, 204, 204, 191), + Color(178, 178, 0, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(204, 102, 0, 191), + Color(0, 102, 204, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(204, 0, 102, 191), + Color(178, 127, 51, 191), + Color(178, 127, 51, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(178, 178, 0, 191), + Color(178, 0, 178, 191), + Color(0, 178, 178, 191), + Color(229, 0, 0, 191), + Color(0, 229, 0, 191), + Color(0, 0, 229, 191), + Color(191, 191, 191, 191), + Color(204, 102, 0, 191), + Color(102, 204, 0, 191), + Color(0, 102, 204, 191), + Color(0, 204, 102, 191), + Color(102, 0, 204, 191), + Color(204, 0, 102, 191), + Color(120, 120, 120, 120) }; + if(id > 148) id =148; + return color[id]; + } + + static CGAL::Color get_color_from_line(std::istream &is) + { + std::string color_info; + bool is_float = false; + + std::string col; + //get the line content + std::getline(is, col); + //split it into strings + std::istringstream iss(col); + //holds the rgb values + unsigned char rgb[3]; + int index =0; + //split the string into numbers + while(iss>>color_info){ + //stop if comment is read + if(color_info.at(0) == '#') + break; + //detect if the value is float + for(int c = 0; c(color_info.length()); ++c) + { + if(color_info.at(c) == '.') + { + is_float = true; + break; + } + } + + //if the value is of float type, convert it into an int + if(is_float) + rgb[index] = static_cast(atof(color_info.c_str())*255); + //else stores the value + else + rgb[index] = static_cast(atoi(color_info.c_str())); + + ++index; + if(index == 3) + break; } - void scan_facet_vertex_index( std::size_t& index, - std::size_t current_facet) { - if ( binary()){ + CGAL::Color color; + //if there were only one number, fetch the color in the color map + if(index < 2) + color = get_indexed_color(rgb[0]); + //else create the coor with the 3 values; + else + color = CGAL::Color(rgb[0], rgb[1], rgb[2]); + + return color; + } + + void scan_color(unsigned char& r, unsigned char& g, unsigned char& b) + { + if(binary()) + { + float fr, fg, fb; + I_Binary_read_big_endian_float32(m_in, fr); + I_Binary_read_big_endian_float32(m_in, fg); + I_Binary_read_big_endian_float32(m_in, fb); + r = (unsigned char)(fr); + g = (unsigned char)(fg); + b = (unsigned char)(fb); + + } + else + { + CGAL::Color color = get_color_from_line(m_in); + r = color.red(); + g = color.green(); + b = color.blue(); + } + } + + void skip_to_next_vertex(std::size_t current_vertex) + { + CGAL_assertion(current_vertex < size_of_vertices()); + if(binary()) + { + float f; + if(has_normals() && ! normals_read) { + I_Binary_read_big_endian_float32(m_in, f); + I_Binary_read_big_endian_float32(m_in, f); + I_Binary_read_big_endian_float32(m_in, f); + if(is_homogeneous()) + I_Binary_read_big_endian_float32(m_in, f); + } + + if(has_colors()) + { + // It is not well stated in the Geomview manual + // how color is coded following a vertex. It is + // parsed similar to the optional color for facets. + boost::int32_t k; + I_Binary_read_big_endian_integer32(m_in, k); + if(k<0 || k>4) + { + m_in.clear(std::ios::badbit); + if(verbose()) + { + std::cerr << " " << std::endl; + std::cerr << "File_scanner_OFF::" << std::endl; + std::cerr << "skip_to_next_vertex(): input error: bad " + " number of color indices at vertex " + << current_vertex << "." << std::endl; + } + + set_off_header(false); + return; + } + + while(k--) + { + float dummy; + I_Binary_read_big_endian_float32(m_in, dummy); + } + } + } + else + { + if(has_normals() && ! normals_read) + { + double dummy; + if(is_homogeneous()) { + m_in >> dummy >> dummy >> dummy >> dummy; + } else { + m_in >> dummy >> dummy >> dummy; + } + } + + if(has_colors()) // skip color entries (1 to 4) + m_in >> skip_until_EOL; + } + + if(!m_in) + { + if(verbose()) + { + std::cerr << " " << std::endl; + std::cerr << "File_scanner_OFF::" << std::endl; + std::cerr << "skip_to_next_vertex(): input error: cannot read " + "OFF file beyond vertex " << current_vertex << "." + << std::endl; + } + + set_off_header(false); + return; + } + + normals_read = false; + } + + void scan_facet(std::size_t& size, std::size_t CGAL_assertion_code(current_facet)) + { + CGAL_assertion(current_facet < size_of_facets()); + if(binary()) + { boost::int32_t i32; - I_Binary_read_big_endian_integer32( m_in, i32); - index = i32; - } else - m_in >> index; + I_Binary_read_big_endian_integer32(m_in, i32); + size = i32; + } + else + { + skip_comment(); + m_in >> size; + } + } - if( m_in.fail()) { - if ( verbose()) { + void scan_facet_vertex_index(std::size_t& index, + std::size_t current_facet) + { + if(binary()){ + boost::int32_t i32; + I_Binary_read_big_endian_integer32(m_in, i32); + index = i32; + } + else + { + m_in >> index; + } + + if(m_in.fail()) + { + if(verbose()) + { std::cerr << " " << std::endl; std::cerr << "File_scanner_OFF::" << std::endl; std::cerr << "scan_facet_vertex_index(): input error: " - "cannot read OFF file beyond facet " + "cannot read OFF file beyond facet " << current_facet << "." << std::endl; } - set_off_header( false); + + set_off_header(false); return; } + bool error = index < index_offset(); index -= index_offset(); - if(error || (index >= size_of_vertices())) { - m_in.clear( std::ios::failbit); - if ( verbose()) { + if(error || (index >= size_of_vertices())) + { + m_in.clear(std::ios::failbit); + if(verbose()) + { std::cerr << " " << std::endl; std::cerr << "File_scanner_OFF::" << std::endl; std::cerr << "scan_facet_vertex_index(): input error: " - "facet " << current_facet << ": vertex index " + "facet " << current_facet << ": vertex index " << index + index_offset() << ": is out of range." << std::endl; } - set_off_header( false); + + set_off_header(false); return; } } - void skip_to_next_facet( std::size_t current_facet); + void skip_to_next_facet(std::size_t current_facet) + { + // Take care of trailing informations like color triples. + if(binary()) + { + boost::int32_t k; + I_Binary_read_big_endian_integer32(m_in, k); + if(k<0 || k>4) + { + m_in.clear(std::ios::badbit); + if(verbose()) + { + std::cerr << " " << std::endl; + std::cerr << "File_scanner_OFF::" << std::endl; + std::cerr << "skip_to_next_facet(): input error: bad " + "number of color indices at vertex " + << current_facet << "." << std::endl; + } + + set_off_header(false); + return; + } + + while (k--) + { + float dummy; + I_Binary_read_big_endian_float32(m_in, dummy); + } + } + else + { + m_in >> skip_until_EOL; + } + } }; template < class Point> inline -Point& -file_scan_vertex( File_scanner_OFF& scanner, Point& p) { - typedef typename Point::R R; - typedef typename R::RT RT; - double x, y, z, w; - scanner.scan_vertex( x, y, z, w); - if ( w == 1) - p = Point( RT(x), RT(y), RT(z)); - else - p = Point( RT(x), RT(y), RT(z), RT(w)); - return p; +Point& file_scan_vertex(File_scanner_OFF& scanner, Point& p) +{ + typedef typename Point::R R; + typedef typename R::RT RT; + double x, y, z, w; + + scanner.scan_vertex(x, y, z, w); + + if(w == 1) + p = Point(RT(x), RT(y), RT(z)); + else + p = Point(RT(x), RT(y), RT(z), RT(w)); + + return p; } template < class T_Color> inline -T_Color& -file_scan_color( File_scanner_OFF& scanner, T_Color& c) { - unsigned char r, g, b; - scanner.scan_color(r,g,b); - c = T_Color(r,g,b); - return c; +T_Color& file_scan_color(File_scanner_OFF& scanner, T_Color& c) +{ + unsigned char r, g, b; + scanner.scan_color(r,g,b); + c = T_Color(r,g,b); + + return c; } template < class Vector> inline Vector& -file_scan_normal( File_scanner_OFF& scanner, Vector& v) { - typedef typename Vector::R R; - typedef typename R::RT RT; - double x, y, z, w; - scanner.scan_normal( x, y, z, w); - if ( w == 1) - v = Vector( RT(x), RT(y), RT(z)); - else - v = Vector( RT(x), RT(y), RT(z), RT(w)); - return v; +file_scan_normal(File_scanner_OFF& scanner, Vector& v) +{ + typedef typename Vector::R R; + typedef typename R::RT RT; + + double x, y, z, w; + scanner.scan_normal(x, y, z, w); + if(w == 1) + v = Vector(RT(x), RT(y), RT(z)); + else + v = Vector(RT(x), RT(y), RT(z), RT(w)); + + return v; } } //namespace CGAL -#ifdef CGAL_HEADER_ONLY -#include -#endif // CGAL_HEADER_ONLY - -#include - -#endif // CGAL_IO_OFF_FILE_SCANNER_OFF_H // -// EOF // +#endif // CGAL_IO_OFF_FILE_SCANNER_OFF_H diff --git a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF_impl.h b/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF_impl.h deleted file mode 100644 index c134f2f3898..00000000000 --- a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF_impl.h +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner - -#ifdef CGAL_HEADER_ONLY -#define CGAL_INLINE_FUNCTION inline -#else -#define CGAL_INLINE_FUNCTION -#endif - -#include -#include -#include -#include -#include - -namespace CGAL { - -CGAL_INLINE_FUNCTION -void -File_scanner_OFF:: -skip_to_next_vertex( std::size_t current_vertex) { - CGAL_assertion( current_vertex < size_of_vertices()); - if ( binary()) { - float f; - if ( has_normals() && ! normals_read) { - I_Binary_read_big_endian_float32( m_in, f); - I_Binary_read_big_endian_float32( m_in, f); - I_Binary_read_big_endian_float32( m_in, f); - if ( is_homogeneous()) - I_Binary_read_big_endian_float32( m_in, f); - } - if ( has_colors()) { - // It is not well stated in the Geomview manual - // how color is coded following a vertex. It is - // parsed similar to the optional color for facets. - boost::int32_t k; - I_Binary_read_big_endian_integer32( m_in, k); - if (k<0 || k>4) { - m_in.clear( std::ios::badbit); - if ( verbose()) { - std::cerr << " " << std::endl; - std::cerr << "File_scanner_OFF::" << std::endl; - std::cerr << "skip_to_next_vertex(): input error: bad " - " number of color indices at vertex " - << current_vertex << "." << std::endl; - } - set_off_header( false); - return; - } - while (k--) { - float dummy; - I_Binary_read_big_endian_float32( m_in, dummy); - } - } - } else { - if ( has_normals() && ! normals_read) { - double dummy; - if ( is_homogeneous()) { - m_in >> dummy >> dummy >> dummy >> dummy; - } else { - m_in >> dummy >> dummy >> dummy; - } - } - if ( has_colors()) { // skip color entries (1 to 4) - m_in >> skip_until_EOL; - } - } - if( ! m_in) { - if ( verbose()) { - std::cerr << " " << std::endl; - std::cerr << "File_scanner_OFF::" << std::endl; - std::cerr << "skip_to_next_vertex(): input error: cannot read " - "OFF file beyond vertex " << current_vertex << "." - << std::endl; - } - set_off_header( false); - return; - } - normals_read = false; -} - -CGAL_INLINE_FUNCTION -void -File_scanner_OFF:: -skip_to_next_facet( std::size_t current_facet) { - // Take care of trailing informations like color triples. - if ( binary()) { - boost::int32_t k; - I_Binary_read_big_endian_integer32( m_in, k); - if (k<0 || k>4) { - m_in.clear( std::ios::badbit); - if ( verbose()) { - std::cerr << " " << std::endl; - std::cerr << "File_scanner_OFF::" << std::endl; - std::cerr << "skip_to_next_facet(): input error: bad " - "number of color indices at vertex " - << current_facet << "." << std::endl; - } - set_off_header( false); - return; - } - while (k--) { - float dummy; - I_Binary_read_big_endian_float32( m_in, dummy); - } - } else { - m_in >> skip_until_EOL; - } -} - -} //namespace CGAL -// EOF // diff --git a/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h b/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h index e5097765138..bbfc9d8b342 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h +++ b/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h @@ -38,13 +38,13 @@ public: File_header_OFF& header() { return m_header; } const File_header_OFF& header() const { return m_header; } - void write_header(std::ostream& out, + void write_header(std::ostream& os, std::size_t vertices, std::size_t /*halfedges*/, std::size_t facets, bool normals = false) { - m_out = &o; + m_out = &os; m_header.set_vertices(vertices); m_header.set_facets(facets); diff --git a/Stream_support/src/CGAL/File_scanner_OFF.cpp b/Stream_support/src/CGAL/File_scanner_OFF.cpp deleted file mode 100644 index d1bd706f97d..00000000000 --- a/Stream_support/src/CGAL/File_scanner_OFF.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 1997 -// Utrecht University (The Netherlands), -// ETH Zurich (Switzerland), -// INRIA Sophia-Antipolis (France), -// Max-Planck-Institute Saarbruecken (Germany), -// and Tel-Aviv University (Israel). All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// -// Author(s) : Lutz Kettner - -#ifndef CGAL_HEADER_ONLY - -#include -#include - -#endif // CGAL_HEADER_ONLY - -// EOF //