From 1a62cce94012e05e25e81dd7016766d9d039281d Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 25 Dec 2020 09:50:55 -0500 Subject: Restructure optimize to allow skipping parameters of filtered streams --- include/qpdf/QPDF.hh | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index b0e9b717..a6f49b4b 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -564,16 +564,28 @@ class QPDF // QPDF_optimization.cc // The object_stream_data map maps from a "compressed" object to - // the object stream that contains it. This enables optimize to + // the object stream that contains it. This enables optimize to // populate the object <-> user maps with only uncompressed - // objects. If allow_changes is false, an exception will be - // thrown if any changes are made during the optimization process. - // This is available so that the test suite can make sure that a - // linearized file is already optimized. When called in this way, - // optimize() still populates the object <-> user maps + // objects. If allow_changes is false, an exception will be thrown + // if any changes are made during the optimization process. This + // is available so that the test suite can make sure that a + // linearized file is already optimized. When called in this way, + // optimize() still populates the object <-> user maps. The + // optional skip_stream_parameters parameter, if present, is + // called for each stream object. The function should return 2 if + // optimization should discard /Length, /Filter, and /DecodeParms; + // 1 if it should discard /Length, and 0 if it should preserve all + // keys. This is used by QPDFWriter to avoid creation of dangling + // objects for stream dictionary keys it will be regenerating. QPDF_DLL void optimize(std::map const& object_stream_data, bool allow_changes = true); + // ABI: make function optional and merge overloaded versions + QPDF_DLL + void optimize( + std::map const& object_stream_data, + bool allow_changes, + std::function skip_stream_parameters); // Traverse page tree return all /Page objects. It also detects // and resolves cases in which the same /Page object is @@ -1356,10 +1368,14 @@ class QPDF std::vector& all_pages, bool allow_changes, bool warn_skipped_keys, std::set& visited); - void updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh); - void updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh, - std::set& visited, bool top, - int depth); + void updateObjectMaps( + ObjUser const& ou, QPDFObjectHandle oh, + std::function skip_stream_parameters); + void updateObjectMapsInternal( + ObjUser const& ou, QPDFObjectHandle oh, + std::function skip_stream_parameters, + std::set& visited, bool top, + int depth); void filterCompressedObjects(std::map const& object_stream_data); // Type conversion helper methods -- cgit v1.2.3-54-g00ecf