void box_union(struct wlr_box *box_dest, struct wlr_box *box_a,
struct wlr_box *box_b);
+/*
+ * Centers a content box (width & height) within a reference box,
+ * limiting it (if possible) to not extend outside a bounding box.
+ *
+ * The reference box and bounding box are often the same but could be
+ * different (e.g. when centering a view within its parent but limiting
+ * to usable output area).
+ */
+void box_center(int width, int height, const struct wlr_box *ref,
+ const struct wlr_box *bound, int *x, int *y);
+
/*
* Fits and centers a content box (width & height) within a bounding box.
* The content box is downscaled if necessary (preserving aspect ratio) but
box_dest->height = y2 - y1;
}
+void
+box_center(int width, int height, const struct wlr_box *ref,
+ const struct wlr_box *bound, int *x, int *y)
+{
+ *x = ref->x + (ref->width - width) / 2;
+ *y = ref->y + (ref->height - height) / 2;
+
+ if (*x < bound->x) {
+ *x = bound->x;
+ } else if (*x + width > bound->x + bound->width) {
+ *x = bound->x + bound->width - width;
+ }
+ if (*y < bound->y) {
+ *y = bound->y;
+ } else if (*y + height > bound->y + bound->height) {
+ *y = bound->y + bound->height - height;
+ }
+}
+
struct wlr_box
box_fit_within(int width, int height, struct wlr_box *bound)
{
int height = h + margin.top + margin.bottom;
/* If reference box is NULL then center to usable area */
- if (!ref) {
- ref = &usable;
- }
- *x = ref->x + (ref->width - width) / 2;
- *y = ref->y + (ref->height - height) / 2;
-
- /* Fit the view within the usable area */
- if (*x < usable.x) {
- *x = usable.x;
- } else if (*x + width > usable.x + usable.width) {
- *x = usable.x + usable.width - width;
- }
- if (*y < usable.y) {
- *y = usable.y;
- } else if (*y + height > usable.y + usable.height) {
- *y = usable.y + usable.height - height;
- }
+ box_center(width, height, ref ? ref : &usable, &usable, x, y);
*x += margin.left;
*y += margin.top;