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:
parent
0c8ecacb37
commit
3aecbb0715
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue