diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh index b19fb85..932389d 100644 --- a/include/qpdf/QPDFWriter.hh +++ b/include/qpdf/QPDFWriter.hh @@ -476,11 +476,6 @@ class QPDFWriter void writeObject(QPDFObjectHandle object, int object_stream_index = -1); void writeTrailer( trailer_e which, int size, bool xref_stream, qpdf_offset_t prev, int linearization_pass); - bool willFilterStream( - QPDFObjectHandle stream, - bool& compress_stream, - bool& is_metadata, - std::string* stream_data); void unparseObject( QPDFObjectHandle object, size_t level, diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 39df5d5..de4caa2 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -305,6 +305,12 @@ class QPDFWriter::Members void assignCompressedObjectNumbers(QPDFObjGen og); QPDFObjectHandle getTrimmedTrailer(); + bool willFilterStream( + QPDFObjectHandle stream, + bool& compress_stream, + bool& is_metadata, + std::string* stream_data); + private: QPDFWriter& w; QPDF& pdf; @@ -1342,7 +1348,7 @@ QPDFWriter::writeTrailer( } bool -QPDFWriter::willFilterStream( +QPDFWriter::Members::willFilterStream( QPDFObjectHandle stream, bool& compress_stream, // out only bool& is_root_metadata, // out only @@ -1357,38 +1363,33 @@ QPDFWriter::willFilterStream( if (stream.isRootMetadata()) { is_root_metadata = true; } - bool filter = stream.isDataModified() || m->compress_streams || m->stream_decode_level; + bool filter = stream.isDataModified() || compress_streams || stream_decode_level; bool filter_on_write = stream.getFilterOnWrite(); if (!filter_on_write) { - QTC::TC("qpdf", "QPDFWriter getFilterOnWrite false"); filter = false; } - if (filter_on_write && m->compress_streams) { + if (filter_on_write && compress_streams) { // Don't filter if the stream is already compressed with FlateDecode. This way we don't make // it worse if the original file used a better Flate algorithm, and we don't spend time and // CPU cycles uncompressing and recompressing stuff. This can be overridden with // setRecompressFlate(true). QPDFObjectHandle filter_obj = stream_dict.getKey("/Filter"); - if (!m->recompress_flate && !stream.isDataModified() && filter_obj.isName() && + if (!recompress_flate && !stream.isDataModified() && filter_obj.isName() && (filter_obj.getName() == "/FlateDecode" || filter_obj.getName() == "/Fl")) { - QTC::TC("qpdf", "QPDFWriter not recompressing /FlateDecode"); filter = false; } } bool normalize = false; bool uncompress = false; - if (filter_on_write && is_root_metadata && - (!m->encryption || !m->encryption->getEncryptMetadata())) { - QTC::TC("qpdf", "QPDFWriter not compressing metadata"); + if (filter_on_write && is_root_metadata && (!encryption || !encryption->getEncryptMetadata())) { filter = true; compress_stream = false; uncompress = true; - } else if (filter_on_write && m->normalize_content && m->normalized_streams.contains(old_og)) { + } else if (filter_on_write && normalize_content && normalized_streams.contains(old_og)) { normalize = true; filter = true; - } else if (filter_on_write && filter && m->compress_streams) { + } else if (filter_on_write && filter && compress_streams) { compress_stream = true; - QTC::TC("qpdf", "QPDFWriter compressing uncompressed stream"); } // Disable compression for empty streams to improve compatibility @@ -1400,16 +1401,16 @@ QPDFWriter::willFilterStream( bool filtered = false; for (bool first_attempt: {true, false}) { - auto pp_stream_data = stream_data ? m->pipeline_stack.activate(*stream_data) - : m->pipeline_stack.activate(true); + auto pp_stream_data = + stream_data ? pipeline_stack.activate(*stream_data) : pipeline_stack.activate(true); try { filtered = stream.pipeStreamData( - m->pipeline, + pipeline, !filter ? 0 : ((normalize ? qpdf_ef_normalize : 0) | (compress_stream ? qpdf_ef_compress : 0)), - !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : m->stream_decode_level), + !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : stream_decode_level), false, first_attempt); if (filter && !filtered) { @@ -1639,7 +1640,7 @@ QPDFWriter::unparseObject( bool compress_stream = false; bool is_metadata = false; std::string stream_data; - if (willFilterStream(object, compress_stream, is_metadata, &stream_data)) { + if (m->willFilterStream(object, compress_stream, is_metadata, &stream_data)) { flags |= f_filtered; } QPDFObjectHandle stream_dict = object.getDict(); @@ -2607,7 +2608,7 @@ QPDFWriter::writeLinearized() if (result == 0) { bool compress_stream; bool is_metadata; - if (willFilterStream(stream, compress_stream, is_metadata, nullptr)) { + if (m->willFilterStream(stream, compress_stream, is_metadata, nullptr)) { result = 2; } else { result = 1; diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 92c77e5..8a925da 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -81,7 +81,6 @@ QPDF xref deleted object 0 SF_FlateLzwDecode PNG filter 0 QPDF xref /Index is array 1 QPDFWriter encrypt object stream 0 -QPDFWriter compressing uncompressed stream 0 QPDF exclude indirect length 0 QPDF exclude encryption dictionary 0 QPDF loop detected traversing objects 0 @@ -90,7 +89,6 @@ QPDF recovered in readObjectAtOffset 0 QPDF recovered stream length 0 QPDF found wrong endstream in recovery 0 QPDF_Stream pipeStreamData with null pipeline 0 -QPDFWriter not recompressing /FlateDecode 0 QPDFJob unable to filter 0 QUtil non-trivial UTF-16 0 QPDF xref overwrite invalid objgen 0 @@ -134,7 +132,6 @@ qpdf-c called qpdf_set_minimum_pdf_version 0 qpdf-c called qpdf_force_pdf_version 0 qpdf-c called qpdf_init_write multiple times 0 QPDF_encryption rc4 decode string 0 -QPDFWriter not compressing metadata 0 QPDF_encryption aes decode string 0 QPDFWriter forced version disabled encryption 0 qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 @@ -451,7 +448,6 @@ qpdf-c called qpdf_oh_get_generation 0 qpdf-c called qpdf_oh_unparse 0 qpdf-c called qpdf_oh_unparse_resolved 0 qpdf-c called qpdf_oh_unparse_binary 0 -QPDFWriter getFilterOnWrite false 0 QPDFPageObjectHelper::forEachXObject 3 NNTree erased last kid/item in tree 1 QPDFPageObjectHelper unresolved names 0