Commit 8335b2833b22418742e85eaa77c4269447afac63

Authored by m-holger
1 parent d60f06c1

Use QPDFObjGen::set in QPDFObjectHandle

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  
... ...