diff options
author | Mathias Agopian <mathias@google.com> | 2011-09-19 16:00:46 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2011-09-19 16:50:07 -0700 |
commit | 83b186a246e8ffd52b91a17c0019dd8c9c9d21b1 (patch) | |
tree | 0cd1c181c99cb42a8775a27b7911e62d20945ddd | |
parent | 4b5441a7201a2f28becf3ab7fb33694f137e1998 (diff) | |
download | frameworks_base-83b186a246e8ffd52b91a17c0019dd8c9c9d21b1.zip frameworks_base-83b186a246e8ffd52b91a17c0019dd8c9c9d21b1.tar.gz frameworks_base-83b186a246e8ffd52b91a17c0019dd8c9c9d21b1.tar.bz2 |
fix the float Rect in OpenGLRenderer to handle NANs
- we want functions like isEmpty() to return true if NANs are
involved in the Rect
- also clean-up the intersect familly of calls
- minor cleanup in the int32_t Rect as well
These played a role in http://b/5331198.
Bug: 5331198
Change-Id: I5369725ab482e4b83da9f1bd4cee5256e5de75b2
-rw-r--r-- | include/ui/Rect.h | 2 | ||||
-rw-r--r-- | libs/hwui/Rect.h | 62 | ||||
-rw-r--r-- | native/include/android/rect.h | 3 |
3 files changed, 30 insertions, 37 deletions
diff --git a/include/ui/Rect.h b/include/ui/Rect.h index 4e65a2d..9e98bc5 100644 --- a/include/ui/Rect.h +++ b/include/ui/Rect.h @@ -27,7 +27,7 @@ namespace android { class Rect : public ARect { public: - typedef int32_t value_type; + typedef ARect::value_type value_type; // we don't provide copy-ctor and operator= on purpose // because we want the compiler generated versions diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h index 71951b7..edc90e1 100644 --- a/libs/hwui/Rect.h +++ b/libs/hwui/Rect.h @@ -28,7 +28,19 @@ namespace uirenderer { // Structs /////////////////////////////////////////////////////////////////////////////// -struct Rect { +class Rect { + static inline float min(float a, float b) { return (a<b) ? a : b; } + static inline float max(float a, float b) { return (a>b) ? a : b; } + Rect intersectWith(float l, float t, float r, float b) const { + Rect tmp; + tmp.left = max(left, l); + tmp.top = max(top, t); + tmp.right = min(right, r); + tmp.bottom = min(bottom, b); + return tmp; + } + +public: float left; float top; float right; @@ -37,6 +49,9 @@ struct Rect { // Used by Region typedef float value_type; + // we don't provide copy-ctor and operator= on purpose + // because we want the compiler generated versions + inline Rect(): left(0), top(0), @@ -58,24 +73,6 @@ struct Rect { bottom(height) { } - inline Rect(const Rect& r) { - set(r); - } - - inline Rect(Rect& r) { - set(r); - } - - Rect& operator=(const Rect& r) { - set(r); - return *this; - } - - Rect& operator=(Rect& r) { - set(r); - return *this; - } - friend int operator==(const Rect& a, const Rect& b) { return !memcmp(&a, &b, sizeof(a)); } @@ -89,7 +86,9 @@ struct Rect { } inline bool isEmpty() const { - return left >= right || top >= bottom; + // this is written in such way this it'll handle NANs to return + // true (empty) + return !((left < right) && (top < bottom)); } inline void setEmpty() { @@ -115,27 +114,18 @@ struct Rect { return bottom - top; } - bool intersects(float left, float top, float right, float bottom) const { - return left < right && top < bottom && - this->left < this->right && this->top < this->bottom && - this->left < right && left < this->right && - this->top < bottom && top < this->bottom; + bool intersects(float l, float t, float r, float b) const { + return !intersectWith(l,t,r,b).isEmpty(); } bool intersects(const Rect& r) const { return intersects(r.left, r.top, r.right, r.bottom); } - bool intersect(float left, float top, float right, float bottom) { - if (left < right && top < bottom && !this->isEmpty() && - this->left < right && left < this->right && - this->top < bottom && top < this->bottom) { - - if (this->left < left) this->left = left; - if (this->top < top) this->top = top; - if (this->right > right) this->right = right; - if (this->bottom > bottom) this->bottom = bottom; - + bool intersect(float l, float t, float r, float b) { + Rect tmp(intersectWith(l,t,r,b)); + if (!tmp.isEmpty()) { + set(tmp); return true; } return false; @@ -182,7 +172,7 @@ struct Rect { LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom); } -}; // struct Rect +}; // class Rect }; // namespace uirenderer }; // namespace android diff --git a/native/include/android/rect.h b/native/include/android/rect.h index 3e81f53..64d487d 100644 --- a/native/include/android/rect.h +++ b/native/include/android/rect.h @@ -23,6 +23,9 @@ extern "C" { #endif typedef struct ARect { +#ifdef __cplusplus + typedef int32_t value_type; +#endif int32_t left; int32_t top; int32_t right; |