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