Commit 8335b2833b22418742e85eaa77c4269447afac63
1 parent
d60f06c1
Use QPDFObjGen::set in QPDFObjectHandle
Showing
2 changed files
with
13 additions
and
30 deletions
include/qpdf/QPDFObjectHandle.hh
| ... | ... | @@ -1611,7 +1611,7 @@ class QPDFObjectHandle |
| 1611 | 1611 | void objectWarning(std::string const& warning); |
| 1612 | 1612 | void assertType(char const* type_name, bool istype); |
| 1613 | 1613 | inline bool dereference(); |
| 1614 | - void makeDirect(std::set<QPDFObjGen>& visited, bool stop_at_streams); | |
| 1614 | + void makeDirect(QPDFObjGen::set& visited, bool stop_at_streams); | |
| 1615 | 1615 | void disconnect(); |
| 1616 | 1616 | void setParsedOffset(qpdf_offset_t offset); |
| 1617 | 1617 | void parseContentStream_internal( | ... | ... |
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -1588,22 +1588,12 @@ QPDFObjectHandle::rotatePage(int angle, bool relative) |
| 1588 | 1588 | int new_angle = angle; |
| 1589 | 1589 | if (relative) { |
| 1590 | 1590 | int old_angle = 0; |
| 1591 | - bool found_rotate = false; | |
| 1592 | 1591 | QPDFObjectHandle cur_obj = *this; |
| 1593 | - bool searched_parent = false; | |
| 1594 | - std::set<QPDFObjGen> visited; | |
| 1595 | - while (!found_rotate) { | |
| 1596 | - if (visited.count(cur_obj.getObjGen())) { | |
| 1597 | - // Don't get stuck in an infinite loop | |
| 1592 | + QPDFObjGen::set visited; | |
| 1593 | + while (visited.add(cur_obj)) { | |
| 1594 | + // Don't get stuck in an infinite loop | |
| 1595 | + if (cur_obj.getKey("/Rotate").getValueAsInt(old_angle)) { | |
| 1598 | 1596 | break; |
| 1599 | - } | |
| 1600 | - if (!visited.empty()) { | |
| 1601 | - searched_parent = true; | |
| 1602 | - } | |
| 1603 | - visited.insert(cur_obj.getObjGen()); | |
| 1604 | - if (cur_obj.getKey("/Rotate").isInteger()) { | |
| 1605 | - found_rotate = true; | |
| 1606 | - old_angle = cur_obj.getKey("/Rotate").getIntValueAsInt(); | |
| 1607 | 1597 | } else if (cur_obj.getKey("/Parent").isDictionary()) { |
| 1608 | 1598 | cur_obj = cur_obj.getKey("/Parent"); |
| 1609 | 1599 | } else { |
| ... | ... | @@ -1613,7 +1603,7 @@ QPDFObjectHandle::rotatePage(int angle, bool relative) |
| 1613 | 1603 | QTC::TC( |
| 1614 | 1604 | "qpdf", |
| 1615 | 1605 | "QPDFObjectHandle found old angle", |
| 1616 | - searched_parent ? 0 : 1); | |
| 1606 | + visited.size() > 1 ? 0 : 1); | |
| 1617 | 1607 | if ((old_angle % 90) != 0) { |
| 1618 | 1608 | old_angle = 0; |
| 1619 | 1609 | } |
| ... | ... | @@ -2181,20 +2171,15 @@ QPDFObjectHandle::unsafeShallowCopy() |
| 2181 | 2171 | } |
| 2182 | 2172 | |
| 2183 | 2173 | void |
| 2184 | -QPDFObjectHandle::makeDirect( | |
| 2185 | - std::set<QPDFObjGen>& visited, bool stop_at_streams) | |
| 2174 | +QPDFObjectHandle::makeDirect(QPDFObjGen::set& visited, bool stop_at_streams) | |
| 2186 | 2175 | { |
| 2187 | 2176 | assertInitialized(); |
| 2188 | 2177 | |
| 2189 | 2178 | auto cur_og = getObjGen(); |
| 2190 | - if (cur_og.getObj() != 0) { | |
| 2191 | - if (visited.count(cur_og)) { | |
| 2192 | - QTC::TC("qpdf", "QPDFObjectHandle makeDirect loop"); | |
| 2193 | - throw std::runtime_error( | |
| 2194 | - "loop detected while converting object from " | |
| 2195 | - "indirect to direct"); | |
| 2196 | - } | |
| 2197 | - visited.insert(cur_og); | |
| 2179 | + if (!visited.add(cur_og)) { | |
| 2180 | + QTC::TC("qpdf", "QPDFObjectHandle makeDirect loop"); | |
| 2181 | + throw std::runtime_error("loop detected while converting object from " | |
| 2182 | + "indirect to direct"); | |
| 2198 | 2183 | } |
| 2199 | 2184 | |
| 2200 | 2185 | if (isBool() || isInteger() || isName() || isNull() || isReal() || |
| ... | ... | @@ -2232,9 +2217,7 @@ QPDFObjectHandle::makeDirect( |
| 2232 | 2217 | "unknown object type"); |
| 2233 | 2218 | } |
| 2234 | 2219 | |
| 2235 | - if (cur_og.getObj()) { | |
| 2236 | - visited.erase(cur_og); | |
| 2237 | - } | |
| 2220 | + visited.erase(cur_og); | |
| 2238 | 2221 | } |
| 2239 | 2222 | |
| 2240 | 2223 | QPDFObjectHandle |
| ... | ... | @@ -2258,7 +2241,7 @@ QPDFObjectHandle::copyStream() |
| 2258 | 2241 | void |
| 2259 | 2242 | QPDFObjectHandle::makeDirect(bool allow_streams) |
| 2260 | 2243 | { |
| 2261 | - std::set<QPDFObjGen> visited; | |
| 2244 | + QPDFObjGen::set visited; | |
| 2262 | 2245 | makeDirect(visited, allow_streams); |
| 2263 | 2246 | } |
| 2264 | 2247 | ... | ... |