| #include "rive/math/aabb.hpp" | 
 | #include <cmath> | 
 |  | 
 | using namespace rive; | 
 |  | 
 | AABB::AABB() : buffer{0} {} | 
 |  | 
 | AABB::AABB(const AABB& copy) | 
 | { | 
 |     buffer[0] = copy.buffer[0]; | 
 |     buffer[1] = copy.buffer[1]; | 
 |     buffer[2] = copy.buffer[2]; | 
 |     buffer[3] = copy.buffer[3]; | 
 | } | 
 |  | 
 | AABB::AABB(float minX, float minY, float maxX, float maxY) : | 
 |     buffer{minX, minY, maxX, maxY} | 
 | { | 
 | } | 
 |  | 
 | void AABB::center(Vec2D& out, const AABB& a) | 
 | { | 
 |     out[0] = (a[0] + a[2]) * 0.5f; | 
 |     out[1] = (a[1] + a[3]) * 0.5f; | 
 | } | 
 |  | 
 | void AABB::size(Vec2D& out, const AABB& a) | 
 | { | 
 |     out[0] = a[2] - a[0]; | 
 |     out[1] = a[3] - a[1]; | 
 | } | 
 |  | 
 | void AABB::extents(Vec2D& out, const AABB& a) | 
 | { | 
 |     out[0] = (a[2] - a[0]) * 0.5; | 
 |     out[1] = (a[3] - a[1]) * 0.5; | 
 | } | 
 |  | 
 | void AABB::combine(AABB& out, const AABB& a, const AABB& b) {} | 
 |  | 
 | bool AABB::contains(const AABB& a, const AABB& b) | 
 | { | 
 |     return a[0] <= b[0] && a[1] <= b[1] && b[2] <= a[2] && b[3] <= a[3]; | 
 | } | 
 |  | 
 | bool AABB::isValid(const AABB& a) | 
 | { | 
 |     float dx = a[2] - a[0]; | 
 |     float dy = a[3] - a[1]; | 
 |     return dx >= 0.0f && dy >= 0.0f && std::isfinite(a[0]) && | 
 |            std::isfinite(a[1]) && std::isfinite(a[2]) && std::isfinite(a[3]); | 
 | } | 
 |  | 
 | bool AABB::testOverlap(const AABB& a, const AABB& b) | 
 | { | 
 |     float d1x = b[0] - a[2]; | 
 |     float d1y = b[1] - a[3]; | 
 |  | 
 |     float d2x = a[0] - b[2]; | 
 |     float d2y = a[1] - b[3]; | 
 |  | 
 |     if (d1x > 0.0 || d1y > 0.0) | 
 |     { | 
 |         return false; | 
 |     } | 
 |  | 
 |     if (d2x > 0.0 || d2y > 0.0) | 
 |     { | 
 |         return false; | 
 |     } | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | bool AABB::areIdentical(const AABB& a, const AABB& b) | 
 | { | 
 |     return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3]; | 
 | } | 
 |  | 
 | float AABB::width() const { return buffer[2] - buffer[0]; } | 
 |  | 
 | float AABB::height() const { return buffer[3] - buffer[1]; } | 
 |  | 
 | float AABB::perimeter() const | 
 | { | 
 |     float wx = buffer[2] - buffer[0]; | 
 |     float wy = buffer[3] - buffer[1]; | 
 |     return 2.0 * (wx + wy); | 
 | } | 
 |  | 
 | void AABB::transform(AABB& out, const AABB& a, const Mat2D& matrix) | 
 | { | 
 |     Vec2D p1(a[0], a[1]); | 
 |     Vec2D p2(a[2], a[1]); | 
 |     Vec2D p3(a[2], a[3]); | 
 |     Vec2D p4(a[0], a[3]); | 
 |  | 
 |     Vec2D::transform(p1, p1, matrix); | 
 |     Vec2D::transform(p2, p2, matrix); | 
 |     Vec2D::transform(p3, p3, matrix); | 
 |     Vec2D::transform(p4, p4, matrix); | 
 |  | 
 |     out[0] = std::fmin(p1[0], std::fmin(p2[0], std::fmin(p3[0], p4[0]))); | 
 |     out[1] = std::fmin(p1[1], std::fmin(p2[1], std::fmin(p3[1], p4[1]))); | 
 |     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]))); | 
 | } |