diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/geometry_func.cpp | 22 | ||||
-rw-r--r-- | src/core/geometry_func.hpp | 12 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/core/geometry_func.cpp b/src/core/geometry_func.cpp index 89e70fb5b..dccef72ec 100644 --- a/src/core/geometry_func.cpp +++ b/src/core/geometry_func.cpp @@ -26,3 +26,25 @@ Dimension maxdim(const Dimension &d1, const Dimension &d2) d.height = std::max(d1.height, d2.height); return d; } + +/** + * Compute the bounding rectangle around two rectangles. + * @param r1 First rectangle. + * @param r2 Second rectangle. + * @return The bounding rectangle, the smallest rectangle that contains both arguments. + */ +Rect BoundingRect(const Rect &r1, const Rect &r2) +{ + /* If either the first or the second is empty, return the other. */ + if (IsEmptyRect(r1)) return r2; + if (IsEmptyRect(r2)) return r1; + + Rect r; + + r.top = std::min(r1.top, r2.top); + r.bottom = std::max(r1.bottom, r2.bottom); + r.left = std::min(r1.left, r2.left); + r.right = std::max(r1.right, r2.right); + + return r; +} diff --git a/src/core/geometry_func.hpp b/src/core/geometry_func.hpp index cd136488a..41df35945 100644 --- a/src/core/geometry_func.hpp +++ b/src/core/geometry_func.hpp @@ -14,4 +14,16 @@ Dimension maxdim(const Dimension &d1, const Dimension &d2); +/** + * Check if a rectangle is empty. + * @param r Rectangle to check. + * @return True if and only if the rectangle doesn't define space. + */ +static inline bool IsEmptyRect(const Rect &r) +{ + return (r.left | r.top | r.right | r.bottom) == 0; +} + +Rect BoundingRect(const Rect &r1, const Rect &r2); + #endif /* GEOMETRY_FUNC_HPP */ |