Commit 31abc63f92a7af5569fdc22f01268045e6a6d232
1 parent
a5afb867
Refactor `QPDFWriter::Members`: consolidate `willFilterStream` logic into a tupl…
…e-returning overload, streamline calls, and simplify stream filtering checks.
Showing
1 changed file
with
28 additions
and
28 deletions
libqpdf/QPDFWriter.cc
| ... | ... | @@ -22,6 +22,7 @@ |
| 22 | 22 | #include <concepts> |
| 23 | 23 | #include <cstdlib> |
| 24 | 24 | #include <stdexcept> |
| 25 | +#include <tuple> | |
| 25 | 26 | |
| 26 | 27 | using namespace std::literals; |
| 27 | 28 | using namespace qpdf; |
| ... | ... | @@ -394,11 +395,12 @@ class QPDFWriter::Members: QPDF::Writer |
| 394 | 395 | void assignCompressedObjectNumbers(QPDFObjGen og); |
| 395 | 396 | Dictionary trimmed_trailer(); |
| 396 | 397 | |
| 397 | - bool willFilterStream( | |
| 398 | - QPDFObjectHandle stream, | |
| 399 | - bool& compress_stream, | |
| 400 | - bool& is_metadata, | |
| 401 | - std::string* stream_data); | |
| 398 | + // Returns tuple<filter, compress_stream, is_root_metadata> | |
| 399 | + std::tuple<const bool, const bool, const bool> | |
| 400 | + will_filter_stream(QPDFObjectHandle stream, std::string* stream_data); | |
| 401 | + | |
| 402 | + // Test whether stream would be filtered if it were written. | |
| 403 | + bool will_filter_stream(QPDFObjectHandle stream); | |
| 402 | 404 | unsigned int bytesNeeded(long long n); |
| 403 | 405 | void writeBinary(unsigned long long val, unsigned int bytes); |
| 404 | 406 | Members& write(std::string_view str); |
| ... | ... | @@ -1507,14 +1509,18 @@ QPDFWriter::Members::writeTrailer( |
| 1507 | 1509 | } |
| 1508 | 1510 | |
| 1509 | 1511 | bool |
| 1510 | -QPDFWriter::Members::willFilterStream( | |
| 1511 | - QPDFObjectHandle stream, | |
| 1512 | - bool& compress_stream, // out only | |
| 1513 | - bool& is_root_metadata, // out only | |
| 1514 | - std::string* stream_data) | |
| 1512 | +QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream) | |
| 1513 | +{ | |
| 1514 | + std::string s; | |
| 1515 | + [[maybe_unused]] auto [filter, ignore1, ignore2] = will_filter_stream(stream, &s); | |
| 1516 | + return filter; | |
| 1517 | +} | |
| 1518 | + | |
| 1519 | +std::tuple<const bool, const bool, const bool> | |
| 1520 | +QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* stream_data) | |
| 1515 | 1521 | { |
| 1516 | - compress_stream = false; | |
| 1517 | - is_root_metadata = false; | |
| 1522 | + bool compress_stream = false; | |
| 1523 | + bool is_root_metadata = false; | |
| 1518 | 1524 | |
| 1519 | 1525 | QPDFObjGen old_og = stream.getObjGen(); |
| 1520 | 1526 | QPDFObjectHandle stream_dict = stream.getDict(); |
| ... | ... | @@ -1522,7 +1528,8 @@ QPDFWriter::Members::willFilterStream( |
| 1522 | 1528 | if (stream.isRootMetadata()) { |
| 1523 | 1529 | is_root_metadata = true; |
| 1524 | 1530 | } |
| 1525 | - bool filter = stream.isDataModified() || compress_streams || stream_decode_level; | |
| 1531 | + bool filter = | |
| 1532 | + stream.isDataModified() || compress_streams || stream_decode_level != qpdf_dl_none; | |
| 1526 | 1533 | bool filter_on_write = stream.getFilterOnWrite(); |
| 1527 | 1534 | if (!filter_on_write) { |
| 1528 | 1535 | filter = false; |
| ... | ... | @@ -1597,7 +1604,7 @@ QPDFWriter::Members::willFilterStream( |
| 1597 | 1604 | if (!filtered) { |
| 1598 | 1605 | compress_stream = false; |
| 1599 | 1606 | } |
| 1600 | - return filtered; | |
| 1607 | + return {filtered, compress_stream, is_root_metadata}; | |
| 1601 | 1608 | } |
| 1602 | 1609 | |
| 1603 | 1610 | void |
| ... | ... | @@ -1792,16 +1799,15 @@ QPDFWriter::Members::unparseObject( |
| 1792 | 1799 | } |
| 1793 | 1800 | |
| 1794 | 1801 | flags |= f_stream; |
| 1795 | - bool compress_stream = false; | |
| 1796 | - bool is_metadata = false; | |
| 1797 | 1802 | std::string stream_data; |
| 1798 | - if (willFilterStream(object, compress_stream, is_metadata, &stream_data)) { | |
| 1803 | + auto [filter, compress_stream, is_root_metadata] = will_filter_stream(object, &stream_data); | |
| 1804 | + if (filter) { | |
| 1799 | 1805 | flags |= f_filtered; |
| 1800 | 1806 | } |
| 1801 | 1807 | QPDFObjectHandle stream_dict = object.getDict(); |
| 1802 | 1808 | |
| 1803 | 1809 | cur_stream_length = stream_data.size(); |
| 1804 | - if (is_metadata && encryption && !encryption->getEncryptMetadata()) { | |
| 1810 | + if (is_root_metadata && encryption && !encryption->getEncryptMetadata()) { | |
| 1805 | 1811 | // Don't encrypt stream data for the metadata stream |
| 1806 | 1812 | cur_data_key.clear(); |
| 1807 | 1813 | } |
| ... | ... | @@ -2770,17 +2776,11 @@ QPDFWriter::Members::writeLinearized() |
| 2770 | 2776 | std::map<int, int> stream_cache; |
| 2771 | 2777 | |
| 2772 | 2778 | auto skip_stream_parameters = [this, &stream_cache](QPDFObjectHandle& stream) { |
| 2773 | - auto& result = stream_cache[stream.getObjectID()]; | |
| 2774 | - if (result == 0) { | |
| 2775 | - bool compress_stream; | |
| 2776 | - bool is_metadata; | |
| 2777 | - if (willFilterStream(stream, compress_stream, is_metadata, nullptr)) { | |
| 2778 | - result = 2; | |
| 2779 | - } else { | |
| 2780 | - result = 1; | |
| 2781 | - } | |
| 2779 | + if (auto& result = stream_cache[stream.getObjectID()]) { | |
| 2780 | + return result; | |
| 2781 | + } else { | |
| 2782 | + return result = will_filter_stream(stream) ? 2 : 1; | |
| 2782 | 2783 | } |
| 2783 | - return result; | |
| 2784 | 2784 | }; |
| 2785 | 2785 | |
| 2786 | 2786 | optimize(obj, skip_stream_parameters); | ... | ... |