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,7 +1611,7 @@ class QPDFObjectHandle
1611 void objectWarning(std::string const& warning); 1611 void objectWarning(std::string const& warning);
1612 void assertType(char const* type_name, bool istype); 1612 void assertType(char const* type_name, bool istype);
1613 inline bool dereference(); 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 void disconnect(); 1615 void disconnect();
1616 void setParsedOffset(qpdf_offset_t offset); 1616 void setParsedOffset(qpdf_offset_t offset);
1617 void parseContentStream_internal( 1617 void parseContentStream_internal(
libqpdf/QPDFObjectHandle.cc
@@ -1588,22 +1588,12 @@ QPDFObjectHandle::rotatePage(int angle, bool relative) @@ -1588,22 +1588,12 @@ QPDFObjectHandle::rotatePage(int angle, bool relative)
1588 int new_angle = angle; 1588 int new_angle = angle;
1589 if (relative) { 1589 if (relative) {
1590 int old_angle = 0; 1590 int old_angle = 0;
1591 - bool found_rotate = false;  
1592 QPDFObjectHandle cur_obj = *this; 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 break; 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 } else if (cur_obj.getKey("/Parent").isDictionary()) { 1597 } else if (cur_obj.getKey("/Parent").isDictionary()) {
1608 cur_obj = cur_obj.getKey("/Parent"); 1598 cur_obj = cur_obj.getKey("/Parent");
1609 } else { 1599 } else {
@@ -1613,7 +1603,7 @@ QPDFObjectHandle::rotatePage(int angle, bool relative) @@ -1613,7 +1603,7 @@ QPDFObjectHandle::rotatePage(int angle, bool relative)
1613 QTC::TC( 1603 QTC::TC(
1614 "qpdf", 1604 "qpdf",
1615 "QPDFObjectHandle found old angle", 1605 "QPDFObjectHandle found old angle",
1616 - searched_parent ? 0 : 1); 1606 + visited.size() > 1 ? 0 : 1);
1617 if ((old_angle % 90) != 0) { 1607 if ((old_angle % 90) != 0) {
1618 old_angle = 0; 1608 old_angle = 0;
1619 } 1609 }
@@ -2181,20 +2171,15 @@ QPDFObjectHandle::unsafeShallowCopy() @@ -2181,20 +2171,15 @@ QPDFObjectHandle::unsafeShallowCopy()
2181 } 2171 }
2182 2172
2183 void 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 assertInitialized(); 2176 assertInitialized();
2188 2177
2189 auto cur_og = getObjGen(); 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 if (isBool() || isInteger() || isName() || isNull() || isReal() || 2185 if (isBool() || isInteger() || isName() || isNull() || isReal() ||
@@ -2232,9 +2217,7 @@ QPDFObjectHandle::makeDirect( @@ -2232,9 +2217,7 @@ QPDFObjectHandle::makeDirect(
2232 "unknown object type"); 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 QPDFObjectHandle 2223 QPDFObjectHandle
@@ -2258,7 +2241,7 @@ QPDFObjectHandle::copyStream() @@ -2258,7 +2241,7 @@ QPDFObjectHandle::copyStream()
2258 void 2241 void
2259 QPDFObjectHandle::makeDirect(bool allow_streams) 2242 QPDFObjectHandle::makeDirect(bool allow_streams)
2260 { 2243 {
2261 - std::set<QPDFObjGen> visited; 2244 + QPDFObjGen::set visited;
2262 makeDirect(visited, allow_streams); 2245 makeDirect(visited, allow_streams);
2263 } 2246 }
2264 2247