Commit ef3a8025fb7664e2533c8380abe7ae96e581a0e9

Authored by m-holger
1 parent ccad589f

In QPDFWriter replace map lenghts with ObjTable new_obj

include/qpdf/QPDF.hh
@@ -744,14 +744,13 @@ class QPDF @@ -744,14 +744,13 @@ class QPDF
744 generateHintStream( 744 generateHintStream(
745 QPDF& qpdf, 745 QPDF& qpdf,
746 QPDFWriter::NewObjTable const& new_obj, 746 QPDFWriter::NewObjTable const& new_obj,
747 - std::map<int, qpdf_offset_t> const& lengths,  
748 QPDFWriter::ObjTable const& obj, 747 QPDFWriter::ObjTable const& obj,
749 std::shared_ptr<Buffer>& hint_stream, 748 std::shared_ptr<Buffer>& hint_stream,
750 int& S, 749 int& S,
751 int& O, 750 int& O,
752 bool compressed) 751 bool compressed)
753 { 752 {
754 - return qpdf.generateHintStream(new_obj, lengths, obj, hint_stream, S, O, compressed); 753 + return qpdf.generateHintStream(new_obj, obj, hint_stream, S, O, compressed);
755 } 754 }
756 755
757 static void 756 static void
@@ -1103,7 +1102,6 @@ class QPDF @@ -1103,7 +1102,6 @@ class QPDF
1103 1102
1104 void generateHintStream( 1103 void generateHintStream(
1105 QPDFWriter::NewObjTable const& new_obj, 1104 QPDFWriter::NewObjTable const& new_obj,
1106 - std::map<int, qpdf_offset_t> const& lengths,  
1107 QPDFWriter::ObjTable const& obj, 1105 QPDFWriter::ObjTable const& obj,
1108 std::shared_ptr<Buffer>& hint_stream, 1106 std::shared_ptr<Buffer>& hint_stream,
1109 int& S, 1107 int& S,
@@ -1378,20 +1376,13 @@ class QPDF @@ -1378,20 +1376,13 @@ class QPDF
1378 int outputLengthNextN( 1376 int outputLengthNextN(
1379 int in_object, 1377 int in_object,
1380 int n, 1378 int n,
1381 - std::map<int, qpdf_offset_t> const& lengths,  
1382 - QPDFWriter::ObjTable const& obj);  
1383 - void calculateHPageOffset(  
1384 - QPDFWriter::NewObjTable const& new_obj,  
1385 - std::map<int, qpdf_offset_t> const& lengths,  
1386 - QPDFWriter::ObjTable const& obj);  
1387 - void calculateHSharedObject(  
1388 QPDFWriter::NewObjTable const& new_obj, 1379 QPDFWriter::NewObjTable const& new_obj,
1389 - std::map<int, qpdf_offset_t> const& lengths,  
1390 - QPDFWriter::ObjTable const& obj);  
1391 - void calculateHOutline(  
1392 - QPDFWriter::NewObjTable const& new_obj,  
1393 - std::map<int, qpdf_offset_t> const& lengths,  
1394 QPDFWriter::ObjTable const& obj); 1380 QPDFWriter::ObjTable const& obj);
  1381 + void
  1382 + calculateHPageOffset(QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj);
  1383 + void
  1384 + calculateHSharedObject(QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj);
  1385 + void calculateHOutline(QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj);
1395 void writeHPageOffset(BitWriter&); 1386 void writeHPageOffset(BitWriter&);
1396 void writeHSharedObject(BitWriter&); 1387 void writeHSharedObject(BitWriter&);
1397 void writeHGeneric(BitWriter&, HGeneric&); 1388 void writeHGeneric(BitWriter&, HGeneric&);
libqpdf/QPDFWriter.cc
@@ -1050,7 +1050,8 @@ QPDFWriter::closeObject(int objid) @@ -1050,7 +1050,8 @@ QPDFWriter::closeObject(int objid)
1050 // Write a newline before endobj as it makes the file easier to repair. 1050 // Write a newline before endobj as it makes the file easier to repair.
1051 writeString("\nendobj\n"); 1051 writeString("\nendobj\n");
1052 writeStringQDF("\n"); 1052 writeStringQDF("\n");
1053 - m->lengths[objid] = m->pipeline->getCount() - m->new_obj[objid].xref.getOffset(); 1053 + auto& new_obj = m->new_obj[objid];
  1054 + new_obj.length = m->pipeline->getCount() - new_obj.xref.getOffset();
1054 } 1055 }
1055 1056
1056 void 1057 void
@@ -2309,8 +2310,7 @@ QPDFWriter::writeHintStream(int hint_id) @@ -2309,8 +2310,7 @@ QPDFWriter::writeHintStream(int hint_id)
2309 int S = 0; 2310 int S = 0;
2310 int O = 0; 2311 int O = 0;
2311 bool compressed = (m->compress_streams && !m->qdf_mode); 2312 bool compressed = (m->compress_streams && !m->qdf_mode);
2312 - QPDF::Writer::generateHintStream(  
2313 - m->pdf, m->new_obj, m->lengths, m->obj, hint_buffer, S, O, compressed); 2313 + QPDF::Writer::generateHintStream(m->pdf, m->new_obj, m->obj, hint_buffer, S, O, compressed);
2314 2314
2315 openObject(hint_id); 2315 openObject(hint_id);
2316 setDataKey(hint_id); 2316 setDataKey(hint_id);
libqpdf/QPDF_linearization.cc
@@ -1457,33 +1457,29 @@ nbits(int val) @@ -1457,33 +1457,29 @@ nbits(int val)
1457 1457
1458 int 1458 int
1459 QPDF::outputLengthNextN( 1459 QPDF::outputLengthNextN(
1460 - int in_object,  
1461 - int n,  
1462 - std::map<int, qpdf_offset_t> const& lengths,  
1463 - QPDFWriter::ObjTable const& obj) 1460 + int in_object, int n, QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj)
1464 { 1461 {
1465 // Figure out the length of a series of n consecutive objects in the output file starting with 1462 // Figure out the length of a series of n consecutive objects in the output file starting with
1466 // whatever object in_object from the input file mapped to. 1463 // whatever object in_object from the input file mapped to.
1467 1464
1468 int first = obj[in_object].renumber; 1465 int first = obj[in_object].renumber;
  1466 + int last = first + n;
1469 if (first <= 0) { 1467 if (first <= 0) {
1470 stopOnError("found object that is not renumbered while writing linearization data"); 1468 stopOnError("found object that is not renumbered while writing linearization data");
1471 } 1469 }
1472 - int length = 0;  
1473 - for (int i = 0; i < n; ++i) {  
1474 - if (lengths.count(first + i) == 0) { 1470 + qpdf_offset_t length = 0;
  1471 + for (int i = first; i < last; ++i) {
  1472 + auto l = new_obj[i].length;
  1473 + if (l == 0) {
1475 stopOnError("found item with unknown length while writing linearization data"); 1474 stopOnError("found item with unknown length while writing linearization data");
1476 } 1475 }
1477 - length += toI((*(lengths.find(first + toI(i)))).second); 1476 + length += l;
1478 } 1477 }
1479 - return length; 1478 + return toI(length);
1480 } 1479 }
1481 1480
1482 void 1481 void
1483 -QPDF::calculateHPageOffset(  
1484 - QPDFWriter::NewObjTable const& new_obj,  
1485 - std::map<int, qpdf_offset_t> const& lengths,  
1486 - QPDFWriter::ObjTable const& obj) 1482 +QPDF::calculateHPageOffset(QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj)
1487 { 1483 {
1488 // Page Offset Hint Table 1484 // Page Offset Hint Table
1489 1485
@@ -1498,7 +1494,7 @@ QPDF::calculateHPageOffset( @@ -1498,7 +1494,7 @@ QPDF::calculateHPageOffset(
1498 1494
1499 int min_nobjects = cphe.at(0).nobjects; 1495 int min_nobjects = cphe.at(0).nobjects;
1500 int max_nobjects = min_nobjects; 1496 int max_nobjects = min_nobjects;
1501 - int min_length = outputLengthNextN(pages.at(0).getObjectID(), min_nobjects, lengths, obj); 1497 + int min_length = outputLengthNextN(pages.at(0).getObjectID(), min_nobjects, new_obj, obj);
1502 int max_length = min_length; 1498 int max_length = min_length;
1503 int max_shared = cphe.at(0).nshared_objects; 1499 int max_shared = cphe.at(0).nshared_objects;
1504 1500
@@ -1515,7 +1511,7 @@ QPDF::calculateHPageOffset( @@ -1515,7 +1511,7 @@ QPDF::calculateHPageOffset(
1515 // assignments. 1511 // assignments.
1516 1512
1517 int nobjects = cphe.at(i).nobjects; 1513 int nobjects = cphe.at(i).nobjects;
1518 - int length = outputLengthNextN(pages.at(i).getObjectID(), nobjects, lengths, obj); 1514 + int length = outputLengthNextN(pages.at(i).getObjectID(), nobjects, new_obj, obj);
1519 int nshared = cphe.at(i).nshared_objects; 1515 int nshared = cphe.at(i).nshared_objects;
1520 1516
1521 min_nobjects = std::min(min_nobjects, nobjects); 1517 min_nobjects = std::min(min_nobjects, nobjects);
@@ -1565,9 +1561,7 @@ QPDF::calculateHPageOffset( @@ -1565,9 +1561,7 @@ QPDF::calculateHPageOffset(
1565 1561
1566 void 1562 void
1567 QPDF::calculateHSharedObject( 1563 QPDF::calculateHSharedObject(
1568 - QPDFWriter::NewObjTable const& new_obj,  
1569 - std::map<int, qpdf_offset_t> const& lengths,  
1570 - QPDFWriter::ObjTable const& obj) 1564 + QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj)
1571 { 1565 {
1572 CHSharedObject& cso = m->c_shared_object_data; 1566 CHSharedObject& cso = m->c_shared_object_data;
1573 std::vector<CHSharedObjectEntry>& csoe = cso.entries; 1567 std::vector<CHSharedObjectEntry>& csoe = cso.entries;
@@ -1575,12 +1569,12 @@ QPDF::calculateHSharedObject( @@ -1575,12 +1569,12 @@ QPDF::calculateHSharedObject(
1575 std::vector<HSharedObjectEntry>& soe = so.entries; 1569 std::vector<HSharedObjectEntry>& soe = so.entries;
1576 soe.clear(); 1570 soe.clear();
1577 1571
1578 - int min_length = outputLengthNextN(csoe.at(0).object, 1, lengths, obj); 1572 + int min_length = outputLengthNextN(csoe.at(0).object, 1, new_obj, obj);
1579 int max_length = min_length; 1573 int max_length = min_length;
1580 1574
1581 for (size_t i = 0; i < toS(cso.nshared_total); ++i) { 1575 for (size_t i = 0; i < toS(cso.nshared_total); ++i) {
1582 // Assign absolute numbers to deltas; adjust later 1576 // Assign absolute numbers to deltas; adjust later
1583 - int length = outputLengthNextN(csoe.at(i).object, 1, lengths, obj); 1577 + int length = outputLengthNextN(csoe.at(i).object, 1, new_obj, obj);
1584 min_length = std::min(min_length, length); 1578 min_length = std::min(min_length, length);
1585 max_length = std::max(max_length, length); 1579 max_length = std::max(max_length, length);
1586 soe.emplace_back(); 1580 soe.emplace_back();
@@ -1610,10 +1604,7 @@ QPDF::calculateHSharedObject( @@ -1610,10 +1604,7 @@ QPDF::calculateHSharedObject(
1610 } 1604 }
1611 1605
1612 void 1606 void
1613 -QPDF::calculateHOutline(  
1614 - QPDFWriter::NewObjTable const& new_obj,  
1615 - std::map<int, qpdf_offset_t> const& lengths,  
1616 - QPDFWriter::ObjTable const& obj) 1607 +QPDF::calculateHOutline(QPDFWriter::NewObjTable const& new_obj, QPDFWriter::ObjTable const& obj)
1617 { 1608 {
1618 HGeneric& cho = m->c_outline_data; 1609 HGeneric& cho = m->c_outline_data;
1619 1610
@@ -1626,7 +1617,7 @@ QPDF::calculateHOutline( @@ -1626,7 +1617,7 @@ QPDF::calculateHOutline(
1626 ho.first_object = obj[cho.first_object].renumber; 1617 ho.first_object = obj[cho.first_object].renumber;
1627 ho.first_object_offset = new_obj[ho.first_object].xref.getOffset(); 1618 ho.first_object_offset = new_obj[ho.first_object].xref.getOffset();
1628 ho.nobjects = cho.nobjects; 1619 ho.nobjects = cho.nobjects;
1629 - ho.group_length = outputLengthNextN(cho.first_object, ho.nobjects, lengths, obj); 1620 + ho.group_length = outputLengthNextN(cho.first_object, ho.nobjects, new_obj, obj);
1630 } 1621 }
1631 1622
1632 template <class T, class int_type> 1623 template <class T, class int_type>
@@ -1756,7 +1747,6 @@ QPDF::writeHGeneric(BitWriter&amp; w, HGeneric&amp; t) @@ -1756,7 +1747,6 @@ QPDF::writeHGeneric(BitWriter&amp; w, HGeneric&amp; t)
1756 void 1747 void
1757 QPDF::generateHintStream( 1748 QPDF::generateHintStream(
1758 QPDFWriter::NewObjTable const& new_obj, 1749 QPDFWriter::NewObjTable const& new_obj,
1759 - std::map<int, qpdf_offset_t> const& lengths,  
1760 QPDFWriter::ObjTable const& obj, 1750 QPDFWriter::ObjTable const& obj,
1761 std::shared_ptr<Buffer>& hint_buffer, 1751 std::shared_ptr<Buffer>& hint_buffer,
1762 int& S, 1752 int& S,
@@ -1764,9 +1754,9 @@ QPDF::generateHintStream( @@ -1764,9 +1754,9 @@ QPDF::generateHintStream(
1764 bool compressed) 1754 bool compressed)
1765 { 1755 {
1766 // Populate actual hint table values 1756 // Populate actual hint table values
1767 - calculateHPageOffset(new_obj, lengths, obj);  
1768 - calculateHSharedObject(new_obj, lengths, obj);  
1769 - calculateHOutline(new_obj, lengths, obj); 1757 + calculateHPageOffset(new_obj, obj);
  1758 + calculateHSharedObject(new_obj, obj);
  1759 + calculateHOutline(new_obj, obj);
1770 1760
1771 // Write the hint stream itself into a compressed memory buffer. Write through a counter so we 1761 // Write the hint stream itself into a compressed memory buffer. Write through a counter so we
1772 // can get offsets. 1762 // can get offsets.
libqpdf/qpdf/QPDFWriter_private.hh
@@ -18,6 +18,7 @@ struct QPDFWriter::Object @@ -18,6 +18,7 @@ struct QPDFWriter::Object
18 struct QPDFWriter::NewObject 18 struct QPDFWriter::NewObject
19 { 19 {
20 QPDFXRefEntry xref; 20 QPDFXRefEntry xref;
  21 + qpdf_offset_t length{0};
21 }; 22 };
22 23
23 class QPDFWriter::ObjTable: public ::ObjTable<QPDFWriter::Object> 24 class QPDFWriter::ObjTable: public ::ObjTable<QPDFWriter::Object>
@@ -102,7 +103,6 @@ class QPDFWriter::Members @@ -102,7 +103,6 @@ class QPDFWriter::Members
102 size_t object_queue_front{0}; 103 size_t object_queue_front{0};
103 QPDFWriter::ObjTable obj; 104 QPDFWriter::ObjTable obj;
104 QPDFWriter::NewObjTable new_obj; 105 QPDFWriter::NewObjTable new_obj;
105 - std::map<int, qpdf_offset_t> lengths;  
106 int next_objid{1}; 106 int next_objid{1};
107 int cur_stream_length_id{0}; 107 int cur_stream_length_id{0};
108 size_t cur_stream_length{0}; 108 size_t cur_stream_length{0};