aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFPageObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-02-02 22:34:06 +0100
committerJay Berkenbilt <ejb@ql.org>2021-02-03 00:06:05 +0100
commit81025e499893c38b40aa824a5abc43393a8afed1 (patch)
tree64e2fcd60df784352b5b159c2c6376285c76057c /libqpdf/QPDFPageObjectHelper.cc
parent5fdf37b1bac9cfa1b1f77f47aded7f916fd81fd9 (diff)
downloadqpdf-81025e499893c38b40aa824a5abc43393a8afed1.tar.zst
Refactor removal of unreferenced resources
Refactor in preparation for resolving unresolved resources in form xobjects from page.
Diffstat (limited to 'libqpdf/QPDFPageObjectHelper.cc')
-rw-r--r--libqpdf/QPDFPageObjectHelper.cc62
1 files changed, 30 insertions, 32 deletions
diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc
index 009ecdc0..28b76561 100644
--- a/libqpdf/QPDFPageObjectHelper.cc
+++ b/libqpdf/QPDFPageObjectHelper.cc
@@ -703,13 +703,8 @@ NameWatcher::handleToken(QPDFTokenizer::Token const& token)
void
QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
- QPDFPageObjectHelper ph, std::set<QPDFObjGen>& seen)
+ QPDFPageObjectHelper ph)
{
- if (seen.count(ph.oh.getObjGen()))
- {
- return;
- }
- seen.insert(ph.oh.getObjGen());
NameWatcher nw;
try
{
@@ -730,39 +725,35 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
"not attempting to remove unreferenced objects from this page");
return;
}
- // Walk through /Font and /XObject dictionaries, removing any
- // resources that are not referenced. We must make copies of
+
+ // We will walk through /Font and /XObject dictionaries, removing
+ // any resources that are not referenced. We must make copies of
// resource dictionaries down into the dictionaries are mutating
// to prevent mutating one dictionary from having the side effect
// of mutating the one it was copied from.
- std::vector<std::string> to_filter;
- to_filter.push_back("/Font");
- to_filter.push_back("/XObject");
QPDFObjectHandle resources = ph.getAttribute("/Resources", true);
- for (std::vector<std::string>::iterator d_iter = to_filter.begin();
- d_iter != to_filter.end(); ++d_iter)
+ std::vector<QPDFObjectHandle> rdicts;
+ if (resources.isDictionary())
{
- QPDFObjectHandle dict = resources.getKey(*d_iter);
- if (! dict.isDictionary())
- {
- continue;
- }
- dict = dict.shallowCopy();
- resources.replaceKey(*d_iter, dict);
- std::set<std::string> keys = dict.getKeys();
- for (std::set<std::string>::iterator k_iter = keys.begin();
- k_iter != keys.end(); ++k_iter)
+ std::vector<std::string> to_filter = {"/Font", "/XObject"};
+ for (auto const& iter: to_filter)
{
- if (! nw.names.count(*k_iter))
+ QPDFObjectHandle dict = resources.getKey(iter);
+ if (dict.isDictionary())
{
- dict.removeKey(*k_iter);
+ dict = dict.shallowCopy();
+ resources.replaceKey(iter, dict);
+ rdicts.push_back(dict);
}
- QPDFObjectHandle resource = dict.getKey(*k_iter);
- if (resource.isFormXObject())
+ }
+ }
+ for (auto& dict: rdicts)
+ {
+ for (auto const& key: dict.getKeys())
+ {
+ if (! nw.names.count(key))
{
- QTC::TC("qpdf", "QPDFPageObjectHelper filter form xobject");
- removeUnreferencedResourcesHelper(
- QPDFPageObjectHelper(resource), seen);
+ dict.removeKey(key);
}
}
}
@@ -771,8 +762,15 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
void
QPDFPageObjectHelper::removeUnreferencedResources()
{
- std::set<QPDFObjGen> seen;
- removeUnreferencedResourcesHelper(*this, seen);
+ forEachFormXObject(
+ true,
+ [](
+ QPDFObjectHandle& obj, QPDFObjectHandle&, std::string const&)
+ {
+ QTC::TC("qpdf", "QPDFPageObjectHelper filter form xobject");
+ removeUnreferencedResourcesHelper(QPDFPageObjectHelper(obj));
+ });
+ removeUnreferencedResourcesHelper(*this);
}
QPDFPageObjectHelper