From 8a6b35827fb57b5ed72a695de713c668a268060d Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 20 Jul 2025 15:27:55 +0100 Subject: [PATCH] Refactor `QPDF_Stream` and related classes to replace `Buffer` usage with `std::string`, improving performance, simplifying stream data handling, and reducing dependency on `BufferInputSource`. --- libqpdf/QPDF_Stream.cc | 19 +++++++++++-------- libqpdf/QPDF_objects.cc | 29 ++++++++++++----------------- libqpdf/qpdf/QPDFObjectHandle_private.hh | 4 ++-- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index b71a439..e6dd873 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -319,10 +320,11 @@ qpdf::Stream::setDictDescription() } } -std::shared_ptr +std::string Stream::getStreamData(qpdf_stream_decode_level_e decode_level) { - Pl_Buffer buf("stream data buffer"); + std::string result; + pl::String buf(result); bool filtered; pipeStreamData(&buf, &filtered, 0, decode_level, false, false); if (!filtered) { @@ -334,13 +336,14 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) "getStreamData called on unfilterable stream"); } QTC::TC("qpdf", "QPDF_Stream getStreamData"); - return buf.getBufferSharedPointer(); + return result; } -std::shared_ptr +std::string Stream::getRawStreamData() { - Pl_Buffer buf("stream data buffer"); + std::string result; + pl::String buf(result); if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { throw QPDFExc( qpdf_e_unsupported, @@ -350,7 +353,7 @@ Stream::getRawStreamData() "error getting raw stream data"); } QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); - return buf.getBufferSharedPointer(); + return result; } bool @@ -683,13 +686,13 @@ QPDFObjectHandle::isRootMetadata() const std::shared_ptr QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level) { - return as_stream(error).getStreamData(level); + return std::make_shared(as_stream(error).getStreamData(level)); } std::shared_ptr QPDFObjectHandle::getRawStreamData() { - return as_stream(error).getRawStreamData(); + return std::make_shared(as_stream(error).getRawStreamData()); } bool diff --git a/libqpdf/QPDF_objects.cc b/libqpdf/QPDF_objects.cc index 70eea69..b2a352d 100644 --- a/libqpdf/QPDF_objects.cc +++ b/libqpdf/QPDF_objects.cc @@ -2,18 +2,7 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include - -#include #include -#include #include #include #include @@ -24,6 +13,13 @@ #include #include +#include +#include +#include +#include +#include +#include + using namespace qpdf; using namespace std::literals; @@ -1675,13 +1671,13 @@ QPDF::resolveObjectsInStream(int obj_stream_number) // id, offset, size std::vector> offsets; - auto bp = obj_stream.getStreamData(qpdf_dl_specialized); + auto stream_data = obj_stream.getStreamData(qpdf_dl_specialized); - BufferInputSource input("", bp.get()); + is::OffsetBuffer input("", stream_data); - const auto b_size = bp->getSize(); + const auto b_size = stream_data.size(); const auto end_offset = static_cast(b_size); - auto b_start = bp->getBuffer(); + auto b_start = stream_data.data(); if (first >= end_offset) { throw damagedPDF( @@ -1762,8 +1758,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) auto entry = m->xref_table.find(og); if (entry != m->xref_table.end() && entry->second.getType() == 2 && entry->second.getObjStreamNumber() == obj_stream_number) { - Buffer obj_buffer{b_start + obj_offset, obj_size}; - is::OffsetBuffer in("", &obj_buffer, obj_offset); + is::OffsetBuffer in("", {b_start + obj_offset, obj_size}, obj_offset); auto oh = readObjectInStream(in, obj_stream_number, obj_id); updateCache(og, oh.getObj(), end_before_space, end_after_space); } else { diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index ddba62f..c73ea1b 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -254,8 +254,8 @@ namespace qpdf qpdf_stream_decode_level_e decode_level, bool suppress_warnings, bool will_retry); - std::shared_ptr getStreamData(qpdf_stream_decode_level_e level); - std::shared_ptr getRawStreamData(); + std::string getStreamData(qpdf_stream_decode_level_e level); + std::string getRawStreamData(); void replaceStreamData( std::shared_ptr data, QPDFObjectHandle const& filter, -- libgit2 0.21.4