diff options
author | Jay Berkenbilt <ejb@ql.org> | 2019-01-11 04:11:38 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2019-01-11 04:35:08 +0100 |
commit | d24a120c7ffb4cbfd2dcebe63577d8704442f7bd (patch) | |
tree | 72c19aab1124a8a79b76a97eae0780d029bc9497 /libqpdf | |
parent | 6b15579ace057c24040184357a4419261e095600 (diff) | |
download | qpdf-d24a120c7ffb4cbfd2dcebe63577d8704442f7bd.tar.zst |
Add QPDF::setImmediateCopyFrom
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 772a17cd..95ae9cab 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -147,6 +147,7 @@ QPDF::Members::Members() : copied_stream_data_provider(0), reconstructed_xref(false), fixed_dangling_refs(false), + immediate_copy_from(false), first_xref_item_offset(0), uncompressed_after_compressed(false) { @@ -269,6 +270,12 @@ QPDF::setAttemptRecovery(bool val) this->m->attempt_recovery = val; } +void +QPDF::setImmediateCopyFrom(bool val) +{ + this->m->immediate_copy_from = val; +} + std::vector<QPDFExc> QPDF::getWarnings() { @@ -2376,6 +2383,19 @@ QPDF::replaceForeignIndirectObjects( } PointerHolder<Buffer> stream_buffer = stream->getStreamDataBuffer(); + if ((foreign_stream_qpdf->m->immediate_copy_from) && + (stream_buffer.getPointer() == 0)) + { + // Pull the stream data into a buffer before attempting + // the copy operation. Do it on the source stream so that + // if the source stream is copied multiple times, we don't + // have to keep duplicating the memory. + QTC::TC("qpdf", "QPDF immediate copy stream data"); + foreign.replaceStreamData(foreign.getRawStreamData(), + dict.getKey("/Filter"), + dict.getKey("/DecodeParms")); + stream_buffer = stream->getStreamDataBuffer(); + } PointerHolder<QPDFObjectHandle::StreamDataProvider> stream_provider = stream->getStreamDataProvider(); if (stream_buffer.getPointer()) |