2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-30 00:40:52 +00:00

Use QPDFObjGen::set in QPDFJob::shouldRemoveUnreferencedResources

This commit is contained in:
m-holger 2023-04-02 16:56:42 +01:00
parent ae2d623929
commit 0c45bd8749

View File

@ -2451,8 +2451,8 @@ QPDFJob::shouldRemoveUnreferencedResources(QPDF& pdf)
// Return true as soon as we find any shared resources. // Return true as soon as we find any shared resources.
std::set<QPDFObjGen> resources_seen; // shared resources detection QPDFObjGen::set resources_seen; // shared resources detection
std::set<QPDFObjGen> nodes_seen; // loop detection QPDFObjGen::set nodes_seen; // loop detection
doIfVerbose([&](Pipeline& v, std::string const& prefix) { doIfVerbose([&](Pipeline& v, std::string const& prefix) {
v << prefix << ": " << pdf.getFilename() v << prefix << ": " << pdf.getFilename()
@ -2465,10 +2465,9 @@ QPDFJob::shouldRemoveUnreferencedResources(QPDF& pdf)
QPDFObjectHandle node = *queue.begin(); QPDFObjectHandle node = *queue.begin();
queue.pop_front(); queue.pop_front();
QPDFObjGen og = node.getObjGen(); QPDFObjGen og = node.getObjGen();
if (nodes_seen.count(og)) { if (!nodes_seen.add(og)) {
continue; continue;
} }
nodes_seen.insert(og);
QPDFObjectHandle dict = node.isStream() ? node.getDict() : node; QPDFObjectHandle dict = node.isStream() ? node.getDict() : node;
QPDFObjectHandle kids = dict.getKey("/Kids"); QPDFObjectHandle kids = dict.getKey("/Kids");
if (kids.isArray()) { if (kids.isArray()) {
@ -2489,33 +2488,29 @@ QPDFJob::shouldRemoveUnreferencedResources(QPDF& pdf)
// This is a leaf node or a form XObject. // This is a leaf node or a form XObject.
QPDFObjectHandle resources = dict.getKey("/Resources"); QPDFObjectHandle resources = dict.getKey("/Resources");
if (resources.isIndirect()) { if (resources.isIndirect()) {
QPDFObjGen resources_og = resources.getObjGen(); if (!resources_seen.add(resources)) {
if (resources_seen.count(resources_og)) {
QTC::TC("qpdf", "QPDFJob found shared resources in leaf"); QTC::TC("qpdf", "QPDFJob found shared resources in leaf");
doIfVerbose([&](Pipeline& v, std::string const& prefix) { doIfVerbose([&](Pipeline& v, std::string const& prefix) {
v << " found shared resources in leaf node " v << " found shared resources in leaf node "
<< og.unparse(' ') << ": " << og.unparse(' ') << ": "
<< resources_og.unparse(' ') << "\n"; << resources.getObjGen().unparse(' ') << "\n";
}); });
return true; return true;
} }
resources_seen.insert(resources_og);
} }
QPDFObjectHandle xobject = QPDFObjectHandle xobject =
(resources.isDictionary() ? resources.getKey("/XObject") (resources.isDictionary() ? resources.getKey("/XObject")
: QPDFObjectHandle::newNull()); : QPDFObjectHandle::newNull());
if (xobject.isIndirect()) { if (xobject.isIndirect()) {
QPDFObjGen xobject_og = xobject.getObjGen(); if (!resources_seen.add(xobject)) {
if (resources_seen.count(xobject_og)) {
QTC::TC("qpdf", "QPDFJob found shared xobject in leaf"); QTC::TC("qpdf", "QPDFJob found shared xobject in leaf");
doIfVerbose([&](Pipeline& v, std::string const& prefix) { doIfVerbose([&](Pipeline& v, std::string const& prefix) {
v << " found shared xobject in leaf node " v << " found shared xobject in leaf node "
<< og.unparse(' ') << ": " << xobject_og.unparse(' ') << og.unparse(' ') << ": "
<< "\n"; << xobject.getObjGen().unparse(' ') << "\n";
}); });
return true; return true;
} }
resources_seen.insert(xobject_og);
} }
if (xobject.isDictionary()) { if (xobject.isDictionary()) {
for (auto const& k: xobject.getKeys()) { for (auto const& k: xobject.getKeys()) {