aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-01-11 04:11:38 +0100
committerJay Berkenbilt <ejb@ql.org>2019-01-11 04:35:08 +0100
commitd24a120c7ffb4cbfd2dcebe63577d8704442f7bd (patch)
tree72c19aab1124a8a79b76a97eae0780d029bc9497 /libqpdf/QPDF.cc
parent6b15579ace057c24040184357a4419261e095600 (diff)
downloadqpdf-d24a120c7ffb4cbfd2dcebe63577d8704442f7bd.tar.zst
Add QPDF::setImmediateCopyFrom
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc20
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())