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,6 +22,7 @@ | ||
| 22 | #include <concepts> | 22 | #include <concepts> |
| 23 | #include <cstdlib> | 23 | #include <cstdlib> |
| 24 | #include <stdexcept> | 24 | #include <stdexcept> |
| 25 | +#include <tuple> | ||
| 25 | 26 | ||
| 26 | using namespace std::literals; | 27 | using namespace std::literals; |
| 27 | using namespace qpdf; | 28 | using namespace qpdf; |
| @@ -394,11 +395,12 @@ class QPDFWriter::Members: QPDF::Writer | @@ -394,11 +395,12 @@ class QPDFWriter::Members: QPDF::Writer | ||
| 394 | void assignCompressedObjectNumbers(QPDFObjGen og); | 395 | void assignCompressedObjectNumbers(QPDFObjGen og); |
| 395 | Dictionary trimmed_trailer(); | 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 | unsigned int bytesNeeded(long long n); | 404 | unsigned int bytesNeeded(long long n); |
| 403 | void writeBinary(unsigned long long val, unsigned int bytes); | 405 | void writeBinary(unsigned long long val, unsigned int bytes); |
| 404 | Members& write(std::string_view str); | 406 | Members& write(std::string_view str); |
| @@ -1507,14 +1509,18 @@ QPDFWriter::Members::writeTrailer( | @@ -1507,14 +1509,18 @@ QPDFWriter::Members::writeTrailer( | ||
| 1507 | } | 1509 | } |
| 1508 | 1510 | ||
| 1509 | bool | 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 | QPDFObjGen old_og = stream.getObjGen(); | 1525 | QPDFObjGen old_og = stream.getObjGen(); |
| 1520 | QPDFObjectHandle stream_dict = stream.getDict(); | 1526 | QPDFObjectHandle stream_dict = stream.getDict(); |
| @@ -1522,7 +1528,8 @@ QPDFWriter::Members::willFilterStream( | @@ -1522,7 +1528,8 @@ QPDFWriter::Members::willFilterStream( | ||
| 1522 | if (stream.isRootMetadata()) { | 1528 | if (stream.isRootMetadata()) { |
| 1523 | is_root_metadata = true; | 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 | bool filter_on_write = stream.getFilterOnWrite(); | 1533 | bool filter_on_write = stream.getFilterOnWrite(); |
| 1527 | if (!filter_on_write) { | 1534 | if (!filter_on_write) { |
| 1528 | filter = false; | 1535 | filter = false; |
| @@ -1597,7 +1604,7 @@ QPDFWriter::Members::willFilterStream( | @@ -1597,7 +1604,7 @@ QPDFWriter::Members::willFilterStream( | ||
| 1597 | if (!filtered) { | 1604 | if (!filtered) { |
| 1598 | compress_stream = false; | 1605 | compress_stream = false; |
| 1599 | } | 1606 | } |
| 1600 | - return filtered; | 1607 | + return {filtered, compress_stream, is_root_metadata}; |
| 1601 | } | 1608 | } |
| 1602 | 1609 | ||
| 1603 | void | 1610 | void |
| @@ -1792,16 +1799,15 @@ QPDFWriter::Members::unparseObject( | @@ -1792,16 +1799,15 @@ QPDFWriter::Members::unparseObject( | ||
| 1792 | } | 1799 | } |
| 1793 | 1800 | ||
| 1794 | flags |= f_stream; | 1801 | flags |= f_stream; |
| 1795 | - bool compress_stream = false; | ||
| 1796 | - bool is_metadata = false; | ||
| 1797 | std::string stream_data; | 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 | flags |= f_filtered; | 1805 | flags |= f_filtered; |
| 1800 | } | 1806 | } |
| 1801 | QPDFObjectHandle stream_dict = object.getDict(); | 1807 | QPDFObjectHandle stream_dict = object.getDict(); |
| 1802 | 1808 | ||
| 1803 | cur_stream_length = stream_data.size(); | 1809 | cur_stream_length = stream_data.size(); |
| 1804 | - if (is_metadata && encryption && !encryption->getEncryptMetadata()) { | 1810 | + if (is_root_metadata && encryption && !encryption->getEncryptMetadata()) { |
| 1805 | // Don't encrypt stream data for the metadata stream | 1811 | // Don't encrypt stream data for the metadata stream |
| 1806 | cur_data_key.clear(); | 1812 | cur_data_key.clear(); |
| 1807 | } | 1813 | } |
| @@ -2770,17 +2776,11 @@ QPDFWriter::Members::writeLinearized() | @@ -2770,17 +2776,11 @@ QPDFWriter::Members::writeLinearized() | ||
| 2770 | std::map<int, int> stream_cache; | 2776 | std::map<int, int> stream_cache; |
| 2771 | 2777 | ||
| 2772 | auto skip_stream_parameters = [this, &stream_cache](QPDFObjectHandle& stream) { | 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 | optimize(obj, skip_stream_parameters); | 2786 | optimize(obj, skip_stream_parameters); |