diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 24 | ||||
-rw-r--r-- | libqpdf/QPDFPageDocumentHelper.cc | 26 |
2 files changed, 27 insertions, 23 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index b802a55c..4e77bbaa 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -931,6 +931,30 @@ QPDFObjectHandle::getResourceNames() return result; } +std::string +QPDFObjectHandle::getUniqueResourceName(std::string const& prefix, + int& min_suffix) +{ + std::set<std::string> names = getResourceNames(); + int max_suffix = min_suffix + names.size(); + while (min_suffix <= max_suffix) + { + std::string candidate = prefix + QUtil::int_to_string(min_suffix); + if (names.count(candidate) == 0) + { + return candidate; + } + // Increment after return; min_suffix should be the value + // used, not the next value. + ++min_suffix; + } + // This could only happen if there is a coding error. + // The number of candidates we test is more than the + // number of keys we're checking against. + throw std::logic_error("unable to find unconflicting name in" + " QPDFObjectHandle::getUniqueResourceName"); +} + // Indirect object accessors QPDF* QPDFObjectHandle::getOwningQPDF() diff --git a/libqpdf/QPDFPageDocumentHelper.cc b/libqpdf/QPDFPageDocumentHelper.cc index 3eec789b..58d6ed22 100644 --- a/libqpdf/QPDFPageDocumentHelper.cc +++ b/libqpdf/QPDFPageDocumentHelper.cc @@ -155,35 +155,15 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage( { QTC::TC("qpdf", "QPDFPageDocumentHelper non-widget annotation"); } - std::set<std::string> names = resources.getResourceNames(); - std::string name; - int max_fx = next_fx + names.size() + 1; - while (next_fx <= max_fx) - { - std::string candidate = "/Fxo" + QUtil::int_to_string(next_fx); - if (names.count(candidate) == 0) - { - name = candidate; - break; - } - ++next_fx; - } - if (name.empty()) - { - // This could only happen if there is a coding error. - // The number of candidates we test is more than the - // number of keys we're checking against. - name = "/FxConflict"; - } + std::string name = resources.getUniqueResourceName( + "/Fxo", next_fx); std::string content = aoh.getPageContentForAppearance( name, rotate, required_flags, forbidden_flags); if (! content.empty()) { resources.mergeResources( - QPDFObjectHandle::parse( - "<< /XObject << " + name + " null >> >>")); + QPDFObjectHandle::parse("<< /XObject << >> >>")); resources.getKey("/XObject").replaceKey(name, as); - names.insert(name); ++next_fx; } new_content += content; |