Commit 96eb96511557469d50bbd55d211ced16acc31e13
1 parent
5039da0b
Use QPDFObjectHandle::getObjGen() where appropriate
In internal code and examples, replace calls to getObjectID() and getGeneration() with calls to getObjGen() where possible.
Showing
11 changed files
with
87 additions
and
68 deletions
examples/pdf-bookmarks.cc
| ... | ... | @@ -9,7 +9,7 @@ static char const* whoami = 0; |
| 9 | 9 | static enum { st_none, st_numbers, st_lines } style = st_none; |
| 10 | 10 | static bool show_open = false; |
| 11 | 11 | static bool show_targets = false; |
| 12 | -static std::map<int, int> page_map; | |
| 12 | +static std::map<QPDFObjGen, int> page_map; | |
| 13 | 13 | |
| 14 | 14 | void usage() |
| 15 | 15 | { |
| ... | ... | @@ -50,7 +50,7 @@ void generate_page_map(QPDF& qpdf) |
| 50 | 50 | iter != pages.end(); ++iter) |
| 51 | 51 | { |
| 52 | 52 | QPDFObjectHandle& oh = *iter; |
| 53 | - page_map[oh.getObjectID()] = ++n; | |
| 53 | + page_map[oh.getObjGen()] = ++n; | |
| 54 | 54 | } |
| 55 | 55 | } |
| 56 | 56 | |
| ... | ... | @@ -121,10 +121,10 @@ void extract_bookmarks(QPDFObjectHandle outlines, std::vector<int>& numbers) |
| 121 | 121 | if ((dest.isArray()) && (dest.getArrayNItems() > 0)) |
| 122 | 122 | { |
| 123 | 123 | QPDFObjectHandle first = dest.getArrayItem(0); |
| 124 | - int object_id = first.getObjectID(); | |
| 125 | - if (page_map.count(object_id)) | |
| 124 | + QPDFObjGen og = first.getObjGen(); | |
| 125 | + if (page_map.count(og)) | |
| 126 | 126 | { |
| 127 | - target = QUtil::int_to_string(page_map[object_id]); | |
| 127 | + target = QUtil::int_to_string(page_map[og]); | |
| 128 | 128 | } |
| 129 | 129 | } |
| 130 | 130 | ... | ... |
examples/pdf-invert-images.cc
| ... | ... | @@ -34,10 +34,10 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider |
| 34 | 34 | virtual void provideStreamData(int objid, int generation, |
| 35 | 35 | Pipeline* pipeline); |
| 36 | 36 | |
| 37 | - // Map [obj][gen] = image object | |
| 38 | - std::map<int, std::map<int, QPDFObjectHandle> > image_objects; | |
| 39 | - // Map [obj][gen] = image data | |
| 40 | - std::map<int, std::map<int, PointerHolder<Buffer> > > image_data; | |
| 37 | + // Map [og] = image object | |
| 38 | + std::map<QPDFObjGen, QPDFObjectHandle> image_objects; | |
| 39 | + // Map [og] = image data | |
| 40 | + std::map<QPDFObjGen, PointerHolder<Buffer> > image_data; | |
| 41 | 41 | }; |
| 42 | 42 | |
| 43 | 43 | void |
| ... | ... | @@ -47,7 +47,8 @@ ImageInverter::provideStreamData(int objid, int generation, |
| 47 | 47 | // Use the object and generation number supplied to look up the |
| 48 | 48 | // image data. Then invert the image data and write the inverted |
| 49 | 49 | // data to the pipeline. |
| 50 | - PointerHolder<Buffer> data = this->image_data[objid][generation]; | |
| 50 | + PointerHolder<Buffer> data = | |
| 51 | + this->image_data[QPDFObjGen(objid, generation)]; | |
| 51 | 52 | size_t size = data->getSize(); |
| 52 | 53 | unsigned char* buf = data->getBuffer(); |
| 53 | 54 | unsigned char ch; |
| ... | ... | @@ -120,12 +121,11 @@ int main(int argc, char* argv[]) |
| 120 | 121 | // Store information about the images based on the |
| 121 | 122 | // object and generation number. Recall that a single |
| 122 | 123 | // image object may be used more than once. |
| 123 | - int objid = image.getObjectID(); | |
| 124 | - int gen = image.getGeneration(); | |
| 125 | - if (inv->image_objects[objid].count(gen) == 0) | |
| 124 | + QPDFObjGen og = image.getObjGen(); | |
| 125 | + if (inv->image_objects.count(og) == 0) | |
| 126 | 126 | { |
| 127 | - inv->image_objects[objid][gen] = image; | |
| 128 | - inv->image_data[objid][gen] = image.getStreamData(); | |
| 127 | + inv->image_objects[og] = image; | |
| 128 | + inv->image_data[og] = image.getStreamData(); | |
| 129 | 129 | |
| 130 | 130 | // Register our stream data provider for this |
| 131 | 131 | // stream. Future calls to getStreamData or | ... | ... |
include/qpdf/QPDF.hh
| ... | ... | @@ -159,6 +159,8 @@ class QPDF |
| 159 | 159 | // Retrieve an object by object ID and generation. Returns an |
| 160 | 160 | // indirect reference to it. |
| 161 | 161 | QPDF_DLL |
| 162 | + QPDFObjectHandle getObjectByObjGen(QPDFObjGen const&); | |
| 163 | + QPDF_DLL | |
| 162 | 164 | QPDFObjectHandle getObjectByID(int objid, int generation); |
| 163 | 165 | |
| 164 | 166 | // Replace the object with the given object id with the given |
| ... | ... | @@ -175,6 +177,8 @@ class QPDF |
| 175 | 177 | // object. To replace a reserved object, call replaceReserved |
| 176 | 178 | // instead. |
| 177 | 179 | QPDF_DLL |
| 180 | + void replaceObject(QPDFObjGen const& og, QPDFObjectHandle); | |
| 181 | + QPDF_DLL | |
| 178 | 182 | void replaceObject(int objid, int generation, QPDFObjectHandle); |
| 179 | 183 | |
| 180 | 184 | // Swap two objects given by ID. Calling this method can have |
| ... | ... | @@ -189,6 +193,8 @@ class QPDF |
| 189 | 193 | // to the swapped objects with new ones, possibly by calling |
| 190 | 194 | // getObjectByID. |
| 191 | 195 | QPDF_DLL |
| 196 | + void swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2); | |
| 197 | + QPDF_DLL | |
| 192 | 198 | void swapObjects(int objid1, int generation1, |
| 193 | 199 | int objid2, int generation2); |
| 194 | 200 | |
| ... | ... | @@ -623,7 +629,7 @@ class QPDF |
| 623 | 629 | void getAllPagesInternal(QPDFObjectHandle cur_pages, |
| 624 | 630 | std::vector<QPDFObjectHandle>& result); |
| 625 | 631 | void insertPage(QPDFObjectHandle newpage, int pos); |
| 626 | - int findPage(int objid, int generation); | |
| 632 | + int findPage(QPDFObjGen const& og); | |
| 627 | 633 | int findPage(QPDFObjectHandle& page); |
| 628 | 634 | void flattenPagesTree(); |
| 629 | 635 | void insertPageobjToPage(QPDFObjectHandle const& obj, int pos, | ... | ... |
include/qpdf/QPDFObjGen.hh
libqpdf/QPDF.cc
| ... | ... | @@ -1574,12 +1574,24 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) |
| 1574 | 1574 | } |
| 1575 | 1575 | |
| 1576 | 1576 | QPDFObjectHandle |
| 1577 | +QPDF::getObjectByObjGen(QPDFObjGen const& og) | |
| 1578 | +{ | |
| 1579 | + return getObjectByID(og.getObj(), og.getGen()); | |
| 1580 | +} | |
| 1581 | + | |
| 1582 | +QPDFObjectHandle | |
| 1577 | 1583 | QPDF::getObjectByID(int objid, int generation) |
| 1578 | 1584 | { |
| 1579 | 1585 | return QPDFObjectHandle::Factory::newIndirect(this, objid, generation); |
| 1580 | 1586 | } |
| 1581 | 1587 | |
| 1582 | 1588 | void |
| 1589 | +QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) | |
| 1590 | +{ | |
| 1591 | + replaceObject(og.getObj(), og.getGen(), oh); | |
| 1592 | +} | |
| 1593 | + | |
| 1594 | +void | |
| 1583 | 1595 | QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh) |
| 1584 | 1596 | { |
| 1585 | 1597 | if (oh.isIndirect()) |
| ... | ... | @@ -1604,9 +1616,7 @@ QPDF::replaceReserved(QPDFObjectHandle reserved, |
| 1604 | 1616 | { |
| 1605 | 1617 | QTC::TC("qpdf", "QPDF replaceReserved"); |
| 1606 | 1618 | reserved.assertReserved(); |
| 1607 | - replaceObject(reserved.getObjectID(), | |
| 1608 | - reserved.getGeneration(), | |
| 1609 | - replacement); | |
| 1619 | + replaceObject(reserved.getObjGen(), replacement); | |
| 1610 | 1620 | } |
| 1611 | 1621 | |
| 1612 | 1622 | QPDFObjectHandle |
| ... | ... | @@ -1663,14 +1673,13 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) |
| 1663 | 1673 | replaceForeignIndirectObjects(to_copy, obj_copier, true); |
| 1664 | 1674 | if (! to_copy.isStream()) |
| 1665 | 1675 | { |
| 1666 | - QPDFObjGen og(to_copy.getObjectID(), to_copy.getGeneration()); | |
| 1676 | + QPDFObjGen og(to_copy.getObjGen()); | |
| 1667 | 1677 | replaceReserved(obj_copier.object_map[og], copy); |
| 1668 | 1678 | } |
| 1669 | 1679 | } |
| 1670 | 1680 | obj_copier.to_copy.clear(); |
| 1671 | 1681 | |
| 1672 | - return obj_copier.object_map[QPDFObjGen(foreign.getObjectID(), | |
| 1673 | - foreign.getGeneration())]; | |
| 1682 | + return obj_copier.object_map[foreign.getObjGen()]; | |
| 1674 | 1683 | } |
| 1675 | 1684 | |
| 1676 | 1685 | void |
| ... | ... | @@ -1697,7 +1706,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, |
| 1697 | 1706 | |
| 1698 | 1707 | if (foreign.isIndirect()) |
| 1699 | 1708 | { |
| 1700 | - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); | |
| 1709 | + QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 1701 | 1710 | if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) |
| 1702 | 1711 | { |
| 1703 | 1712 | QTC::TC("qpdf", "QPDF loop reserving objects"); |
| ... | ... | @@ -1750,7 +1759,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, |
| 1750 | 1759 | |
| 1751 | 1760 | if (foreign.isIndirect()) |
| 1752 | 1761 | { |
| 1753 | - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); | |
| 1762 | + QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 1754 | 1763 | obj_copier.visiting.erase(foreign_og); |
| 1755 | 1764 | } |
| 1756 | 1765 | } |
| ... | ... | @@ -1763,7 +1772,7 @@ QPDF::replaceForeignIndirectObjects( |
| 1763 | 1772 | if ((! top) && foreign.isIndirect()) |
| 1764 | 1773 | { |
| 1765 | 1774 | QTC::TC("qpdf", "QPDF replace indirect"); |
| 1766 | - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); | |
| 1775 | + QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 1767 | 1776 | std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping = |
| 1768 | 1777 | obj_copier.object_map.find(foreign_og); |
| 1769 | 1778 | if (mapping == obj_copier.object_map.end()) |
| ... | ... | @@ -1807,7 +1816,7 @@ QPDF::replaceForeignIndirectObjects( |
| 1807 | 1816 | else if (foreign.isStream()) |
| 1808 | 1817 | { |
| 1809 | 1818 | QTC::TC("qpdf", "QPDF replace stream"); |
| 1810 | - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); | |
| 1819 | + QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 1811 | 1820 | result = obj_copier.object_map[foreign_og]; |
| 1812 | 1821 | result.assertStream(); |
| 1813 | 1822 | QPDFObjectHandle dict = result.getDict(); |
| ... | ... | @@ -1826,7 +1835,7 @@ QPDF::replaceForeignIndirectObjects( |
| 1826 | 1835 | this->copied_stream_data_provider = new CopiedStreamDataProvider(); |
| 1827 | 1836 | this->copied_streams = this->copied_stream_data_provider; |
| 1828 | 1837 | } |
| 1829 | - QPDFObjGen local_og(result.getObjectID(), result.getGeneration()); | |
| 1838 | + QPDFObjGen local_og(result.getObjGen()); | |
| 1830 | 1839 | this->copied_stream_data_provider->registerForeignStream( |
| 1831 | 1840 | local_og, foreign); |
| 1832 | 1841 | result.replaceStreamData(this->copied_streams, |
| ... | ... | @@ -1849,6 +1858,12 @@ QPDF::replaceForeignIndirectObjects( |
| 1849 | 1858 | } |
| 1850 | 1859 | |
| 1851 | 1860 | void |
| 1861 | +QPDF::swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2) | |
| 1862 | +{ | |
| 1863 | + swapObjects(og1.getObj(), og1.getGen(), og2.getObj(), og2.getGen()); | |
| 1864 | +} | |
| 1865 | + | |
| 1866 | +void | |
| 1852 | 1867 | QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2) |
| 1853 | 1868 | { |
| 1854 | 1869 | // Force objects to be loaded into cache; then swap them in the |
| ... | ... | @@ -2101,8 +2116,7 @@ QPDF::findAttachmentStreams() |
| 2101 | 2116 | item.getKey("/EF").getKey("/F").isStream()) |
| 2102 | 2117 | { |
| 2103 | 2118 | QPDFObjectHandle stream = item.getKey("/EF").getKey("/F"); |
| 2104 | - this->attachment_streams.insert( | |
| 2105 | - QPDFObjGen(stream.getObjectID(), stream.getGeneration())); | |
| 2119 | + this->attachment_streams.insert(stream.getObjGen()); | |
| 2106 | 2120 | } |
| 2107 | 2121 | } |
| 2108 | 2122 | } | ... | ... |
libqpdf/QPDFObjGen.cc
| ... | ... | @@ -13,6 +13,12 @@ QPDFObjGen::operator<(QPDFObjGen const& rhs) const |
| 13 | 13 | ((this->obj == rhs.obj) && (this->gen < rhs.gen))); |
| 14 | 14 | } |
| 15 | 15 | |
| 16 | +bool | |
| 17 | +QPDFObjGen::operator==(QPDFObjGen const& rhs) const | |
| 18 | +{ | |
| 19 | + return ((this->obj == rhs.obj) && (this->gen == rhs.gen)); | |
| 20 | +} | |
| 21 | + | |
| 16 | 22 | int |
| 17 | 23 | QPDFObjGen::getObj() const |
| 18 | 24 | { | ... | ... |
libqpdf/QPDF_linearization.cc
| ... | ... | @@ -336,9 +336,7 @@ QPDF::readHintStream(Pipeline& pl, qpdf_offset_t offset, size_t length) |
| 336 | 336 | QTC::TC("qpdf", "QPDF hint table length indirect"); |
| 337 | 337 | // Force resolution |
| 338 | 338 | (void) length_obj.getIntValue(); |
| 339 | - ObjCache& oc = this->obj_cache | |
| 340 | - [QPDFObjGen(length_obj.getObjectID(), | |
| 341 | - length_obj.getGeneration())]; | |
| 339 | + ObjCache& oc = this->obj_cache[length_obj.getObjGen()]; | |
| 342 | 340 | min_end_offset = oc.end_before_space; |
| 343 | 341 | max_end_offset = oc.end_after_space; |
| 344 | 342 | } |
| ... | ... | @@ -499,7 +497,7 @@ QPDF::checkLinearizationInternal() |
| 499 | 497 | for (int i = 0; i < npages; ++i) |
| 500 | 498 | { |
| 501 | 499 | QPDFObjectHandle const& page = pages[i]; |
| 502 | - QPDFObjGen og(page.getObjectID(), page.getGeneration()); | |
| 500 | + QPDFObjGen og(page.getObjGen()); | |
| 503 | 501 | if (this->xref_table[og].getType() == 2) |
| 504 | 502 | { |
| 505 | 503 | errors.push_back("page dictionary for page " + |
| ... | ... | @@ -582,7 +580,7 @@ QPDF::checkLinearizationInternal() |
| 582 | 580 | for (std::vector<QPDFObjectHandle>::iterator iter = this->part6.begin(); |
| 583 | 581 | iter != this->part6.end(); ++iter) |
| 584 | 582 | { |
| 585 | - QPDFObjGen og((*iter).getObjectID(), (*iter).getGeneration()); | |
| 583 | + QPDFObjGen og((*iter).getObjGen()); | |
| 586 | 584 | // All objects have to have been dereferenced to be classified. |
| 587 | 585 | assert(this->obj_cache.count(og) > 0); |
| 588 | 586 | ObjCache const& oc = this->obj_cache[og]; |
| ... | ... | @@ -740,7 +738,7 @@ QPDF::checkHPageOffset(std::list<std::string>& errors, |
| 740 | 738 | unsigned int npages = pages.size(); |
| 741 | 739 | int table_offset = adjusted_offset( |
| 742 | 740 | this->page_offset_hints.first_page_offset); |
| 743 | - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); | |
| 741 | + QPDFObjGen first_page_og(pages[0].getObjGen()); | |
| 744 | 742 | assert(this->xref_table.count(first_page_og) > 0); |
| 745 | 743 | int offset = getLinearizationOffset(first_page_og); |
| 746 | 744 | if (table_offset != offset) |
| ... | ... | @@ -750,8 +748,7 @@ QPDF::checkHPageOffset(std::list<std::string>& errors, |
| 750 | 748 | |
| 751 | 749 | for (unsigned int pageno = 0; pageno < npages; ++pageno) |
| 752 | 750 | { |
| 753 | - QPDFObjGen page_og(pages[pageno].getObjectID(), | |
| 754 | - pages[pageno].getGeneration()); | |
| 751 | + QPDFObjGen page_og(pages[pageno].getObjGen()); | |
| 755 | 752 | int first_object = page_og.getObj(); |
| 756 | 753 | assert(this->xref_table.count(page_og) > 0); |
| 757 | 754 | offset = getLinearizationOffset(page_og); |
| ... | ... | @@ -961,7 +958,7 @@ QPDF::checkHOutlines(std::list<std::string>& warnings) |
| 961 | 958 | { |
| 962 | 959 | // Check length and offset. Acrobat gets these wrong. |
| 963 | 960 | QPDFObjectHandle outlines = getRoot().getKey("/Outlines"); |
| 964 | - QPDFObjGen og(outlines.getObjectID(), outlines.getGeneration()); | |
| 961 | + QPDFObjGen og(outlines.getObjGen()); | |
| 965 | 962 | assert(this->xref_table.count(og) > 0); |
| 966 | 963 | int offset = getLinearizationOffset(og); |
| 967 | 964 | ObjUser ou(ObjUser::ou_root_key, "/Outlines"); |
| ... | ... | @@ -1466,7 +1463,7 @@ QPDF::calculateLinearizationData(std::map<int, int> const& object_stream_data) |
| 1466 | 1463 | // will do the same. |
| 1467 | 1464 | |
| 1468 | 1465 | // First, place the actual first page object itself. |
| 1469 | - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); | |
| 1466 | + QPDFObjGen first_page_og(pages[0].getObjGen()); | |
| 1470 | 1467 | if (! lc_first_page_private.count(first_page_og)) |
| 1471 | 1468 | { |
| 1472 | 1469 | throw std::logic_error( |
| ... | ... | @@ -1515,7 +1512,7 @@ QPDF::calculateLinearizationData(std::map<int, int> const& object_stream_data) |
| 1515 | 1512 | { |
| 1516 | 1513 | // Place this page's page object |
| 1517 | 1514 | |
| 1518 | - QPDFObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration()); | |
| 1515 | + QPDFObjGen page_og(pages[i].getObjGen()); | |
| 1519 | 1516 | if (! lc_other_page_private.count(page_og)) |
| 1520 | 1517 | { |
| 1521 | 1518 | throw std::logic_error( |
| ... | ... | @@ -1598,7 +1595,7 @@ QPDF::calculateLinearizationData(std::map<int, int> const& object_stream_data) |
| 1598 | 1595 | if (! thumb.isNull()) |
| 1599 | 1596 | { |
| 1600 | 1597 | // Output the thumbnail itself |
| 1601 | - QPDFObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration()); | |
| 1598 | + QPDFObjGen thumb_og(thumb.getObjGen()); | |
| 1602 | 1599 | if (lc_thumbnail_private.count(thumb_og)) |
| 1603 | 1600 | { |
| 1604 | 1601 | lc_thumbnail_private.erase(thumb_og); |
| ... | ... | @@ -1753,7 +1750,7 @@ QPDF::pushOutlinesToPart( |
| 1753 | 1750 | return; |
| 1754 | 1751 | } |
| 1755 | 1752 | outlines = getUncompressedObject(outlines, object_stream_data); |
| 1756 | - QPDFObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration()); | |
| 1753 | + QPDFObjGen outlines_og(outlines.getObjGen()); | |
| 1757 | 1754 | QTC::TC("qpdf", "QPDF lin outlines in part", |
| 1758 | 1755 | ((&part == (&this->part6)) ? 0 |
| 1759 | 1756 | : (&part == (&this->part9)) ? 1 | ... | ... |
libqpdf/QPDF_optimization.cc
| ... | ... | @@ -115,7 +115,7 @@ QPDF::optimize(std::map<int, int> const& object_stream_data, |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | 117 | ObjUser root_ou = ObjUser(ObjUser::ou_root); |
| 118 | - QPDFObjGen root_og = QPDFObjGen(root.getObjectID(), root.getGeneration()); | |
| 118 | + QPDFObjGen root_og = QPDFObjGen(root.getObjGen()); | |
| 119 | 119 | obj_user_to_objects[root_ou].insert(root_og); |
| 120 | 120 | object_to_obj_users[root_og].insert(root_ou); |
| 121 | 121 | |
| ... | ... | @@ -338,7 +338,7 @@ QPDF::updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh, |
| 338 | 338 | |
| 339 | 339 | if (oh.isIndirect()) |
| 340 | 340 | { |
| 341 | - QPDFObjGen og(oh.getObjectID(), oh.getGeneration()); | |
| 341 | + QPDFObjGen og(oh.getObjGen()); | |
| 342 | 342 | if (visited.count(og)) |
| 343 | 343 | { |
| 344 | 344 | QTC::TC("qpdf", "QPDF opt loop detected"); | ... | ... |
libqpdf/QPDF_pages.cc
| ... | ... | @@ -127,7 +127,7 @@ void |
| 127 | 127 | QPDF::insertPageobjToPage(QPDFObjectHandle const& obj, int pos, |
| 128 | 128 | bool check_duplicate) |
| 129 | 129 | { |
| 130 | - QPDFObjGen og(obj.getObjectID(), obj.getGeneration()); | |
| 130 | + QPDFObjGen og(obj.getObjGen()); | |
| 131 | 131 | if (check_duplicate) |
| 132 | 132 | { |
| 133 | 133 | if (! this->pageobj_to_pages_pos.insert(std::make_pair(og, pos)).second) |
| ... | ... | @@ -214,8 +214,7 @@ QPDF::removePage(QPDFObjectHandle page) |
| 214 | 214 | pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); |
| 215 | 215 | this->all_pages.erase(this->all_pages.begin() + pos); |
| 216 | 216 | assert(this->all_pages.size() == static_cast<size_t>(npages)); |
| 217 | - this->pageobj_to_pages_pos.erase( | |
| 218 | - QPDFObjGen(page.getObjectID(), page.getGeneration())); | |
| 217 | + this->pageobj_to_pages_pos.erase(page.getObjGen()); | |
| 219 | 218 | assert(this->pageobj_to_pages_pos.size() == static_cast<size_t>(npages)); |
| 220 | 219 | for (int i = pos; i < npages; ++i) |
| 221 | 220 | { |
| ... | ... | @@ -253,18 +252,18 @@ int |
| 253 | 252 | QPDF::findPage(QPDFObjectHandle& page) |
| 254 | 253 | { |
| 255 | 254 | page.assertPageObject(); |
| 256 | - return findPage(page.getObjectID(), page.getGeneration()); | |
| 255 | + return findPage(page.getObjGen()); | |
| 257 | 256 | } |
| 258 | 257 | |
| 259 | 258 | int |
| 260 | -QPDF::findPage(int objid, int generation) | |
| 259 | +QPDF::findPage(QPDFObjGen const& og) | |
| 261 | 260 | { |
| 262 | 261 | flattenPagesTree(); |
| 263 | 262 | std::map<QPDFObjGen, int>::iterator it = |
| 264 | - this->pageobj_to_pages_pos.find(QPDFObjGen(objid, generation)); | |
| 263 | + this->pageobj_to_pages_pos.find(og); | |
| 265 | 264 | if (it == this->pageobj_to_pages_pos.end()) |
| 266 | 265 | { |
| 267 | - setLastObjectDescription("page object", objid, generation); | |
| 266 | + setLastObjectDescription("page object", og.getObj(), og.getGen()); | |
| 268 | 267 | throw QPDFExc(qpdf_e_pages, this->file->getName(), |
| 269 | 268 | this->last_object_description, 0, |
| 270 | 269 | "page object not referenced in /Pages tree"); | ... | ... |
qpdf/qpdf.cc
| ... | ... | @@ -1621,8 +1621,7 @@ int main(int argc, char* argv[]) |
| 1621 | 1621 | { |
| 1622 | 1622 | if (selected_from_orig.count(pageno) == 0) |
| 1623 | 1623 | { |
| 1624 | - pdf.replaceObject(orig_pages[pageno].getObjectID(), | |
| 1625 | - orig_pages[pageno].getGeneration(), | |
| 1624 | + pdf.replaceObject(orig_pages[pageno].getObjGen(), | |
| 1626 | 1625 | QPDFObjectHandle::newNull()); |
| 1627 | 1626 | } |
| 1628 | 1627 | } | ... | ... |
qpdf/test_driver.cc
| ... | ... | @@ -659,8 +659,7 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 659 | 659 | " not called 4-page file"); |
| 660 | 660 | } |
| 661 | 661 | // Swap pages 2 and 3 |
| 662 | - pdf.swapObjects(pages[1].getObjectID(), pages[1].getGeneration(), | |
| 663 | - pages[2].getObjectID(), pages[2].getGeneration()); | |
| 662 | + pdf.swapObjects(pages[1].getObjGen(), pages[2].getObjGen()); | |
| 664 | 663 | // Replace object and swap objects |
| 665 | 664 | QPDFObjectHandle trailer = pdf.getTrailer(); |
| 666 | 665 | QPDFObjectHandle qdict = trailer.getKey("/QDict"); |
| ... | ... | @@ -672,21 +671,18 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 672 | 671 | try |
| 673 | 672 | { |
| 674 | 673 | // Do it wrong first... |
| 675 | - pdf.replaceObject(qdict.getObjectID(), qdict.getGeneration(), | |
| 676 | - qdict); | |
| 674 | + pdf.replaceObject(qdict.getObjGen(), qdict); | |
| 677 | 675 | } |
| 678 | 676 | catch (std::logic_error) |
| 679 | 677 | { |
| 680 | 678 | std::cout << "caught logic error as expected" << std::endl; |
| 681 | 679 | } |
| 682 | - pdf.replaceObject(qdict.getObjectID(), qdict.getGeneration(), | |
| 683 | - new_dict); | |
| 680 | + pdf.replaceObject(qdict.getObjGen(), new_dict); | |
| 684 | 681 | // Now qdict still points to the old dictionary |
| 685 | 682 | std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue() |
| 686 | 683 | << std::endl; |
| 687 | 684 | // Swap dict and array |
| 688 | - pdf.swapObjects(qdict.getObjectID(), qdict.getGeneration(), | |
| 689 | - qarray.getObjectID(), qarray.getGeneration()); | |
| 685 | + pdf.swapObjects(qdict.getObjGen(), qarray.getObjGen()); | |
| 690 | 686 | // Now qarray will resolve to new object but qdict is still |
| 691 | 687 | // the old object |
| 692 | 688 | std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue() |
| ... | ... | @@ -694,7 +690,7 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 694 | 690 | std::cout << "new dict: " << qarray.getKey("/NewDict").getIntValue() |
| 695 | 691 | << std::endl; |
| 696 | 692 | // Reread qdict, now pointing to an array |
| 697 | - qdict = pdf.getObjectByID(qdict.getObjectID(), qdict.getGeneration()); | |
| 693 | + qdict = pdf.getObjectByObjGen(qdict.getObjGen()); | |
| 698 | 694 | std::cout << "swapped array: " << qdict.getArrayItem(0).getName() |
| 699 | 695 | << std::endl; |
| 700 | 696 | |
| ... | ... | @@ -788,14 +784,14 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 788 | 784 | pdf.addPage(new_pages[0], true); |
| 789 | 785 | checkPageContents(pages[0], "New page 1"); |
| 790 | 786 | pdf.addPageAt(new_pages[1], true, pages[0]); |
| 791 | - assert(pages[0].getObjectID() == new_pages[1].getObjectID()); | |
| 787 | + assert(pages[0].getObjGen() == new_pages[1].getObjGen()); | |
| 792 | 788 | pdf.addPageAt(new_pages[2], true, pages[5]); |
| 793 | - assert(pages[5].getObjectID() == new_pages[2].getObjectID()); | |
| 789 | + assert(pages[5].getObjGen() == new_pages[2].getObjGen()); | |
| 794 | 790 | pdf.addPageAt(new_pages[3], false, pages[5]); |
| 795 | - assert(pages[6].getObjectID() == new_pages[3].getObjectID()); | |
| 791 | + assert(pages[6].getObjGen() == new_pages[3].getObjGen()); | |
| 796 | 792 | assert(pages.size() == 11); |
| 797 | 793 | pdf.addPage(new_pages[4], false); |
| 798 | - assert(pages[11].getObjectID() == new_pages[4].getObjectID()); | |
| 794 | + assert(pages[11].getObjGen() == new_pages[4].getObjGen()); | |
| 799 | 795 | pdf.addPageAt(new_pages[5], false, pages.back()); |
| 800 | 796 | assert(pages.size() == 13); |
| 801 | 797 | checkPageContents(pages[0], "New page 0"); |
| ... | ... | @@ -835,7 +831,7 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 835 | 831 | assert(all_pages.size() == 10); |
| 836 | 832 | pdf.updateAllPagesCache(); |
| 837 | 833 | assert(all_pages.size() == 11); |
| 838 | - assert(all_pages.back().getObjectID() == page.getObjectID()); | |
| 834 | + assert(all_pages.back().getObjGen() == page.getObjGen()); | |
| 839 | 835 | |
| 840 | 836 | QPDFWriter w(pdf, "a.pdf"); |
| 841 | 837 | w.setStaticID(true); |
| ... | ... | @@ -862,7 +858,7 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 862 | 858 | pdf.removePage(page5); |
| 863 | 859 | pdf.addPage(page5, false); |
| 864 | 860 | assert(pages.size() == 10); |
| 865 | - assert(pages.back().getObjectID() == page5.getObjectID()); | |
| 861 | + assert(pages.back().getObjGen() == page5.getObjGen()); | |
| 866 | 862 | |
| 867 | 863 | QPDFWriter w(pdf, "a.pdf"); |
| 868 | 864 | w.setStaticID(true); | ... | ... |