Commit 8d4de78704367b213232c0567bdd7acd2fe2e767

Authored by m-holger
1 parent 31abc63f

Refactor `QPDFWriter::Members::will_filter_stream`: simplify stream filtering lo…

…gic, consolidate conditions, and enhance readability.
Showing 1 changed file with 26 additions and 31 deletions
libqpdf/QPDFWriter.cc
@@ -1520,42 +1520,37 @@ std::tuple<const bool, const bool, const bool> @@ -1520,42 +1520,37 @@ std::tuple<const bool, const bool, const bool>
1520 QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* stream_data) 1520 QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* stream_data)
1521 { 1521 {
1522 bool compress_stream = false; 1522 bool compress_stream = false;
1523 - bool is_root_metadata = false; 1523 + const bool is_root_metadata = stream.isRootMetadata();
1524 1524
1525 - QPDFObjGen old_og = stream.getObjGen();  
1526 QPDFObjectHandle stream_dict = stream.getDict(); 1525 QPDFObjectHandle stream_dict = stream.getDict();
1527 1526
1528 - if (stream.isRootMetadata()) {  
1529 - is_root_metadata = true;  
1530 - }  
1531 - bool filter =  
1532 - stream.isDataModified() || compress_streams || stream_decode_level != qpdf_dl_none;  
1533 - bool filter_on_write = stream.getFilterOnWrite();  
1534 - if (!filter_on_write) {  
1535 - filter = false;  
1536 - }  
1537 - if (filter_on_write && compress_streams) {  
1538 - // Don't filter if the stream is already compressed with FlateDecode. This way we don't make  
1539 - // it worse if the original file used a better Flate algorithm, and we don't spend time and  
1540 - // CPU cycles uncompressing and recompressing stuff. This can be overridden with  
1541 - // setRecompressFlate(true).  
1542 - QPDFObjectHandle filter_obj = stream_dict.getKey("/Filter");  
1543 - if (!recompress_flate && !stream.isDataModified() && filter_obj.isName() &&  
1544 - (filter_obj.getName() == "/FlateDecode" || filter_obj.getName() == "/Fl")) {  
1545 - filter = false;  
1546 - }  
1547 - } 1527 + bool filter = false;
1548 bool normalize = false; 1528 bool normalize = false;
1549 bool uncompress = false; 1529 bool uncompress = false;
1550 - if (filter_on_write && is_root_metadata && (!encryption || !encryption->getEncryptMetadata())) {  
1551 - filter = true;  
1552 - compress_stream = false;  
1553 - uncompress = true;  
1554 - } else if (filter_on_write && normalize_content && normalized_streams.contains(old_og)) {  
1555 - normalize = true;  
1556 - filter = true;  
1557 - } else if (filter_on_write && filter && compress_streams) {  
1558 - compress_stream = true; 1530 +
  1531 + if (stream.getFilterOnWrite()) {
  1532 + filter = stream.isDataModified() || compress_streams || stream_decode_level != qpdf_dl_none;
  1533 + if (compress_streams) {
  1534 + // Don't filter if the stream is already compressed with FlateDecode. This way we don't
  1535 + // make it worse if the original file used a better Flate algorithm, and we don't spend
  1536 + // time and CPU cycles uncompressing and recompressing stuff. This can be overridden
  1537 + // with setRecompressFlate(true).
  1538 + QPDFObjectHandle filter_obj = stream_dict.getKey("/Filter");
  1539 + if (!recompress_flate && !stream.isDataModified() && filter_obj.isName() &&
  1540 + (filter_obj.getName() == "/FlateDecode" || filter_obj.getName() == "/Fl")) {
  1541 + filter = false;
  1542 + }
  1543 + }
  1544 + if (is_root_metadata && (!encryption || !encryption->getEncryptMetadata())) {
  1545 + filter = true;
  1546 + compress_stream = false;
  1547 + uncompress = true;
  1548 + } else if (normalize_content && normalized_streams.contains(stream)) {
  1549 + normalize = true;
  1550 + filter = true;
  1551 + } else if (filter && compress_streams) {
  1552 + compress_stream = true;
  1553 + }
1559 } 1554 }
1560 1555
1561 // Disable compression for empty streams to improve compatibility 1556 // Disable compression for empty streams to improve compatibility