add integer version of aabb
diff --git a/include/rive/math/aabb.hpp b/include/rive/math/aabb.hpp index f886466..9f9151e 100644 --- a/include/rive/math/aabb.hpp +++ b/include/rive/math/aabb.hpp
@@ -6,6 +6,21 @@ #include <cstddef> namespace rive { + struct IAABB { + int32_t left, top, right, bottom; + + constexpr int width() const { return right - left; } + constexpr int height() const { return bottom - top; } + constexpr bool empty() const { return width() <= 0 || height() <= 0; } + + IAABB inset(int dx, int dy) const { + return {left + dx, top + dy, right - dx, bottom - dy}; + } + IAABB offset(int dx, int dy) const { + return {left + dx, top + dy, right + dx, bottom + dy}; + } + }; + class AABB { public: union { @@ -20,11 +35,15 @@ AABB(const AABB& o) : minX(o.minX), minY(o.minY), maxX(o.maxX), maxY(o.maxY) {} - + AABB(float minX, float minY, float maxX, float maxY) : minX(minX), minY(minY), maxX(maxX), maxY(maxY) {} + AABB(const IAABB& o) : + AABB((float)o.left, (float)o.top, (float)o.right, (float)o.bottom) + {} + bool operator==(const AABB& o) const { return minX == o.minX && minY == o.minY && maxX == o.maxX && maxY == o.maxY; @@ -67,6 +86,9 @@ AABB offset(float dx, float dy) const { return {minX + dx, minY + dy, maxX + dx, maxY + dy}; } + + IAABB round() const; }; + } // namespace rive #endif
diff --git a/src/math/aabb.cpp b/src/math/aabb.cpp index 0bf16a9..5e77188 100644 --- a/src/math/aabb.cpp +++ b/src/math/aabb.cpp
@@ -43,3 +43,21 @@ out[2] = std::fmax(p1[0], std::fmax(p2[0], std::fmax(p3[0], p4[0]))); out[3] = std::fmax(p1[1], std::fmax(p2[1], std::fmax(p3[1], p4[1]))); } + +static inline float graphics_roundf(float x) { + return std::floor(x + 0.5f); +} + +static inline int graphics_round(float x) { + return (int)graphics_roundf(x); +} + +IAABB AABB::round() const { + return { + graphics_round(left()), + graphics_round(top()), + graphics_round(right()), + graphics_round(bottom()), + }; +} +