fix Region const_iterator.

- it returned an empty rect when the region was empty, instead
of returning an empty list of rect.

- also fixed an infinite loop when boolean_operation was given
an empty list of rects

Change-Id: I62225c7dcd2832025bb8f12e6cb3762f2a7b36cb
This commit is contained in:
Mathias Agopian 2012-04-16 18:40:30 -07:00
parent 0c8ecacb37
commit 3aecbb0715
2 changed files with 39 additions and 14 deletions

View File

@ -96,6 +96,11 @@ private:
class SpannerBase class SpannerBase
{ {
public: public:
SpannerBase()
: lhs_head(max_value), lhs_tail(max_value),
rhs_head(max_value), rhs_tail(max_value) {
}
enum { enum {
lhs_before_rhs = 0, lhs_before_rhs = 0,
lhs_after_rhs = 1, lhs_after_rhs = 1,
@ -158,12 +163,16 @@ private:
public: public:
inline Spanner(const region& lhs, const region& rhs) inline Spanner(const region& lhs, const region& rhs)
: lhs(lhs), rhs(rhs) : lhs(lhs), rhs(rhs)
{ {
SpannerBase::lhs_head = lhs.rects->top + lhs.dy; if (lhs.count) {
SpannerBase::lhs_tail = lhs.rects->bottom + lhs.dy; SpannerBase::lhs_head = lhs.rects->top + lhs.dy;
SpannerBase::rhs_head = rhs.rects->top + rhs.dy; SpannerBase::lhs_tail = lhs.rects->bottom + lhs.dy;
SpannerBase::rhs_tail = rhs.rects->bottom + rhs.dy; }
if (rhs.count) {
SpannerBase::rhs_head = rhs.rects->top + rhs.dy;
SpannerBase::rhs_tail = rhs.rects->bottom + rhs.dy;
}
} }
inline bool isDone() const { inline bool isDone() const {
@ -221,20 +230,28 @@ private:
inline void prepare(int inside) { inline void prepare(int inside) {
if (inside == SpannerBase::lhs_before_rhs) { if (inside == SpannerBase::lhs_before_rhs) {
SpannerBase::lhs_head = lhs.rects->left + lhs.dx; if (lhs.count) {
SpannerBase::lhs_tail = lhs.rects->right + lhs.dx; SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
}
SpannerBase::rhs_head = max_value; SpannerBase::rhs_head = max_value;
SpannerBase::rhs_tail = max_value; SpannerBase::rhs_tail = max_value;
} else if (inside == SpannerBase::lhs_after_rhs) { } else if (inside == SpannerBase::lhs_after_rhs) {
SpannerBase::lhs_head = max_value; SpannerBase::lhs_head = max_value;
SpannerBase::lhs_tail = max_value; SpannerBase::lhs_tail = max_value;
SpannerBase::rhs_head = rhs.rects->left + rhs.dx; if (rhs.count) {
SpannerBase::rhs_tail = rhs.rects->right + rhs.dx; SpannerBase::rhs_head = rhs.rects->left + rhs.dx;
SpannerBase::rhs_tail = rhs.rects->right + rhs.dx;
}
} else { } else {
SpannerBase::lhs_head = lhs.rects->left + lhs.dx; if (lhs.count) {
SpannerBase::lhs_tail = lhs.rects->right + lhs.dx; SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
SpannerBase::rhs_head = rhs.rects->left + rhs.dx; SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
SpannerBase::rhs_tail = rhs.rects->right + rhs.dx; }
if (rhs.count) {
SpannerBase::rhs_head = rhs.rects->left + rhs.dx;
SpannerBase::rhs_tail = rhs.rects->right + rhs.dx;
}
} }
} }

View File

@ -619,7 +619,15 @@ Region::const_iterator Region::begin() const {
} }
Region::const_iterator Region::end() const { Region::const_iterator Region::end() const {
return isRect() ? ((&mBounds) + 1) : (mStorage.array() + mStorage.size()); if (isRect()) {
if (isEmpty()) {
return &mBounds;
} else {
return &mBounds + 1;
}
} else {
return mStorage.array() + mStorage.size();
}
} }
Rect const* Region::getArray(size_t* count) const { Rect const* Region::getArray(size_t* count) const {