From ddc6cf0cf6c11bb50f9f576bf547df3674142c97 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 19 Aug 2017 14:40:33 -0400 Subject: Precheck streams by default There is no need for a --precheck-streams option. We can do the precheck without imposing any penalty, only re-encoding the stream if it fails the first time. --- libqpdf/QPDFWriter.cc | 49 ++++++++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 29 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index fe25853a..06945c49 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -59,7 +59,6 @@ QPDFWriter::init() stream_decode_level = qpdf_dl_none; stream_decode_level_set = false; qdf_mode = false; - precheck_streams = false; preserve_unreferenced_objects = false; newline_before_endstream = false; static_id = false; @@ -215,12 +214,6 @@ QPDFWriter::setQDFMode(bool val) this->qdf_mode = val; } -void -QPDFWriter::setPrecheckStreams(bool val) -{ - this->precheck_streams = val; -} - void QPDFWriter::setPreserveUnreferencedObjects(bool val) { @@ -1590,34 +1583,32 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, flags |= f_stream; - if (filter && this->precheck_streams) + PointerHolder stream_data; + bool filtered = false; + for (int attempt = 1; attempt <= 2; ++attempt) { - try + pushPipeline(new Pl_Buffer("stream data")); + activatePipelineStack(); + + filtered = + object.pipeStreamData( + this->pipeline, + (((filter && normalize) ? qpdf_ef_normalize : 0) | + ((filter && compress) ? qpdf_ef_compress : 0)), + (filter + ? (uncompress ? qpdf_dl_all : this->stream_decode_level) + : qpdf_dl_none)); + popPipelineStack(&stream_data); + if (filter && (! filtered)) { - QTC::TC("qpdf", "QPDFWriter precheck stream"); - Pl_Discard discard; - filter = object.pipeStreamData( - &discard, 0, qpdf_dl_all, true); + // Try again + filter = false; } - catch (std::exception&) + else { - filter = false; + break; } } - - pushPipeline(new Pl_Buffer("stream data")); - activatePipelineStack(); - - bool filtered = - object.pipeStreamData( - this->pipeline, - (((filter && normalize) ? qpdf_ef_normalize : 0) | - ((filter && compress) ? qpdf_ef_compress : 0)), - (filter - ? (uncompress ? qpdf_dl_all : this->stream_decode_level) - : qpdf_dl_none)); - PointerHolder stream_data; - popPipelineStack(&stream_data); if (filtered) { flags |= f_filtered; -- cgit v1.2.3-54-g00ecf