Commit 31abc63f92a7af5569fdc22f01268045e6a6d232

Authored by m-holger
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);
... ...