summaryrefslogtreecommitdiffstats
path: root/include/private
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-04-16 18:40:30 -0700
committerMathias Agopian <mathias@google.com>2012-04-16 18:40:30 -0700
commit3aecbb0715cb6928e0530ff1e4caa9c0993cc371 (patch)
treefa74d2ee33fab79da3a3c96b3a4721f6949392a6 /include/private
parent0c8ecacb370b5f7ee6f0fc1fb2ae978f9b670c6d (diff)
downloadframeworks_native-3aecbb0715cb6928e0530ff1e4caa9c0993cc371.zip
frameworks_native-3aecbb0715cb6928e0530ff1e4caa9c0993cc371.tar.gz
frameworks_native-3aecbb0715cb6928e0530ff1e4caa9c0993cc371.tar.bz2
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
Diffstat (limited to 'include/private')
-rw-r--r--include/private/ui/RegionHelper.h43
1 files changed, 30 insertions, 13 deletions
diff --git a/include/private/ui/RegionHelper.h b/include/private/ui/RegionHelper.h
index 8d76533..421bdda 100644
--- a/include/private/ui/RegionHelper.h
+++ b/include/private/ui/RegionHelper.h
@@ -96,6 +96,11 @@ private:
class SpannerBase
{
public:
+ SpannerBase()
+ : lhs_head(max_value), lhs_tail(max_value),
+ rhs_head(max_value), rhs_tail(max_value) {
+ }
+
enum {
lhs_before_rhs = 0,
lhs_after_rhs = 1,
@@ -158,12 +163,16 @@ private:
public:
inline Spanner(const region& lhs, const region& rhs)
- : lhs(lhs), rhs(rhs)
+ : lhs(lhs), rhs(rhs)
{
- SpannerBase::lhs_head = lhs.rects->top + lhs.dy;
- SpannerBase::lhs_tail = lhs.rects->bottom + lhs.dy;
- SpannerBase::rhs_head = rhs.rects->top + rhs.dy;
- SpannerBase::rhs_tail = rhs.rects->bottom + rhs.dy;
+ if (lhs.count) {
+ SpannerBase::lhs_head = lhs.rects->top + lhs.dy;
+ SpannerBase::lhs_tail = lhs.rects->bottom + lhs.dy;
+ }
+ if (rhs.count) {
+ SpannerBase::rhs_head = rhs.rects->top + rhs.dy;
+ SpannerBase::rhs_tail = rhs.rects->bottom + rhs.dy;
+ }
}
inline bool isDone() const {
@@ -221,20 +230,28 @@ private:
inline void prepare(int inside) {
if (inside == SpannerBase::lhs_before_rhs) {
- SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
- SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
+ if (lhs.count) {
+ SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
+ SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
+ }
SpannerBase::rhs_head = max_value;
SpannerBase::rhs_tail = max_value;
} else if (inside == SpannerBase::lhs_after_rhs) {
SpannerBase::lhs_head = max_value;
SpannerBase::lhs_tail = max_value;
- SpannerBase::rhs_head = rhs.rects->left + rhs.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;
+ }
} else {
- SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
- SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
- SpannerBase::rhs_head = rhs.rects->left + rhs.dx;
- SpannerBase::rhs_tail = rhs.rects->right + rhs.dx;
+ if (lhs.count) {
+ SpannerBase::lhs_head = lhs.rects->left + lhs.dx;
+ SpannerBase::lhs_tail = lhs.rects->right + lhs.dx;
+ }
+ if (rhs.count) {
+ SpannerBase::rhs_head = rhs.rects->left + rhs.dx;
+ SpannerBase::rhs_tail = rhs.rects->right + rhs.dx;
+ }
}
}