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,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);