aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc59
1 files changed, 25 insertions, 34 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 09221394..56a18ccd 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -2176,7 +2176,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign)
void
QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
{
- if (foreign.isReserved()) {
+ auto foreign_tc = foreign.getTypeCode();
+ if (foreign_tc == ::ot_reserved) {
throw std::logic_error(
"QPDF: attempting to copy a foreign reserved object");
}
@@ -2193,70 +2194,62 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
if (foreign.isIndirect()) {
QPDFObjGen foreign_og(foreign.getObjGen());
- if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) {
- QTC::TC("qpdf", "QPDF loop reserving objects");
+ if (obj_copier.object_map.count(foreign_og) > 0) {
+ QTC::TC("qpdf", "QPDF already reserved object");
+ if (obj_copier.visiting.count(foreign_og)) {
+ QTC::TC("qpdf", "QPDF loop reserving objects");
+ }
return;
}
- if (obj_copier.object_map.find(foreign_og) !=
- obj_copier.object_map.end()) {
- QTC::TC("qpdf", "QPDF already reserved object");
+ if (!obj_copier.visiting.add(foreign_og)) {
return;
}
QTC::TC("qpdf", "QPDF copy indirect");
- obj_copier.visiting.insert(foreign_og);
- auto mapping = obj_copier.object_map.find(foreign_og);
- if (mapping == obj_copier.object_map.end()) {
+ if (obj_copier.object_map.count(foreign_og) == 0) {
obj_copier.to_copy.push_back(foreign);
- QPDFObjectHandle reservation;
- if (foreign.isStream()) {
- reservation = newStream();
- } else {
- reservation = QPDFObjectHandle::newReserved(this);
- }
- obj_copier.object_map[foreign_og] = reservation;
+ obj_copier.object_map[foreign_og] = foreign.isStream()
+ ? newStream()
+ : QPDFObjectHandle::newReserved(this);
}
}
- if (foreign.isArray()) {
+ if (foreign_tc == ::ot_array) {
QTC::TC("qpdf", "QPDF reserve array");
int n = foreign.getArrayNItems();
for (int i = 0; i < n; ++i) {
reserveObjects(foreign.getArrayItem(i), obj_copier, false);
}
- } else if (foreign.isDictionary()) {
+ } else if (foreign_tc == ::ot_dictionary) {
QTC::TC("qpdf", "QPDF reserve dictionary");
for (auto const& key: foreign.getKeys()) {
reserveObjects(foreign.getKey(key), obj_copier, false);
}
- } else if (foreign.isStream()) {
+ } else if (foreign_tc == ::ot_stream) {
QTC::TC("qpdf", "QPDF reserve stream");
reserveObjects(foreign.getDict(), obj_copier, false);
}
- if (foreign.isIndirect()) {
- QPDFObjGen foreign_og(foreign.getObjGen());
- obj_copier.visiting.erase(foreign_og);
- }
+ obj_copier.visiting.erase(foreign);
}
QPDFObjectHandle
QPDF::replaceForeignIndirectObjects(
QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
{
+ auto foreign_tc = foreign.getTypeCode();
QPDFObjectHandle result;
if ((!top) && foreign.isIndirect()) {
QTC::TC("qpdf", "QPDF replace indirect");
- QPDFObjGen foreign_og(foreign.getObjGen());
- auto mapping = obj_copier.object_map.find(foreign_og);
+ auto mapping = obj_copier.object_map.find(foreign.getObjGen());
if (mapping == obj_copier.object_map.end()) {
// This case would occur if this is a reference to a Page
// or Pages object that we didn't traverse into.
QTC::TC("qpdf", "QPDF replace foreign indirect with null");
result = QPDFObjectHandle::newNull();
} else {
- result = obj_copier.object_map[foreign_og];
+ result = mapping->second;
}
- } else if (foreign.isArray()) {
+ } else if (foreign_tc == ::ot_array) {
QTC::TC("qpdf", "QPDF replace array");
result = QPDFObjectHandle::newArray();
int n = foreign.getArrayNItems();
@@ -2266,7 +2259,7 @@ QPDF::replaceForeignIndirectObjects(
replaceForeignIndirectObjects(
foreign.getArrayItem(i), obj_copier, false));
}
- } else if (foreign.isDictionary()) {
+ } else if (foreign_tc == ::ot_dictionary) {
QTC::TC("qpdf", "QPDF replace dictionary");
result = QPDFObjectHandle::newDictionary();
std::set<std::string> keys = foreign.getKeys();
@@ -2276,10 +2269,9 @@ QPDF::replaceForeignIndirectObjects(
replaceForeignIndirectObjects(
foreign.getKey(iter), obj_copier, false));
}
- } else if (foreign.isStream()) {
+ } else if (foreign_tc == ::ot_stream) {
QTC::TC("qpdf", "QPDF replace stream");
- QPDFObjGen foreign_og(foreign.getObjGen());
- result = obj_copier.object_map[foreign_og];
+ result = obj_copier.object_map[foreign.getObjGen()];
result.assertStream();
QPDFObjectHandle dict = result.getDict();
QPDFObjectHandle old_dict = foreign.getDict();
@@ -2511,7 +2503,7 @@ QPDF::getCompressibleObjGens()
QPDFObjectHandle encryption_dict = this->m->trailer.getKey("/Encrypt");
QPDFObjGen encryption_dict_og = encryption_dict.getObjGen();
- std::set<QPDFObjGen> visited;
+ QPDFObjGen::set visited;
std::list<QPDFObjectHandle> queue;
queue.push_front(this->m->trailer);
std::vector<QPDFObjGen> result;
@@ -2520,7 +2512,7 @@ QPDF::getCompressibleObjGens()
queue.pop_front();
if (obj.isIndirect()) {
QPDFObjGen og = obj.getObjGen();
- if (visited.count(og)) {
+ if (!visited.add(og)) {
QTC::TC("qpdf", "QPDF loop detected traversing objects");
continue;
}
@@ -2532,7 +2524,6 @@ QPDF::getCompressibleObjGens()
obj.hasKey("/Contents")))) {
result.push_back(og);
}
- visited.insert(og);
}
if (obj.isStream()) {
QPDFObjectHandle dict = obj.getDict();