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