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