From 44b602f291393a1b842284ae143bb278f1b29bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Zetterstr=C3=B6m?= Date: Fri, 11 Apr 2025 17:29:54 +0200 Subject: [PATCH 1/2] Adds flag that skips writing the packet index for backwards compatibility --- include/E57Format.h | 3 ++- include/E57SimpleWriter.h | 3 +++ src/CompressedVectorNode.cpp | 5 ++-- src/CompressedVectorNodeImpl.cpp | 4 +-- src/CompressedVectorNodeImpl.h | 3 ++- src/CompressedVectorWriterImpl.cpp | 12 ++++++--- src/CompressedVectorWriterImpl.h | 4 ++- src/WriterImpl.cpp | 7 ++--- src/WriterImpl.h | 2 ++ test/src/test_SimpleWriter.cpp | 41 ++++++++++++++++++++++++++++++ 10 files changed, 70 insertions(+), 14 deletions(-) diff --git a/include/E57Format.h b/include/E57Format.h index 6096562..9be1aa9 100644 --- a/include/E57Format.h +++ b/include/E57Format.h @@ -486,7 +486,8 @@ public: VectorNode codecs() const; // Iterators - CompressedVectorWriter writer( std::vector &sbufs ); + CompressedVectorWriter writer( std::vector &sbufs, + bool skipPacketWriteIndex = false ); CompressedVectorReader reader( const std::vector &dbufs ); // Up/Down cast conversion diff --git a/include/E57SimpleWriter.h b/include/E57SimpleWriter.h index 06c67d7..915f402 100644 --- a/include/E57SimpleWriter.h +++ b/include/E57SimpleWriter.h @@ -47,6 +47,9 @@ namespace e57 /// Information describing the Coordinate Reference System to be used for the file ustring coordinateMetadata; + + /// Skip writing the index packet (this is not standards compliant) + bool skipPacketWriteIndex = false; }; /// @brief Used for writing an E57 file using the E57 Simple API. diff --git a/src/CompressedVectorNode.cpp b/src/CompressedVectorNode.cpp index 666f3a7..0dea235 100644 --- a/src/CompressedVectorNode.cpp +++ b/src/CompressedVectorNode.cpp @@ -438,9 +438,10 @@ CompressedVectorNode cannot be set twice). @see CompressedVectorWriter, SourceDestBuffer, CompressedVectorNode::CompressedVectorNode, CompressedVectorNode::prototype */ -CompressedVectorWriter CompressedVectorNode::writer( std::vector &sbufs ) +CompressedVectorWriter CompressedVectorNode::writer( std::vector &sbufs, + bool skipPacketWriteIndex ) { - return CompressedVectorWriter( impl_->writer( sbufs ) ); + return CompressedVectorWriter( impl_->writer( sbufs, skipPacketWriteIndex ) ); } /*! diff --git a/src/CompressedVectorNodeImpl.cpp b/src/CompressedVectorNodeImpl.cpp index 63ae31c..50cb60b 100644 --- a/src/CompressedVectorNodeImpl.cpp +++ b/src/CompressedVectorNodeImpl.cpp @@ -266,7 +266,7 @@ namespace e57 #endif std::shared_ptr CompressedVectorNodeImpl::writer( - std::vector sbufs ) + std::vector sbufs, bool skipPacketWriteIndex ) { checkImageFileOpen( __FILE__, __LINE__, static_cast( __FUNCTION__ ) ); @@ -313,7 +313,7 @@ namespace e57 // Return a shared_ptr to new object std::shared_ptr cvwi( - new CompressedVectorWriterImpl( cai, sbufs ) ); + new CompressedVectorWriterImpl( cai, sbufs, skipPacketWriteIndex ) ); return ( cvwi ); } diff --git a/src/CompressedVectorNodeImpl.h b/src/CompressedVectorNodeImpl.h index 82887bf..b7a0aa3 100644 --- a/src/CompressedVectorNodeImpl.h +++ b/src/CompressedVectorNodeImpl.h @@ -58,7 +58,8 @@ namespace e57 const char *forcedFieldName = nullptr ) override; /// Iterator constructors - std::shared_ptr writer( std::vector sbufs ); + std::shared_ptr writer( std::vector sbufs, + bool skipPacketWriteIndex = false ); std::shared_ptr reader( std::vector dbufs ); int64_t getRecordCount() const diff --git a/src/CompressedVectorWriterImpl.cpp b/src/CompressedVectorWriterImpl.cpp index 52a938e..86baba0 100644 --- a/src/CompressedVectorWriterImpl.cpp +++ b/src/CompressedVectorWriterImpl.cpp @@ -48,8 +48,9 @@ namespace e57 }; CompressedVectorWriterImpl::CompressedVectorWriterImpl( - std::shared_ptr ni, std::vector &sbufs ) : - cVector_( ni ), isOpen_( false ) // set to true when succeed below + std::shared_ptr ni, std::vector &sbufs, + bool skipPacketWriteIndex ) : + cVector_( ni ), skipPacketWriteIndex_(skipPacketWriteIndex), isOpen_( false ) // set to true when succeed below { //??? check if cvector already been written (can't write twice) @@ -183,8 +184,11 @@ namespace e57 flush(); } - // Write one index packet (required by standard). - packetWriteIndex(); + if (!skipPacketWriteIndex_) + { + // Write one index packet (required by standard). + packetWriteIndex(); + } // Compute length of whole section we just wrote (from section start to // current start of free space). diff --git a/src/CompressedVectorWriterImpl.h b/src/CompressedVectorWriterImpl.h index 5596267..2675af3 100644 --- a/src/CompressedVectorWriterImpl.h +++ b/src/CompressedVectorWriterImpl.h @@ -35,7 +35,8 @@ namespace e57 { public: CompressedVectorWriterImpl( std::shared_ptr ni, - std::vector &sbufs ); + std::vector &sbufs, + bool skipPacketWriteIndex = false ); ~CompressedVectorWriterImpl(); void write( size_t requestedRecordCount ); @@ -69,6 +70,7 @@ namespace e57 std::vector> bytestreams_; DataPacket dataPacket_; + bool skipPacketWriteIndex_; /// if true, don't write index packets bool isOpen_; uint64_t sectionHeaderLogicalStart_; /// start of CompressedVector binary section uint64_t sectionLogicalLength_; /// total length of CompressedVector binary section diff --git a/src/WriterImpl.cpp b/src/WriterImpl.cpp index 4987cba..d5f0f11 100644 --- a/src/WriterImpl.cpp +++ b/src/WriterImpl.cpp @@ -126,7 +126,8 @@ namespace e57 } WriterImpl::WriterImpl( const ustring &filePath, const WriterOptions &options ) : - imf_( filePath, "w" ), root_( imf_.root() ), data3D_( imf_, true ), images2D_( imf_, true ) + imf_( filePath, "w" ), root_( imf_.root() ), data3D_( imf_, true ), images2D_( imf_, true ), + skipPacketWriteIndex_(options.skipPacketWriteIndex) { // We are using the E57 v1.0 data format standard field names. // The standard field names are used without an extension prefix (in the default namespace). @@ -1295,7 +1296,7 @@ namespace e57 } // create the writer, all buffers must be setup before this call - CompressedVectorWriter writer = points.writer( sourceBuffers ); + CompressedVectorWriter writer = points.writer( sourceBuffers, skipPacketWriteIndex_ ); return writer; } @@ -1345,7 +1346,7 @@ namespace e57 groupSDBuffers.emplace_back( imf_, "startPointIndex", startPointIndex, groupCount, true ); groupSDBuffers.emplace_back( imf_, "pointCount", pointCount, groupCount, true ); - CompressedVectorWriter writer = groups.writer( groupSDBuffers ); + CompressedVectorWriter writer = groups.writer( groupSDBuffers, skipPacketWriteIndex_ ); writer.write( groupCount ); writer.close(); diff --git a/src/WriterImpl.h b/src/WriterImpl.h index d353ddd..f7e943a 100644 --- a/src/WriterImpl.h +++ b/src/WriterImpl.h @@ -79,5 +79,7 @@ namespace e57 VectorNode data3D_; VectorNode images2D_; + + bool skipPacketWriteIndex_ = false; }; // end Writer class } // end namespace e57 diff --git a/test/src/test_SimpleWriter.cpp b/test/src/test_SimpleWriter.cpp index c1eee01..ad7253a 100644 --- a/test/src/test_SimpleWriter.cpp +++ b/test/src/test_SimpleWriter.cpp @@ -705,3 +705,44 @@ TEST( SimpleWriterData, VisualRefImage ) delete writer; } + +TEST( SimpleWriter, SkipPacketWriteIndexFlag ) +{ + e57::WriterOptions options; + options.guid = "Skip Packet Write Index Test GUID"; + options.skipPacketWriteIndex = true; + + e57::Writer *writer = nullptr; + + E57_ASSERT_NO_THROW( writer = new e57::Writer( "./SkipPacketWriteIndexFalse.e57", options ) ); + + constexpr int64_t cNumPoints = 10; + + e57::Data3D header; + header.guid = "SkipPacketWriteIndexFalse Header GUID"; + header.pointCount = cNumPoints; + header.pointFields.cartesianXField = true; + header.pointFields.cartesianYField = true; + header.pointFields.cartesianZField = true; + + e57::Data3DPointsFloat pointsData( header ); + + for ( int64_t i = 0; i < cNumPoints; ++i ) + { + auto floati = static_cast( i ); + pointsData.cartesianX[i] = floati; + pointsData.cartesianY[i] = floati; + pointsData.cartesianZ[i] = floati; + } + + try + { + writer->WriteData3DData( header, pointsData ); + } + catch ( e57::E57Exception &err ) + { + FAIL() << err.errorStr() << ": " << err.context(); + } + + delete writer; +} \ No newline at end of file From d1bb0820d1fa4125086a8cda2966dc809a46feff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Zetterstr=C3=B6m?= Date: Mon, 14 Apr 2025 18:14:22 +0200 Subject: [PATCH 2/2] Better naming of the switch --- include/E57Format.h | 2 +- include/E57SimpleWriter.h | 4 ++-- src/CompressedVectorNode.cpp | 4 ++-- src/CompressedVectorNodeImpl.cpp | 4 ++-- src/CompressedVectorNodeImpl.h | 2 +- src/CompressedVectorWriterImpl.cpp | 6 +++--- src/CompressedVectorWriterImpl.h | 4 ++-- src/WriterImpl.cpp | 6 +++--- src/WriterImpl.h | 2 +- test/src/test_SimpleWriter.cpp | 17 ++++++++++++----- 10 files changed, 29 insertions(+), 22 deletions(-) diff --git a/include/E57Format.h b/include/E57Format.h index 9be1aa9..960f092 100644 --- a/include/E57Format.h +++ b/include/E57Format.h @@ -487,7 +487,7 @@ public: // Iterators CompressedVectorWriter writer( std::vector &sbufs, - bool skipPacketWriteIndex = false ); + bool writeIndexPackets = true ); CompressedVectorReader reader( const std::vector &dbufs ); // Up/Down cast conversion diff --git a/include/E57SimpleWriter.h b/include/E57SimpleWriter.h index 915f402..bfcf67f 100644 --- a/include/E57SimpleWriter.h +++ b/include/E57SimpleWriter.h @@ -48,8 +48,8 @@ namespace e57 /// Information describing the Coordinate Reference System to be used for the file ustring coordinateMetadata; - /// Skip writing the index packet (this is not standards compliant) - bool skipPacketWriteIndex = false; + /// Write the index packets (setting this to false is not standards compliant) + bool writeIndexPackets = true; }; /// @brief Used for writing an E57 file using the E57 Simple API. diff --git a/src/CompressedVectorNode.cpp b/src/CompressedVectorNode.cpp index 0dea235..422581c 100644 --- a/src/CompressedVectorNode.cpp +++ b/src/CompressedVectorNode.cpp @@ -439,9 +439,9 @@ CompressedVectorNode cannot be set twice). CompressedVectorNode::prototype */ CompressedVectorWriter CompressedVectorNode::writer( std::vector &sbufs, - bool skipPacketWriteIndex ) + bool writeIndexPackets ) { - return CompressedVectorWriter( impl_->writer( sbufs, skipPacketWriteIndex ) ); + return CompressedVectorWriter( impl_->writer( sbufs, writeIndexPackets ) ); } /*! diff --git a/src/CompressedVectorNodeImpl.cpp b/src/CompressedVectorNodeImpl.cpp index 50cb60b..9243fe0 100644 --- a/src/CompressedVectorNodeImpl.cpp +++ b/src/CompressedVectorNodeImpl.cpp @@ -266,7 +266,7 @@ namespace e57 #endif std::shared_ptr CompressedVectorNodeImpl::writer( - std::vector sbufs, bool skipPacketWriteIndex ) + std::vector sbufs, bool writeIndexPackets ) { checkImageFileOpen( __FILE__, __LINE__, static_cast( __FUNCTION__ ) ); @@ -313,7 +313,7 @@ namespace e57 // Return a shared_ptr to new object std::shared_ptr cvwi( - new CompressedVectorWriterImpl( cai, sbufs, skipPacketWriteIndex ) ); + new CompressedVectorWriterImpl( cai, sbufs, writeIndexPackets ) ); return ( cvwi ); } diff --git a/src/CompressedVectorNodeImpl.h b/src/CompressedVectorNodeImpl.h index b7a0aa3..bd237d7 100644 --- a/src/CompressedVectorNodeImpl.h +++ b/src/CompressedVectorNodeImpl.h @@ -59,7 +59,7 @@ namespace e57 /// Iterator constructors std::shared_ptr writer( std::vector sbufs, - bool skipPacketWriteIndex = false ); + bool writeIndexPackets = true ); std::shared_ptr reader( std::vector dbufs ); int64_t getRecordCount() const diff --git a/src/CompressedVectorWriterImpl.cpp b/src/CompressedVectorWriterImpl.cpp index 86baba0..56a5c0c 100644 --- a/src/CompressedVectorWriterImpl.cpp +++ b/src/CompressedVectorWriterImpl.cpp @@ -49,8 +49,8 @@ namespace e57 CompressedVectorWriterImpl::CompressedVectorWriterImpl( std::shared_ptr ni, std::vector &sbufs, - bool skipPacketWriteIndex ) : - cVector_( ni ), skipPacketWriteIndex_(skipPacketWriteIndex), isOpen_( false ) // set to true when succeed below + bool writeIndexPackets ) : + cVector_( ni ), writeIndexPackets_(writeIndexPackets), isOpen_( false ) // set to true when succeed below { //??? check if cvector already been written (can't write twice) @@ -184,7 +184,7 @@ namespace e57 flush(); } - if (!skipPacketWriteIndex_) + if (writeIndexPackets_) { // Write one index packet (required by standard). packetWriteIndex(); diff --git a/src/CompressedVectorWriterImpl.h b/src/CompressedVectorWriterImpl.h index 2675af3..c2ab933 100644 --- a/src/CompressedVectorWriterImpl.h +++ b/src/CompressedVectorWriterImpl.h @@ -36,7 +36,7 @@ namespace e57 public: CompressedVectorWriterImpl( std::shared_ptr ni, std::vector &sbufs, - bool skipPacketWriteIndex = false ); + bool writeIndexPackets = true ); ~CompressedVectorWriterImpl(); void write( size_t requestedRecordCount ); @@ -70,7 +70,7 @@ namespace e57 std::vector> bytestreams_; DataPacket dataPacket_; - bool skipPacketWriteIndex_; /// if true, don't write index packets + bool writeIndexPackets_; /// set this to false for backwards compatibility bool isOpen_; uint64_t sectionHeaderLogicalStart_; /// start of CompressedVector binary section uint64_t sectionLogicalLength_; /// total length of CompressedVector binary section diff --git a/src/WriterImpl.cpp b/src/WriterImpl.cpp index d5f0f11..be1ddee 100644 --- a/src/WriterImpl.cpp +++ b/src/WriterImpl.cpp @@ -127,7 +127,7 @@ namespace e57 WriterImpl::WriterImpl( const ustring &filePath, const WriterOptions &options ) : imf_( filePath, "w" ), root_( imf_.root() ), data3D_( imf_, true ), images2D_( imf_, true ), - skipPacketWriteIndex_(options.skipPacketWriteIndex) + writeIndexPackets_(options.writeIndexPackets) { // We are using the E57 v1.0 data format standard field names. // The standard field names are used without an extension prefix (in the default namespace). @@ -1296,7 +1296,7 @@ namespace e57 } // create the writer, all buffers must be setup before this call - CompressedVectorWriter writer = points.writer( sourceBuffers, skipPacketWriteIndex_ ); + CompressedVectorWriter writer = points.writer( sourceBuffers, writeIndexPackets_ ); return writer; } @@ -1346,7 +1346,7 @@ namespace e57 groupSDBuffers.emplace_back( imf_, "startPointIndex", startPointIndex, groupCount, true ); groupSDBuffers.emplace_back( imf_, "pointCount", pointCount, groupCount, true ); - CompressedVectorWriter writer = groups.writer( groupSDBuffers, skipPacketWriteIndex_ ); + CompressedVectorWriter writer = groups.writer( groupSDBuffers, writeIndexPackets_ ); writer.write( groupCount ); writer.close(); diff --git a/src/WriterImpl.h b/src/WriterImpl.h index f7e943a..6bbbe2f 100644 --- a/src/WriterImpl.h +++ b/src/WriterImpl.h @@ -80,6 +80,6 @@ namespace e57 VectorNode images2D_; - bool skipPacketWriteIndex_ = false; + bool writeIndexPackets_; }; // end Writer class } // end namespace e57 diff --git a/test/src/test_SimpleWriter.cpp b/test/src/test_SimpleWriter.cpp index ad7253a..9f4fdf1 100644 --- a/test/src/test_SimpleWriter.cpp +++ b/test/src/test_SimpleWriter.cpp @@ -706,20 +706,27 @@ TEST( SimpleWriterData, VisualRefImage ) delete writer; } -TEST( SimpleWriter, SkipPacketWriteIndexFlag ) +TEST( SimpleWriter, WritePacketIsTrueByDefault) { e57::WriterOptions options; - options.guid = "Skip Packet Write Index Test GUID"; - options.skipPacketWriteIndex = true; + + EXPECT_TRUE( options.writeIndexPackets ); +} + +TEST( SimpleWriter, PacketWriteIndexFlag ) +{ + e57::WriterOptions options; + options.guid = "Packet Write Index Test GUID"; + options.writeIndexPackets = false; e57::Writer *writer = nullptr; - E57_ASSERT_NO_THROW( writer = new e57::Writer( "./SkipPacketWriteIndexFalse.e57", options ) ); + E57_ASSERT_NO_THROW( writer = new e57::Writer( "./PacketWriteIndexFalse.e57", options ) ); constexpr int64_t cNumPoints = 10; e57::Data3D header; - header.guid = "SkipPacketWriteIndexFalse Header GUID"; + header.guid = "PacketWriteIndexFalse Header GUID"; header.pointCount = cNumPoints; header.pointFields.cartesianXField = true; header.pointFields.cartesianYField = true;