Commit 47cf4e3a50e8bdc392a68dcf11a15ccb6a348df0

Authored by m-holger
1 parent 2fa93e79

In QPDFWriter change object_stream_to_objects to a map of vectors.

libqpdf/QPDFWriter.cc
... ... @@ -2179,12 +2179,14 @@ QPDFWriter::doWriteSetup()
2179 2179 // Generate reverse mapping from object stream to objects
2180 2180 m->obj.forEach([this](auto id, auto const& item) -> void {
2181 2181 if (item.object_stream > 0) {
2182   - m->object_stream_to_objects[item.object_stream].insert(QPDFObjGen(id, item.gen));
2183   - m->max_ostream_index = std::max(
2184   - m->max_ostream_index,
2185   - QIntC::to_int(m->object_stream_to_objects[item.object_stream].size()) - 1);
  2182 + auto& vec = m->object_stream_to_objects[item.object_stream];
  2183 + vec.emplace_back(id, item.gen);
  2184 + if (m->max_ostream_index < vec.size()) {
  2185 + ++m->max_ostream_index;
  2186 + }
2186 2187 }
2187 2188 });
  2189 + --m->max_ostream_index;
2188 2190  
2189 2191 if (m->object_stream_to_objects.empty()) {
2190 2192 m->obj.streams_empty = true;
... ... @@ -2431,7 +2433,7 @@ QPDFWriter::writeXRefStream(
2431 2433 unsigned int f1_size = std::max(bytesNeeded(max_offset + hint_length), bytesNeeded(max_id));
2432 2434  
2433 2435 // field 2 contains object stream indices
2434   - unsigned int f2_size = bytesNeeded(m->max_ostream_index);
  2436 + unsigned int f2_size = bytesNeeded(QIntC::to_longlong(m->max_ostream_index));
2435 2437  
2436 2438 unsigned int esize = 1 + f1_size + f2_size;
2437 2439  
... ...
libqpdf/qpdf/QPDFWriter_private.hh
... ... @@ -97,11 +97,11 @@ class QPDFWriter::Members
97 97 int cur_stream_length_id{0};
98 98 size_t cur_stream_length{0};
99 99 bool added_newline{false};
100   - int max_ostream_index{0};
  100 + size_t max_ostream_index{0};
101 101 std::set<QPDFObjGen> normalized_streams;
102 102 std::map<QPDFObjGen, int> page_object_to_seq;
103 103 std::map<QPDFObjGen, int> contents_to_page_seq;
104   - std::map<int, std::set<QPDFObjGen>> object_stream_to_objects;
  104 + std::map<int, std::vector<QPDFObjGen>> object_stream_to_objects;
105 105 std::list<Pipeline*> pipeline_stack;
106 106 unsigned long long next_stack_id{0};
107 107 bool deterministic_id{false};
... ...