diff --git a/include/ui/Rect.h b/include/ui/Rect.h index 4e65a2d0b9fe7..9e98bc5620266 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 71951b7a3cc82..edc90e1f052f6 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 (ab) ? 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 3e81f531db819..64d487dc259a9 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;