From ebd5ed63decb90e26ae9129164214f9d7d684621 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 31 Jan 2018 16:45:52 -0500 Subject: Add option to save pass 1 of lineariziation This is useful only for debugging the linearization code. --- libqpdf/QPDFWriter.cc | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'libqpdf/QPDFWriter.cc') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 05446400..f7f834b5 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -356,6 +356,12 @@ QPDFWriter::setLinearization(bool val) } } +void +QPDFWriter::setLinearizationPass1Filename(std::string const& filename) +{ + this->m->lin_pass1_filename = filename; +} + void QPDFWriter::setPCLm(bool val) { @@ -2957,11 +2963,24 @@ QPDFWriter::writeLinearized() // Write file in two passes. Part numbers refer to PDF spec 1.4. + FILE* lin_pass1_file = 0; for (int pass = 1; pass <= 2; ++pass) { if (pass == 1) { - pushDiscardFilter(); + if (! this->m->lin_pass1_filename.empty()) + { + lin_pass1_file = + QUtil::safe_fopen( + this->m->lin_pass1_filename.c_str(), "wb"); + pushPipeline( + new Pl_StdioFile("linearization pass1", lin_pass1_file)); + activatePipelineStack(); + } + else + { + pushDiscardFilter(); + } if (this->m->deterministic_id) { pushMD5Pipeline(); @@ -3201,6 +3220,20 @@ QPDFWriter::writeLinearized() // Restore hint offset this->m->xref[hint_id] = QPDFXRefEntry(1, hint_offset, 0); + if (lin_pass1_file) + { + // Write some debugging information + fprintf(lin_pass1_file, "%% hint_offset=%s\n", + QUtil::int_to_string(hint_offset).c_str()); + fprintf(lin_pass1_file, "%% hint_length=%s\n", + QUtil::int_to_string(hint_length).c_str()); + fprintf(lin_pass1_file, "%% second_xref_offset=%s\n", + QUtil::int_to_string(second_xref_offset).c_str()); + fprintf(lin_pass1_file, "%% second_xref_end=%s\n", + QUtil::int_to_string(second_xref_end).c_str()); + fclose(lin_pass1_file); + lin_pass1_file = 0; + } } } } -- cgit v1.2.3-54-g00ecf