summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <jberkenbilt@users.noreply.github.com>2023-03-18 18:28:12 +0100
committerGitHub <noreply@github.com>2023-03-18 18:28:12 +0100
commitb480f7186ffa6a2f4fe3a477c2e95871a64b2169 (patch)
tree7a65c67e2d2944986ef40b4fc6009bbf247fe6a3
parent16f46703dc405368390023da6968356644a0b3b6 (diff)
parentb7791566f6645c621eec15f2cf1a8a8eec265f36 (diff)
downloadqpdf-b480f7186ffa6a2f4fe3a477c2e95871a64b2169.tar.zst
Merge pull request #928 from m-holger/wr_og
Add new data member QPDFWriter::Members::root_og
-rw-r--r--include/qpdf/QPDFWriter.hh89
-rw-r--r--libqpdf/QPDFWriter.cc58
2 files changed, 52 insertions, 95 deletions
diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh
index 464e20a0..c2896209 100644
--- a/include/qpdf/QPDFWriter.hh
+++ b/include/qpdf/QPDFWriter.hh
@@ -709,70 +709,71 @@ class QPDFWriter
Members(Members const&) = delete;
QPDF& pdf;
- char const* filename;
- FILE* file;
- bool close_file;
- Pl_Buffer* buffer_pipeline;
- Buffer* output_buffer;
- bool normalize_content_set;
- bool normalize_content;
- bool compress_streams;
- bool compress_streams_set;
- qpdf_stream_decode_level_e stream_decode_level;
- bool stream_decode_level_set;
- bool recompress_flate;
- bool qdf_mode;
- bool preserve_unreferenced_objects;
- bool newline_before_endstream;
- bool static_id;
- bool suppress_original_object_ids;
- bool direct_stream_lengths;
- bool encrypted;
- bool preserve_encryption;
- bool linearized;
- bool pclm;
- qpdf_object_stream_e object_stream_mode;
+ QPDFObjGen root_og{-1, 0};
+ char const* filename{"unspecified"};
+ FILE* file{nullptr};
+ bool close_file{false};
+ Pl_Buffer* buffer_pipeline{nullptr};
+ Buffer* output_buffer{nullptr};
+ bool normalize_content_set{false};
+ bool normalize_content{false};
+ bool compress_streams{true};
+ bool compress_streams_set{false};
+ qpdf_stream_decode_level_e stream_decode_level{qpdf_dl_none};
+ bool stream_decode_level_set{false};
+ bool recompress_flate{false};
+ bool qdf_mode{false};
+ bool preserve_unreferenced_objects{false};
+ bool newline_before_endstream{false};
+ bool static_id{false};
+ bool suppress_original_object_ids{false};
+ bool direct_stream_lengths{true};
+ bool encrypted{false};
+ bool preserve_encryption{true};
+ bool linearized{false};
+ bool pclm{false};
+ qpdf_object_stream_e object_stream_mode{qpdf_o_preserve};
std::string encryption_key;
- bool encrypt_metadata;
- bool encrypt_use_aes;
+ bool encrypt_metadata{true};
+ bool encrypt_use_aes{false};
std::map<std::string, std::string> encryption_dictionary;
- int encryption_V;
- int encryption_R;
+ int encryption_V{0};
+ int encryption_R{0};
std::string id1; // for /ID key of
std::string id2; // trailer dictionary
std::string final_pdf_version;
- int final_extension_level;
+ int final_extension_level{0};
std::string min_pdf_version;
- int min_extension_level;
+ int min_extension_level{0};
std::string forced_pdf_version;
- int forced_extension_level;
+ int forced_extension_level{0};
std::string extra_header_text;
- int encryption_dict_objid;
+ int encryption_dict_objid{0};
std::string cur_data_key;
std::list<std::shared_ptr<Pipeline>> to_delete;
- Pl_Count* pipeline;
+ Pl_Count* pipeline{nullptr};
std::vector<QPDFObjectHandle> object_queue;
size_t object_queue_front{0};
std::map<QPDFObjGen, int> obj_renumber;
std::map<int, QPDFXRefEntry> xref;
std::map<int, qpdf_offset_t> lengths;
- int next_objid;
- int cur_stream_length_id;
- size_t cur_stream_length;
- bool added_newline;
- int max_ostream_index;
+ int next_objid{1};
+ int cur_stream_length_id{0};
+ size_t cur_stream_length{0};
+ bool added_newline{false};
+ int max_ostream_index{0};
std::set<QPDFObjGen> normalized_streams;
std::map<QPDFObjGen, int> page_object_to_seq;
std::map<QPDFObjGen, int> contents_to_page_seq;
std::map<QPDFObjGen, int> object_to_object_stream;
std::map<int, std::set<QPDFObjGen>> object_stream_to_objects;
std::list<Pipeline*> pipeline_stack;
- unsigned long long next_stack_id;
- bool deterministic_id;
- Pl_MD5* md5_pipeline;
+ unsigned long long next_stack_id{0};
+ bool deterministic_id{false};
+ Pl_MD5* md5_pipeline{nullptr};
std::string deterministic_id_data;
- bool did_write_setup;
+ bool did_write_setup{false};
// For linearization only
std::string lin_pass1_filename;
@@ -781,9 +782,9 @@ class QPDFWriter
// For progress reporting
std::shared_ptr<ProgressReporter> progress_reporter;
- int events_expected;
- int events_seen;
- int next_progress_report;
+ int events_expected{0};
+ int events_seen{0};
+ int next_progress_report{0};
};
// Keep all member variables inside the Members object, which we
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index 907cc105..8287412c 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -52,50 +52,9 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress)
QPDFWriter::Members::Members(QPDF& pdf) :
pdf(pdf),
- filename("unspecified"),
- file(nullptr),
- close_file(false),
- buffer_pipeline(nullptr),
- output_buffer(nullptr),
- normalize_content_set(false),
- normalize_content(false),
- compress_streams(true),
- compress_streams_set(false),
- stream_decode_level(qpdf_dl_none),
- stream_decode_level_set(false),
- recompress_flate(false),
- qdf_mode(false),
- preserve_unreferenced_objects(false),
- newline_before_endstream(false),
- static_id(false),
- suppress_original_object_ids(false),
- direct_stream_lengths(true),
- encrypted(false),
- preserve_encryption(true),
- linearized(false),
- pclm(false),
- object_stream_mode(qpdf_o_preserve),
- encrypt_metadata(true),
- encrypt_use_aes(false),
- encryption_V(0),
- encryption_R(0),
- final_extension_level(0),
- min_extension_level(0),
- forced_extension_level(0),
- encryption_dict_objid(0),
- pipeline(nullptr),
- next_objid(1),
- cur_stream_length_id(0),
- cur_stream_length(0),
- added_newline(false),
- max_ostream_index(0),
- next_stack_id(0),
- deterministic_id(false),
- md5_pipeline(nullptr),
- did_write_setup(false),
- events_expected(0),
- events_seen(0),
- next_progress_report(0)
+ root_og(
+ pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen()
+ : QPDFObjGen(-1, 0))
{
}
@@ -1534,14 +1493,12 @@ QPDFWriter::unparseObject(
// is direct through the ADBE dictionary, so we can modify in
// place.
- bool is_root = false;
+ const bool is_root = (old_og == m->root_og);
bool have_extensions_other = false;
bool have_extensions_adbe = false;
QPDFObjectHandle extensions;
- if ((old_og.getObj() != 0) &&
- (old_og == this->m->pdf.getRoot().getObjGen())) {
- is_root = true;
+ if (is_root) {
if (object.hasKey("/Extensions") &&
object.getKey("/Extensions").isDictionary()) {
extensions = object.getKey("/Extensions");
@@ -2396,10 +2353,9 @@ QPDFWriter::doWriteSetup()
// 8.0.0 has a bug that prevents it from being able to handle
// encrypted files with compressed document catalogs, so we
// disable them in that case as well.
- QPDFObjGen og = this->m->pdf.getRoot().getObjGen();
- if (this->m->object_to_object_stream.count(og)) {
+ if (m->object_to_object_stream.count(m->root_og)) {
QTC::TC("qpdf", "QPDFWriter uncompressing root");
- this->m->object_to_object_stream.erase(og);
+ this->m->object_to_object_stream.erase(m->root_og);
}
}