Index: core/include/fxcrt/fx_coordinates.h |
diff --git a/core/include/fxcrt/fx_coordinates.h b/core/include/fxcrt/fx_coordinates.h |
index c6bf2300146148e6543955ffcc4c4ef36cb8a4e4..e2800ffdb09eda6e2d9b5bb85870f040a7fb8ea9 100644 |
--- a/core/include/fxcrt/fx_coordinates.h |
+++ b/core/include/fxcrt/fx_coordinates.h |
@@ -120,6 +120,193 @@ class CFX_VTemplate : public CFX_PSTemplate<BaseType> { |
typedef CFX_VTemplate<int32_t> CFX_Vector; |
typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF; |
+// Rectangles. |
+// TODO(tsepez): Consolidate all these different rectangle classes. |
+ |
+// LTRB rectangles (y-axis runs downwards). |
+struct FX_SMALL_RECT { |
+ FX_SMALL_RECT() : FX_SMALL_RECT(kInvalid, kInvalid, kInvalid, kInvalid) {} |
+ |
+ FX_SMALL_RECT(int16_t l, int16_t t, int16_t r, int16_t b) |
+ : left(l), top(t), right(r), bottom(b) {} |
+ |
+ static const int16_t kInvalid = -1; |
+ |
+ int16_t left; |
+ int16_t top; |
+ int16_t right; |
+ int16_t bottom; |
+}; |
+ |
+struct FX_RECT { |
+ FX_RECT() : left(0), top(0), right(0), bottom(0) {} |
+ |
+ FX_RECT(int l, int t, int r, int b) : left(l), top(t), right(r), bottom(b) {} |
+ |
+ explicit FX_RECT(const FX_SMALL_RECT& small) |
+ : FX_RECT(small.left, small.top, small.right, small.bottom) {} |
+ |
+ int Width() const { return right - left; } |
+ int Height() const { return bottom - top; } |
+ bool IsEmpty() const { return right <= left || bottom <= top; } |
+ |
+ void Normalize(); |
+ |
+ void Intersect(const FX_RECT& src); |
+ void Intersect(int l, int t, int r, int b) { Intersect(FX_RECT(l, t, r, b)); } |
+ |
+ void Union(const FX_RECT& other_rect); |
+ void Union(int l, int t, int r, int b) { Union(FX_RECT(l, t, r, b)); } |
+ |
+ void Offset(int dx, int dy) { |
+ left += dx; |
+ right += dx; |
+ top += dy; |
+ bottom += dy; |
+ } |
+ |
+ bool operator==(const FX_RECT& src) const { |
+ return left == src.left && right == src.right && top == src.top && |
+ bottom == src.bottom; |
+ } |
+ |
+ FX_BOOL Contains(const FX_RECT& other_rect) const { |
+ return other_rect.left >= left && other_rect.right <= right && |
+ other_rect.top >= top && other_rect.bottom <= bottom; |
+ } |
+ |
+ FX_BOOL Contains(int x, int y) const { |
+ return x >= left && x < right && y >= top && y < bottom; |
+ } |
+ |
+ FX_SMALL_RECT ToSmallRect() const { |
+ return FX_SMALL_RECT( |
+ static_cast<uint16_t>(left), static_cast<uint16_t>(top), |
+ static_cast<uint16_t>(right), static_cast<uint16_t>(bottom)); |
+ } |
+ |
+ int left; |
+ int top; |
+ int right; |
+ int bottom; |
+}; |
+ |
+// LBRT rectangles (y-axis runs upwards). |
+class CFX_FloatPoint { |
+ public: |
+ CFX_FloatPoint(FX_FLOAT xx, FX_FLOAT yy) : x(xx), y(yy) {} |
+ |
+ FX_FLOAT x; |
+ FX_FLOAT y; |
+}; |
+ |
+class CFX_FloatRect { |
+ public: |
+ CFX_FloatRect() : CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f) {} |
+ CFX_FloatRect(FX_FLOAT l, FX_FLOAT b, FX_FLOAT r, FX_FLOAT t) |
+ : left(l), bottom(b), right(r), top(t) {} |
+ |
+ explicit CFX_FloatRect(const FX_FLOAT* pArray) |
+ : CFX_FloatRect(pArray[0], pArray[1], pArray[2], pArray[3]) {} |
+ |
+ explicit CFX_FloatRect(const FX_RECT& rect); |
+ |
+ void Normalize(); |
+ |
+ void Reset() { |
+ left = 0.0f; |
+ right = 0.0f; |
+ bottom = 0.0f; |
+ top = 0.0f; |
+ } |
+ |
+ FX_BOOL IsEmpty() const { return left >= right || bottom >= top; } |
+ FX_BOOL Contains(const CFX_FloatRect& other_rect) const; |
+ FX_BOOL Contains(FX_FLOAT x, FX_FLOAT y) const; |
+ |
+ void Transform(const CFX_Matrix* pMatrix); |
+ void Intersect(const CFX_FloatRect& other_rect); |
+ void Union(const CFX_FloatRect& other_rect); |
+ |
+ FX_RECT GetInnerRect() const; |
+ FX_RECT GetOutterRect() const; |
+ FX_RECT GetClosestRect() const; |
+ |
+ int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects); |
+ |
+ void InitRect(FX_FLOAT x, FX_FLOAT y) { |
+ left = x; |
+ right = x; |
+ bottom = y; |
+ top = y; |
+ } |
+ void UpdateRect(FX_FLOAT x, FX_FLOAT y); |
+ |
+ FX_FLOAT Width() const { return right - left; } |
+ FX_FLOAT Height() const { return top - bottom; } |
+ |
+ void Inflate(FX_FLOAT x, FX_FLOAT y) { |
+ Normalize(); |
+ left -= x; |
+ right += x; |
+ bottom -= y; |
+ top += y; |
+ } |
+ |
+ void Inflate(FX_FLOAT other_left, |
+ FX_FLOAT other_bottom, |
+ FX_FLOAT other_right, |
+ FX_FLOAT other_top) { |
+ Normalize(); |
+ left -= other_left; |
+ bottom -= other_bottom; |
+ right += other_right; |
+ top += other_top; |
+ } |
+ |
+ void Inflate(const CFX_FloatRect& rt) { |
+ Inflate(rt.left, rt.bottom, rt.right, rt.top); |
+ } |
+ |
+ void Deflate(FX_FLOAT x, FX_FLOAT y) { |
+ Normalize(); |
+ left += x; |
+ right -= x; |
+ bottom += y; |
+ top -= y; |
+ } |
+ |
+ void Deflate(FX_FLOAT other_left, |
+ FX_FLOAT other_bottom, |
+ FX_FLOAT other_right, |
+ FX_FLOAT other_top) { |
+ Normalize(); |
+ left += other_left; |
+ bottom += other_bottom; |
+ right -= other_right; |
+ top -= other_top; |
+ } |
+ |
+ void Deflate(const CFX_FloatRect& rt) { |
+ Deflate(rt.left, rt.bottom, rt.right, rt.top); |
+ } |
+ |
+ void Translate(FX_FLOAT e, FX_FLOAT f) { |
+ left += e; |
+ right += e; |
+ top += f; |
+ bottom += f; |
+ } |
+ |
+ static CFX_FloatRect GetBBox(const CFX_PointF* pPoints, int nPoints); |
+ |
+ FX_FLOAT left; |
+ FX_FLOAT bottom; |
+ FX_FLOAT right; |
+ FX_FLOAT top; |
+}; |
+ |
+// LTWH rectangles (y-axis runs downwards). |
template <class baseType> |
class CFX_RTemplate { |
public: |
@@ -350,197 +537,6 @@ typedef CFX_RTemplate<FX_FLOAT>* FX_LPRECTF; |
typedef CFX_RTemplate<int32_t> const* FX_LPCRECT; |
typedef CFX_RTemplate<FX_FLOAT> const* FX_LPCRECTF; |
typedef CFX_ArrayTemplate<CFX_RectF> CFX_RectFArray; |
-struct FX_RECT { |
- int left; |
- |
- int top; |
- |
- int right; |
- |
- int bottom; |
- |
- FX_RECT() : left(0), top(0), right(0), bottom(0) {} |
- |
- FX_RECT(int left1, int top1, int right1, int bottom1) { |
- left = left1; |
- top = top1; |
- right = right1; |
- bottom = bottom1; |
- } |
- |
- int Width() const { return right - left; } |
- |
- int Height() const { return bottom - top; } |
- |
- FX_BOOL IsEmpty() const { return right <= left || bottom <= top; } |
- |
- void Normalize(); |
- |
- void Intersect(const FX_RECT& src); |
- |
- void Intersect(int left1, int top1, int right1, int bottom1) { |
- Intersect(FX_RECT(left1, top1, right1, bottom1)); |
- } |
- |
- void Union(const FX_RECT& other_rect); |
- |
- bool operator==(const FX_RECT& src) const { |
- return left == src.left && right == src.right && top == src.top && |
- bottom == src.bottom; |
- } |
- |
- void Offset(int dx, int dy) { |
- left += dx; |
- right += dx; |
- top += dy; |
- bottom += dy; |
- } |
- |
- FX_BOOL Contains(const FX_RECT& other_rect) const { |
- return other_rect.left >= left && other_rect.right <= right && |
- other_rect.top >= top && other_rect.bottom <= bottom; |
- } |
- |
- FX_BOOL Contains(int x, int y) const { |
- return x >= left && x < right && y >= top && y < bottom; |
- } |
-}; |
-struct FX_SMALL_RECT { |
- int16_t Left; |
- |
- int16_t Top; |
- |
- int16_t Right; |
- |
- int16_t Bottom; |
-}; |
- |
-class CFX_FloatPoint { |
- public: |
- CFX_FloatPoint(FX_FLOAT xx, FX_FLOAT yy) : x(xx), y(yy) {} |
- |
- FX_FLOAT x; |
- FX_FLOAT y; |
-}; |
- |
-class CFX_FloatRect { |
- public: |
- CFX_FloatRect() { left = right = bottom = top = 0; } |
- |
- CFX_FloatRect(FX_FLOAT left1, |
- FX_FLOAT bottom1, |
- FX_FLOAT right1, |
- FX_FLOAT top1) { |
- left = left1; |
- bottom = bottom1; |
- right = right1; |
- top = top1; |
- } |
- |
- CFX_FloatRect(const FX_FLOAT* pArray) { |
- left = pArray[0]; |
- bottom = pArray[1]; |
- right = pArray[2]; |
- top = pArray[3]; |
- } |
- |
- CFX_FloatRect(const FX_RECT& rect); |
- |
- FX_BOOL IsEmpty() const { return left >= right || bottom >= top; } |
- |
- void Normalize(); |
- |
- void Reset() { left = right = bottom = top = 0; } |
- |
- FX_BOOL Contains(const CFX_FloatRect& other_rect) const; |
- |
- FX_BOOL Contains(FX_FLOAT x, FX_FLOAT y) const; |
- |
- void Transform(const CFX_Matrix* pMatrix); |
- |
- void Intersect(const CFX_FloatRect& other_rect); |
- |
- void Union(const CFX_FloatRect& other_rect); |
- |
- FX_RECT GetInnerRect() const; |
- |
- FX_RECT GetOutterRect() const; |
- |
- FX_RECT GetClosestRect() const; |
- |
- int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects); |
- |
- void InitRect(FX_FLOAT x, FX_FLOAT y) { |
- left = right = x; |
- bottom = top = y; |
- } |
- |
- void UpdateRect(FX_FLOAT x, FX_FLOAT y); |
- |
- FX_FLOAT Width() const { return right - left; } |
- |
- FX_FLOAT Height() const { return top - bottom; } |
- |
- void Inflate(FX_FLOAT x, FX_FLOAT y) { |
- Normalize(); |
- left -= x; |
- right += x; |
- bottom -= y; |
- top += y; |
- } |
- |
- void Inflate(FX_FLOAT other_left, |
- FX_FLOAT other_bottom, |
- FX_FLOAT other_right, |
- FX_FLOAT other_top) { |
- Normalize(); |
- left -= other_left; |
- bottom -= other_bottom; |
- right += other_right; |
- top += other_top; |
- } |
- |
- void Inflate(const CFX_FloatRect& rt) { |
- Inflate(rt.left, rt.bottom, rt.right, rt.top); |
- } |
- |
- void Deflate(FX_FLOAT x, FX_FLOAT y) { |
- Normalize(); |
- left += x; |
- right -= x; |
- bottom += y; |
- top -= y; |
- } |
- |
- void Deflate(FX_FLOAT other_left, |
- FX_FLOAT other_bottom, |
- FX_FLOAT other_right, |
- FX_FLOAT other_top) { |
- Normalize(); |
- left += other_left; |
- bottom += other_bottom; |
- right -= other_right; |
- top -= other_top; |
- } |
- |
- void Deflate(const CFX_FloatRect& rt) { |
- Deflate(rt.left, rt.bottom, rt.right, rt.top); |
- } |
- |
- void Translate(FX_FLOAT e, FX_FLOAT f) { |
- left += e; |
- right += e; |
- top += f; |
- bottom += f; |
- } |
- |
- static CFX_FloatRect GetBBox(const CFX_PointF* pPoints, int nPoints); |
- |
- FX_FLOAT left; |
- FX_FLOAT right; |
- FX_FLOAT bottom; |
- FX_FLOAT top; |
-}; |
class CFX_Matrix { |
public: |