diff options
author | Jay Berkenbilt <jberkenbilt@users.noreply.github.com> | 2023-12-16 17:31:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-16 17:31:11 +0100 |
commit | b0b6d9f21fe77fb7b46469529bf252f0dbcaa551 (patch) | |
tree | 612562863dbf4364e41e2086b701b92761c18e72 /libqpdf/QPDF_Stream.cc | |
parent | d7a364b882be44c93dc4a843bcca2ae63e805c2c (diff) | |
parent | 368666899fe24885fbe05ea03688fa985645ebd9 (diff) | |
download | qpdf-b0b6d9f21fe77fb7b46469529bf252f0dbcaa551.tar.zst |
Merge pull request #1067 from m-holger/pl_buff
Reduce copying of Buffer contents
Diffstat (limited to 'libqpdf/QPDF_Stream.cc')
-rw-r--r-- | libqpdf/QPDF_Stream.cc | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 45d6fb70..a43d91ff 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -216,29 +216,28 @@ QPDF_Stream::getStreamJSON( auto dict = this->stream_dict; JSON result = JSON::makeDictionary(); if (json_data != qpdf_sj_none) { - std::shared_ptr<Buffer> buf; + Pl_Discard discard; + Pl_Buffer buf_pl{"stream data"}; + // buf_pl contains valid data and is ready for retrieval of the data. + bool buf_pl_ready = false; bool filtered = false; bool filter = (decode_level != qpdf_dl_none); for (int attempt = 1; attempt <= 2; ++attempt) { - Pl_Discard discard; - std::shared_ptr<Pl_Buffer> buf_pl; - Pipeline* data_pipeline = nullptr; + Pipeline* data_pipeline = &discard; if (json_data == qpdf_sj_file) { // We need to capture the data to write - buf_pl = std::make_shared<Pl_Buffer>("stream data"); - data_pipeline = buf_pl.get(); - } else { - data_pipeline = &discard; + data_pipeline = &buf_pl; } bool succeeded = pipeStreamData(data_pipeline, &filtered, 0, decode_level, false, (attempt == 1)); - if ((!succeeded) || (filter && (!filtered))) { + if (!succeeded || (filter && !filtered)) { // Try again filter = false; decode_level = qpdf_dl_none; + buf_pl.getString(); // reset buf_pl } else { - if (buf_pl.get()) { - buf = buf_pl->getBufferSharedPointer(); + if (json_data == qpdf_sj_file) { + buf_pl_ready = true; } break; } @@ -252,10 +251,10 @@ QPDF_Stream::getStreamJSON( } if (json_data == qpdf_sj_file) { result.addDictionaryMember("datafile", JSON::makeString(data_filename)); - if (!buf.get()) { + if (!buf_pl_ready) { throw std::logic_error("QPDF_Stream: failed to get stream data in json file mode"); } - p->write(buf->getBuffer(), buf->getSize()); + p->writeString(buf_pl.getString()); } else if (json_data == qpdf_sj_inline) { result.addDictionaryMember( "data", JSON::makeBlob(StreamBlobProvider(this, decode_level))); |