Commit 172ab474ab7ac5f6f6a5c0b73e53618ca997270b
1 parent
edefc896
Refactor `QPDFWriter::Members::will_filter_stream`: consolidate decoding and enc…
…oding flags, streamline filter logic, and simplify condition handling.
Showing
1 changed file
with
11 additions
and
17 deletions
libqpdf/QPDFWriter.cc
| ... | ... | @@ -1519,17 +1519,14 @@ QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream) |
| 1519 | 1519 | std::tuple<const bool, const bool, const bool> |
| 1520 | 1520 | QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* stream_data) |
| 1521 | 1521 | { |
| 1522 | - bool compress_stream = false; | |
| 1523 | 1522 | const bool is_root_metadata = stream.isRootMetadata(); |
| 1524 | - | |
| 1525 | - Dictionary stream_dict = stream.getDict(); | |
| 1526 | - | |
| 1527 | 1523 | bool filter = false; |
| 1528 | - bool normalize = false; | |
| 1529 | - bool uncompress = false; | |
| 1524 | + auto decode_level = stream_decode_level; | |
| 1525 | + int encode_flags = 0; | |
| 1526 | + Dictionary stream_dict = stream.getDict(); | |
| 1530 | 1527 | |
| 1531 | 1528 | if (stream.getFilterOnWrite()) { |
| 1532 | - filter = stream.isDataModified() || compress_streams || stream_decode_level != qpdf_dl_none; | |
| 1529 | + filter = stream.isDataModified() || compress_streams || decode_level != qpdf_dl_none; | |
| 1533 | 1530 | if (compress_streams) { |
| 1534 | 1531 | // Don't filter if the stream is already compressed with FlateDecode. This way we don't |
| 1535 | 1532 | // make it worse if the original file used a better Flate algorithm, and we don't spend |
| ... | ... | @@ -1543,20 +1540,19 @@ QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* st |
| 1543 | 1540 | } |
| 1544 | 1541 | if (is_root_metadata && (!encryption || !encryption->getEncryptMetadata())) { |
| 1545 | 1542 | filter = true; |
| 1546 | - compress_stream = false; | |
| 1547 | - uncompress = true; | |
| 1543 | + decode_level = qpdf_dl_all; | |
| 1548 | 1544 | } else if (normalize_content && normalized_streams.contains(stream)) { |
| 1549 | - normalize = true; | |
| 1545 | + encode_flags = qpdf_ef_normalize; | |
| 1550 | 1546 | filter = true; |
| 1551 | 1547 | } else if (filter && compress_streams) { |
| 1552 | - compress_stream = true; | |
| 1548 | + encode_flags = qpdf_ef_compress; | |
| 1553 | 1549 | } |
| 1554 | 1550 | } |
| 1555 | 1551 | |
| 1556 | 1552 | // Disable compression for empty streams to improve compatibility |
| 1557 | 1553 | if (Integer(stream_dict["/Length"]) == 0) { |
| 1558 | 1554 | filter = true; |
| 1559 | - compress_stream = false; | |
| 1555 | + encode_flags = 0; | |
| 1560 | 1556 | } |
| 1561 | 1557 | |
| 1562 | 1558 | bool filtered = false; |
| ... | ... | @@ -1567,10 +1563,8 @@ QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* st |
| 1567 | 1563 | try { |
| 1568 | 1564 | filtered = stream.pipeStreamData( |
| 1569 | 1565 | pipeline, |
| 1570 | - !filter ? 0 | |
| 1571 | - : ((normalize ? qpdf_ef_normalize : 0) | | |
| 1572 | - (compress_stream ? qpdf_ef_compress : 0)), | |
| 1573 | - !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : stream_decode_level), | |
| 1566 | + filter ? encode_flags : 0, | |
| 1567 | + filter ? decode_level : qpdf_dl_none, | |
| 1574 | 1568 | false, |
| 1575 | 1569 | first_attempt); |
| 1576 | 1570 | if (filter && !filtered) { |
| ... | ... | @@ -1598,7 +1592,7 @@ QPDFWriter::Members::will_filter_stream(QPDFObjectHandle stream, std::string* st |
| 1598 | 1592 | if (!filtered) { |
| 1599 | 1593 | return {false, false, is_root_metadata}; |
| 1600 | 1594 | } |
| 1601 | - return {filtered, compress_stream, is_root_metadata}; | |
| 1595 | + return {filtered, encode_flags & qpdf_ef_compress, is_root_metadata}; | |
| 1602 | 1596 | } |
| 1603 | 1597 | |
| 1604 | 1598 | void | ... | ... |