summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/geometry_func.cpp22
-rw-r--r--src/core/geometry_func.hpp12
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 */