Commit 8d4de78704367b213232c0567bdd7acd2fe2e767
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 | 1520 | QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* stream_data) |
| 1521 | 1521 | { |
| 1522 | 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 | 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 | 1528 | bool normalize = false; |
| 1549 | 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 | 1556 | // Disable compression for empty streams to improve compatibility | ... | ... |