Commit 903a86643ad6559ded882fe8d6549c0c715f9fc2
1 parent
0356bcec
Fix code formatting of QPDF::pushInheritedAttributesToPageInternal
Showing
1 changed file
with
92 additions
and
94 deletions
libqpdf/QPDF_optimization.cc
| ... | ... | @@ -168,111 +168,109 @@ QPDF::pushInheritedAttributesToPageInternal( |
| 168 | 168 | bool allow_changes, |
| 169 | 169 | bool warn_skipped_keys) |
| 170 | 170 | { |
| 171 | - // Make a list of inheritable keys. Only the keys /MediaBox, | |
| 172 | - // /CropBox, /Resources, and /Rotate are inheritable | |
| 173 | - // attributes. Push this object onto the stack of pages nodes | |
| 174 | - // that have values for this attribute. | |
| 175 | - | |
| 176 | - std::set<std::string> inheritable_keys; | |
| 177 | - for (auto const& key: cur_pages.getKeys()) { | |
| 178 | - if ((key == "/MediaBox") || (key == "/CropBox") || | |
| 179 | - (key == "/Resources") || (key == "/Rotate")) { | |
| 180 | - if (!allow_changes) { | |
| 181 | - throw QPDFExc( | |
| 182 | - qpdf_e_internal, | |
| 183 | - this->m->file->getName(), | |
| 184 | - this->m->last_object_description, | |
| 185 | - this->m->file->getLastOffset(), | |
| 186 | - "optimize detected an " | |
| 187 | - "inheritable attribute when called " | |
| 188 | - "in no-change mode"); | |
| 189 | - } | |
| 171 | + // Make a list of inheritable keys. Only the keys /MediaBox, | |
| 172 | + // /CropBox, /Resources, and /Rotate are inheritable | |
| 173 | + // attributes. Push this object onto the stack of pages nodes | |
| 174 | + // that have values for this attribute. | |
| 175 | + | |
| 176 | + std::set<std::string> inheritable_keys; | |
| 177 | + for (auto const& key: cur_pages.getKeys()) { | |
| 178 | + if ((key == "/MediaBox") || (key == "/CropBox") || | |
| 179 | + (key == "/Resources") || (key == "/Rotate")) { | |
| 180 | + if (!allow_changes) { | |
| 181 | + throw QPDFExc( | |
| 182 | + qpdf_e_internal, | |
| 183 | + this->m->file->getName(), | |
| 184 | + this->m->last_object_description, | |
| 185 | + this->m->file->getLastOffset(), | |
| 186 | + "optimize detected an " | |
| 187 | + "inheritable attribute when called " | |
| 188 | + "in no-change mode"); | |
| 189 | + } | |
| 190 | 190 | |
| 191 | - // This is an inheritable resource | |
| 192 | - inheritable_keys.insert(key); | |
| 193 | - QPDFObjectHandle oh = cur_pages.getKey(key); | |
| 194 | - QTC::TC( | |
| 195 | - "qpdf", | |
| 196 | - "QPDF opt direct pages resource", | |
| 197 | - oh.isIndirect() ? 0 : 1); | |
| 198 | - if (!oh.isIndirect()) { | |
| 199 | - if (!oh.isScalar()) { | |
| 200 | - // Replace shared direct object non-scalar | |
| 201 | - // resources with indirect objects to avoid | |
| 202 | - // copying large structures around. | |
| 203 | - cur_pages.replaceKey(key, makeIndirectObject(oh)); | |
| 204 | - oh = cur_pages.getKey(key); | |
| 205 | - } else { | |
| 206 | - // It's okay to copy scalars. | |
| 207 | - QTC::TC("qpdf", "QPDF opt inherited scalar"); | |
| 208 | - } | |
| 209 | - } | |
| 210 | - key_ancestors[key].push_back(oh); | |
| 211 | - if (key_ancestors[key].size() > 1) { | |
| 212 | - QTC::TC("qpdf", "QPDF opt key ancestors depth > 1"); | |
| 213 | - } | |
| 214 | - // Remove this resource from this node. It will be | |
| 215 | - // reattached at the page level. | |
| 216 | - cur_pages.removeKey(key); | |
| 217 | - } else if (!((key == "/Type") || (key == "/Parent") || | |
| 218 | - (key == "/Kids") || (key == "/Count"))) { | |
| 219 | - // Warn when flattening, but not if the key is at the top | |
| 220 | - // level (i.e. "/Parent" not set), as we don't change these; | |
| 221 | - // but flattening removes intermediate /Pages nodes. | |
| 222 | - if ((warn_skipped_keys) && (cur_pages.hasKey("/Parent"))) { | |
| 223 | - QTC::TC("qpdf", "QPDF unknown key not inherited"); | |
| 224 | - setLastObjectDescription( | |
| 225 | - "Pages object", cur_pages.getObjGen()); | |
| 226 | - warn( | |
| 227 | - qpdf_e_pages, | |
| 228 | - this->m->last_object_description, | |
| 229 | - 0, | |
| 230 | - ("Unknown key " + key + | |
| 231 | - " in /Pages object" | |
| 232 | - " is being discarded as a result of" | |
| 233 | - " flattening the /Pages tree")); | |
| 191 | + // This is an inheritable resource | |
| 192 | + inheritable_keys.insert(key); | |
| 193 | + QPDFObjectHandle oh = cur_pages.getKey(key); | |
| 194 | + QTC::TC( | |
| 195 | + "qpdf", | |
| 196 | + "QPDF opt direct pages resource", | |
| 197 | + oh.isIndirect() ? 0 : 1); | |
| 198 | + if (!oh.isIndirect()) { | |
| 199 | + if (!oh.isScalar()) { | |
| 200 | + // Replace shared direct object non-scalar | |
| 201 | + // resources with indirect objects to avoid | |
| 202 | + // copying large structures around. | |
| 203 | + cur_pages.replaceKey(key, makeIndirectObject(oh)); | |
| 204 | + oh = cur_pages.getKey(key); | |
| 205 | + } else { | |
| 206 | + // It's okay to copy scalars. | |
| 207 | + QTC::TC("qpdf", "QPDF opt inherited scalar"); | |
| 234 | 208 | } |
| 235 | 209 | } |
| 210 | + key_ancestors[key].push_back(oh); | |
| 211 | + if (key_ancestors[key].size() > 1) { | |
| 212 | + QTC::TC("qpdf", "QPDF opt key ancestors depth > 1"); | |
| 213 | + } | |
| 214 | + // Remove this resource from this node. It will be | |
| 215 | + // reattached at the page level. | |
| 216 | + cur_pages.removeKey(key); | |
| 217 | + } else if (!((key == "/Type") || (key == "/Parent") || | |
| 218 | + (key == "/Kids") || (key == "/Count"))) { | |
| 219 | + // Warn when flattening, but not if the key is at the top | |
| 220 | + // level (i.e. "/Parent" not set), as we don't change these; | |
| 221 | + // but flattening removes intermediate /Pages nodes. | |
| 222 | + if ((warn_skipped_keys) && (cur_pages.hasKey("/Parent"))) { | |
| 223 | + QTC::TC("qpdf", "QPDF unknown key not inherited"); | |
| 224 | + setLastObjectDescription("Pages object", cur_pages.getObjGen()); | |
| 225 | + warn( | |
| 226 | + qpdf_e_pages, | |
| 227 | + this->m->last_object_description, | |
| 228 | + 0, | |
| 229 | + ("Unknown key " + key + | |
| 230 | + " in /Pages object" | |
| 231 | + " is being discarded as a result of" | |
| 232 | + " flattening the /Pages tree")); | |
| 233 | + } | |
| 236 | 234 | } |
| 235 | + } | |
| 237 | 236 | |
| 238 | - // Process descendant nodes. | |
| 239 | - for (auto& kid: cur_pages.getKey("/Kids").aitems()) { | |
| 240 | - if (kid.isDictionaryOfType("/Pages")) { | |
| 241 | - pushInheritedAttributesToPageInternal( | |
| 242 | - kid, key_ancestors, allow_changes, warn_skipped_keys); | |
| 243 | - } else { | |
| 244 | - // Add all available inheritable attributes not present in | |
| 245 | - // this object to this object. | |
| 246 | - for (auto const& iter: key_ancestors) { | |
| 247 | - std::string const& key = iter.first; | |
| 248 | - if (!kid.hasKey(key)) { | |
| 249 | - QTC::TC("qpdf", "QPDF opt resource inherited"); | |
| 250 | - kid.replaceKey(key, iter.second.back()); | |
| 251 | - } else { | |
| 252 | - QTC::TC( | |
| 253 | - "qpdf", "QPDF opt page resource hides ancestor"); | |
| 254 | - } | |
| 237 | + // Process descendant nodes. | |
| 238 | + for (auto& kid: cur_pages.getKey("/Kids").aitems()) { | |
| 239 | + if (kid.isDictionaryOfType("/Pages")) { | |
| 240 | + pushInheritedAttributesToPageInternal( | |
| 241 | + kid, key_ancestors, allow_changes, warn_skipped_keys); | |
| 242 | + } else { | |
| 243 | + // Add all available inheritable attributes not present in | |
| 244 | + // this object to this object. | |
| 245 | + for (auto const& iter: key_ancestors) { | |
| 246 | + std::string const& key = iter.first; | |
| 247 | + if (!kid.hasKey(key)) { | |
| 248 | + QTC::TC("qpdf", "QPDF opt resource inherited"); | |
| 249 | + kid.replaceKey(key, iter.second.back()); | |
| 250 | + } else { | |
| 251 | + QTC::TC("qpdf", "QPDF opt page resource hides ancestor"); | |
| 255 | 252 | } |
| 256 | 253 | } |
| 257 | 254 | } |
| 255 | + } | |
| 258 | 256 | |
| 259 | - // For each inheritable key, pop the stack. If the stack | |
| 260 | - // becomes empty, remove it from the map. That way, the | |
| 261 | - // invariant that the list of keys in key_ancestors is exactly | |
| 262 | - // those keys for which inheritable attributes are available. | |
| 263 | - | |
| 264 | - if (!inheritable_keys.empty()) { | |
| 265 | - QTC::TC("qpdf", "QPDF opt inheritable keys"); | |
| 266 | - for (auto const& key: inheritable_keys) { | |
| 267 | - key_ancestors[key].pop_back(); | |
| 268 | - if (key_ancestors[key].empty()) { | |
| 269 | - QTC::TC("qpdf", "QPDF opt erase empty key ancestor"); | |
| 270 | - key_ancestors.erase(key); | |
| 271 | - } | |
| 257 | + // For each inheritable key, pop the stack. If the stack | |
| 258 | + // becomes empty, remove it from the map. That way, the | |
| 259 | + // invariant that the list of keys in key_ancestors is exactly | |
| 260 | + // those keys for which inheritable attributes are available. | |
| 261 | + | |
| 262 | + if (!inheritable_keys.empty()) { | |
| 263 | + QTC::TC("qpdf", "QPDF opt inheritable keys"); | |
| 264 | + for (auto const& key: inheritable_keys) { | |
| 265 | + key_ancestors[key].pop_back(); | |
| 266 | + if (key_ancestors[key].empty()) { | |
| 267 | + QTC::TC("qpdf", "QPDF opt erase empty key ancestor"); | |
| 268 | + key_ancestors.erase(key); | |
| 272 | 269 | } |
| 273 | - } else { | |
| 274 | - QTC::TC("qpdf", "QPDF opt no inheritable keys"); | |
| 275 | 270 | } |
| 271 | + } else { | |
| 272 | + QTC::TC("qpdf", "QPDF opt no inheritable keys"); | |
| 273 | + } | |
| 276 | 274 | } |
| 277 | 275 | |
| 278 | 276 | void | ... | ... |