Commit 1457c42181b55de6939cbb384dee47c5d86e503f
1 parent
a5ec9dc0
Refactor stream compression logic in `QPDFWriter` to simplify pipeline activatio…
…n and improve separation of concerns.
Showing
1 changed file
with
15 additions
and
23 deletions
libqpdf/QPDFWriter.cc
| @@ -1768,7 +1768,6 @@ QPDFWriter::writeObjectStream(QPDFObjectHandle object) | @@ -1768,7 +1768,6 @@ QPDFWriter::writeObjectStream(QPDFObjectHandle object) | ||
| 1768 | } | 1768 | } |
| 1769 | } | 1769 | } |
| 1770 | { | 1770 | { |
| 1771 | - auto pp_ostream = m->pipeline_stack.popper(); | ||
| 1772 | // Adjust offsets to skip over comment before first object | 1771 | // Adjust offsets to skip over comment before first object |
| 1773 | first = offsets.at(0); | 1772 | first = offsets.at(0); |
| 1774 | for (auto& iter: offsets) { | 1773 | for (auto& iter: offsets) { |
| @@ -1783,18 +1782,15 @@ QPDFWriter::writeObjectStream(QPDFObjectHandle object) | @@ -1783,18 +1782,15 @@ QPDFWriter::writeObjectStream(QPDFObjectHandle object) | ||
| 1783 | } | 1782 | } |
| 1784 | 1783 | ||
| 1785 | // Set up a stream to write the stream data into a buffer. | 1784 | // Set up a stream to write the stream data into a buffer. |
| 1786 | - if (compressed) { | ||
| 1787 | - m->pipeline_stack.activate( | ||
| 1788 | - pp_ostream, | ||
| 1789 | - pl::create<Pl_Flate>( | ||
| 1790 | - pl::create<pl::String>(stream_buffer_pass2), Pl_Flate::a_deflate)); | ||
| 1791 | - } else { | ||
| 1792 | - m->pipeline_stack.activate(pp_ostream, stream_buffer_pass2); | ||
| 1793 | - } | 1785 | + auto pp_ostream = m->pipeline_stack.activate(stream_buffer_pass2); |
| 1786 | + | ||
| 1794 | writeObjectStreamOffsets(offsets, first_obj); | 1787 | writeObjectStreamOffsets(offsets, first_obj); |
| 1795 | write(stream_buffer_pass1); | 1788 | write(stream_buffer_pass1); |
| 1796 | stream_buffer_pass1.clear(); | 1789 | stream_buffer_pass1.clear(); |
| 1797 | stream_buffer_pass1.shrink_to_fit(); | 1790 | stream_buffer_pass1.shrink_to_fit(); |
| 1791 | + if (compressed) { | ||
| 1792 | + stream_buffer_pass2 = pl::pipe<Pl_Flate>(stream_buffer_pass2, Pl_Flate::a_deflate); | ||
| 1793 | + } | ||
| 1798 | } | 1794 | } |
| 1799 | 1795 | ||
| 1800 | // Write the object | 1796 | // Write the object |
| @@ -2528,20 +2524,7 @@ QPDFWriter::writeXRefStream( | @@ -2528,20 +2524,7 @@ QPDFWriter::writeXRefStream( | ||
| 2528 | std::string xref_data; | 2524 | std::string xref_data; |
| 2529 | const bool compressed = m->compress_streams && !m->qdf_mode; | 2525 | const bool compressed = m->compress_streams && !m->qdf_mode; |
| 2530 | { | 2526 | { |
| 2531 | - auto pp_xref = m->pipeline_stack.popper(); | ||
| 2532 | - if (compressed) { | ||
| 2533 | - m->pipeline_stack.clear_buffer(); | ||
| 2534 | - auto link = pl::create<pl::String>(xref_data); | ||
| 2535 | - if (!skip_compression) { | ||
| 2536 | - // Write the stream dictionary for compression but don't actually compress. This | ||
| 2537 | - // helps us with computation of padding for pass 1 of linearization. | ||
| 2538 | - link = pl::create<Pl_Flate>(std::move(link), Pl_Flate::a_deflate); | ||
| 2539 | - } | ||
| 2540 | - m->pipeline_stack.activate( | ||
| 2541 | - pp_xref, pl::create<Pl_PNGFilter>(std::move(link), Pl_PNGFilter::a_encode, esize)); | ||
| 2542 | - } else { | ||
| 2543 | - m->pipeline_stack.activate(pp_xref, xref_data); | ||
| 2544 | - } | 2527 | + auto pp_xref = m->pipeline_stack.activate(xref_data); |
| 2545 | 2528 | ||
| 2546 | for (int i = first; i <= last; ++i) { | 2529 | for (int i = first; i <= last; ++i) { |
| 2547 | QPDFXRefEntry& e = m->new_obj[i].xref; | 2530 | QPDFXRefEntry& e = m->new_obj[i].xref; |
| @@ -2577,6 +2560,15 @@ QPDFWriter::writeXRefStream( | @@ -2577,6 +2560,15 @@ QPDFWriter::writeXRefStream( | ||
| 2577 | } | 2560 | } |
| 2578 | } | 2561 | } |
| 2579 | 2562 | ||
| 2563 | + if (compressed) { | ||
| 2564 | + xref_data = pl::pipe<Pl_PNGFilter>(xref_data, Pl_PNGFilter::a_encode, esize); | ||
| 2565 | + if (!skip_compression) { | ||
| 2566 | + // Write the stream dictionary for compression but don't actually compress. This | ||
| 2567 | + // helps us with computation of padding for pass 1 of linearization. | ||
| 2568 | + xref_data = pl::pipe<Pl_Flate>(xref_data, Pl_Flate::a_deflate); | ||
| 2569 | + } | ||
| 2570 | + } | ||
| 2571 | + | ||
| 2580 | openObject(xref_id); | 2572 | openObject(xref_id); |
| 2581 | write("<<").write_qdf("\n ").write(" /Type /XRef").write_qdf("\n "); | 2573 | write("<<").write_qdf("\n ").write(" /Type /XRef").write_qdf("\n "); |
| 2582 | write(" /Length ").write(xref_data.size()); | 2574 | write(" /Length ").write(xref_data.size()); |