diff --git a/toonz/sources/common/tgeometry/tgeometry.cpp b/toonz/sources/common/tgeometry/tgeometry.cpp index 4fa6543..609b0fd 100644 --- a/toonz/sources/common/tgeometry/tgeometry.cpp +++ b/toonz/sources/common/tgeometry/tgeometry.cpp @@ -383,27 +383,38 @@ int TAngleRangeSet::find(Type a) const { } void TAngleRangeSet::insert(Type a) { - int i = find(a); - if (m_angles[i] == a) m_angles.erase(m_angles.begin() + i); else - if (a < m_angles[0]) m_angles.insert(m_angles.begin(), a); else - m_angles.insert(m_angles.begin()+i+1, a); + if (m_angles.empty()) { + m_angles.push_back(a); + } else { + int i = find(a); + if (m_angles[i] == a) + m_angles.erase(m_angles.begin() + i); + else if (a < m_angles[0]) + m_angles.insert(m_angles.begin(), a); + else + m_angles.insert(m_angles.begin() + i + 1, a); + } } -bool TAngleRangeSet::doAdd(Type a0, Type a1) { +void TAngleRangeSet::doAdd(Type a0, Type a1) { + if (m_angles.empty()) { + if (!m_flip) set(a0, a1); + return; + } + int i0 = find(a0); int i1 = find(a1); if (i0 == i1) { bool visible = (i0%2 != 0) == m_flip; if (m_angles[i0] != a0 && m_angles[i0] - a0 <= a1 - a0) { - if (visible) { fill(); return true; } - set(a0, a1); + if (visible) fill(); else set(a0, a1); } else if (!visible) { if (a1 < a0) m_flip = true; insert(a0); insert(a1); } - return false; + return; } bool visible0 = (i0%2 != 0) == m_flip; @@ -421,9 +432,8 @@ bool TAngleRangeSet::doAdd(Type a0, Type a1) { // insert new angles if need if (!visible0) insert(a0); if (!visible1) insert(a1); - if (m_angles.empty()) { m_flip = true; return true; } - if (a1 < a0) m_flip = true; - return false; + if (m_angles.empty() || a1 < a0) + m_flip = true; } bool TAngleRangeSet::contains(Type a) const { @@ -491,8 +501,8 @@ void TAngleRangeSet::add(const TAngleRangeSet &x) { if (&x == this || isFull() || x.isEmpty()) return; if (isEmpty()) { set(x); return; } if (x.isFull()) { fill(); return; } - for(Iterator i(x); i; ++i) - if (doAdd(i.a0(), i.a1())) return; + for (Iterator i(x); i && !isFull(); ++i) + doAdd(i.a0(), i.a1()); } void TAngleRangeSet::subtract(Type a0, Type a1) { @@ -509,8 +519,8 @@ void TAngleRangeSet::subtract(const TAngleRangeSet &x) { // a - b = !(!a + b) invert(); - for(Iterator i(x); i; ++i) - if (doAdd(i.a0(), i.a1())) return; + for (Iterator i(x); i && !isFull(); ++i) + doAdd(i.a0(), i.a1()); invert(); } @@ -529,7 +539,7 @@ void TAngleRangeSet::intersect(const TAngleRangeSet &x) { // a & b = !(!a + !b) invert(); - for(Iterator i(x, true); i; ++i) - if (doAdd(i.a0(), i.a1())) return; + for (Iterator i(x, true); i && !isFull(); ++i) + doAdd(i.a0(), i.a1()); invert(); } diff --git a/toonz/sources/include/tgeometry.h b/toonz/sources/include/tgeometry.h index 58afecf..e40191c 100644 --- a/toonz/sources/include/tgeometry.h +++ b/toonz/sources/include/tgeometry.h @@ -1494,7 +1494,7 @@ private: int find(Type a) const; void insert(Type a); - bool doAdd(Type a0, Type a1); + void doAdd(Type a0, Type a1); public: inline explicit TAngleRangeSet(bool fill = false): m_flip(fill) { }