Merge "fix the float Rect in OpenGLRenderer to handle NANs"
This commit is contained in:
committed by
Android (Google) Code Review
commit
44bfbbe501
@@ -27,7 +27,7 @@ namespace android {
|
|||||||
class Rect : public ARect
|
class Rect : public ARect
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef int32_t value_type;
|
typedef ARect::value_type value_type;
|
||||||
|
|
||||||
// we don't provide copy-ctor and operator= on purpose
|
// we don't provide copy-ctor and operator= on purpose
|
||||||
// because we want the compiler generated versions
|
// because we want the compiler generated versions
|
||||||
|
|||||||
@@ -28,7 +28,19 @@ namespace uirenderer {
|
|||||||
// Structs
|
// 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 left;
|
||||||
float top;
|
float top;
|
||||||
float right;
|
float right;
|
||||||
@@ -37,6 +49,9 @@ struct Rect {
|
|||||||
// Used by Region
|
// Used by Region
|
||||||
typedef float value_type;
|
typedef float value_type;
|
||||||
|
|
||||||
|
// we don't provide copy-ctor and operator= on purpose
|
||||||
|
// because we want the compiler generated versions
|
||||||
|
|
||||||
inline Rect():
|
inline Rect():
|
||||||
left(0),
|
left(0),
|
||||||
top(0),
|
top(0),
|
||||||
@@ -58,24 +73,6 @@ struct Rect {
|
|||||||
bottom(height) {
|
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) {
|
friend int operator==(const Rect& a, const Rect& b) {
|
||||||
return !memcmp(&a, &b, sizeof(a));
|
return !memcmp(&a, &b, sizeof(a));
|
||||||
}
|
}
|
||||||
@@ -89,7 +86,9 @@ struct Rect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline bool isEmpty() const {
|
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() {
|
inline void setEmpty() {
|
||||||
@@ -115,27 +114,18 @@ struct Rect {
|
|||||||
return bottom - top;
|
return bottom - top;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool intersects(float left, float top, float right, float bottom) const {
|
bool intersects(float l, float t, float r, float b) const {
|
||||||
return left < right && top < bottom &&
|
return !intersectWith(l,t,r,b).isEmpty();
|
||||||
this->left < this->right && this->top < this->bottom &&
|
|
||||||
this->left < right && left < this->right &&
|
|
||||||
this->top < bottom && top < this->bottom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool intersects(const Rect& r) const {
|
bool intersects(const Rect& r) const {
|
||||||
return intersects(r.left, r.top, r.right, r.bottom);
|
return intersects(r.left, r.top, r.right, r.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool intersect(float left, float top, float right, float bottom) {
|
bool intersect(float l, float t, float r, float b) {
|
||||||
if (left < right && top < bottom && !this->isEmpty() &&
|
Rect tmp(intersectWith(l,t,r,b));
|
||||||
this->left < right && left < this->right &&
|
if (!tmp.isEmpty()) {
|
||||||
this->top < bottom && top < this->bottom) {
|
set(tmp);
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -182,7 +172,7 @@ struct Rect {
|
|||||||
LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
|
LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // struct Rect
|
}; // class Rect
|
||||||
|
|
||||||
}; // namespace uirenderer
|
}; // namespace uirenderer
|
||||||
}; // namespace android
|
}; // namespace android
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct ARect {
|
typedef struct ARect {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
typedef int32_t value_type;
|
||||||
|
#endif
|
||||||
int32_t left;
|
int32_t left;
|
||||||
int32_t top;
|
int32_t top;
|
||||||
int32_t right;
|
int32_t right;
|
||||||
|
|||||||
Reference in New Issue
Block a user