/* * This is a stable interface of wlroots. Future changes will be limited to: * * - New functions * - New struct members * - New enum members * * Note that wlroots does not make an ABI compatibility promise - in the future, * the layout and size of structs used by wlroots may change, requiring code * depending on this header to be recompiled (but not edited). * * Breaking changes are announced in the release notes and follow a 1-year * deprecation schedule. */ #ifndef WLR_UTIL_BOX_H #define WLR_UTIL_BOX_H #include #include /** * A box representing a rectangle region in a 2D space. * * The x and y coordinates are inclusive, and the width and height lengths are * exclusive. In other words, the box starts from the coordinates (x, y), and * goes up to but not including (x + width, y + height). */ struct wlr_box { int x, y; int width, height; }; /** * A floating-point box representing a rectangle region in a 2D space. * * struct wlr_fbox has the same semantics as struct wlr_box. */ struct wlr_fbox { double x, y; double width, height; }; /** * Functions below accept NULL where a box is expected, which is treated * the same as an empty box. */ /** * Finds the closest point within the box bounds. * * Returns NAN if the box is empty. */ void wlr_box_closest_point(const struct wlr_box *box, double x, double y, double *dest_x, double *dest_y); /** * Gives the intersecting box between two struct wlr_box. * * Returns an empty box if the provided boxes don't intersect. */ bool wlr_box_intersection(struct wlr_box *dest, const struct wlr_box *box_a, const struct wlr_box *box_b); /** * Verifies if a point is contained within the bounds of a given struct wlr_box. * * For example: * * - A point at (100, 50) is not contained in the box (0, 0, 100, 50). * - A point at (10, 10) is contained in the box (10, 0, 50, 50). */ bool wlr_box_contains_point(const struct wlr_box *box, double x, double y); /** * Verifies that a box is fully contained within another box. * * Returns true if the "smaller" box is fully contained within the "bigger" box. * If either of the boxes are empty, false is returned. */ bool wlr_box_contains_box(const struct wlr_box *bigger, const struct wlr_box *smaller); /** * Checks whether a box is empty or not. * * A box is considered empty if its width and/or height is zero or negative. */ bool wlr_box_empty(const struct wlr_box *box); /** * Transforms a box inside a (0, 0, width, height) box. */ void wlr_box_transform(struct wlr_box *dest, const struct wlr_box *box, enum wl_output_transform transform, int width, int height); /** * Checks whether a box is empty or not. * * A box is considered empty if its width and/or height is zero or negative. */ bool wlr_fbox_empty(const struct wlr_fbox *box); /** * Transforms a floating-point box inside a (0, 0, width, height) box. */ void wlr_fbox_transform(struct wlr_fbox *dest, const struct wlr_fbox *box, enum wl_output_transform transform, double width, double height); #ifdef WLR_USE_UNSTABLE /** * Returns true if the two boxes are equal, false otherwise. */ bool wlr_box_equal(const struct wlr_box *a, const struct wlr_box *b); /** * Returns true if the two boxes are equal, false otherwise. */ bool wlr_fbox_equal(const struct wlr_fbox *a, const struct wlr_fbox *b); #endif #endif