diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2020-01-14 18:18:41 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2020-01-14 18:30:38 +0300 |
commit | 388d43d85a5d9dfc5261848c91c12dd883ea1f59 (patch) | |
tree | 0dc68b299c2bb95671265514dfebe3e35ecfd096 /source/blender/blenlib/intern/rct.c | |
parent | 473fc35c70ecf6f64c46be66046cac2a919f633b (diff) |
BLI_rct: Utilities for sanitizing coordinates (ensuring min <= max)
This might be useful in some places. Much of the code makes the implicit
assumption that the rectangle has valid coordinate order, good to make
it more explicit.
Diffstat (limited to 'source/blender/blenlib/intern/rct.c')
-rw-r--r-- | source/blender/blenlib/intern/rct.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index ecff2ebffef..5fb33072231 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -477,6 +477,50 @@ void BLI_rcti_init(rcti *rect, int xmin, int xmax, int ymin, int ymax) } } +/** + * Check if X-min and Y-min are less than or equal to X-max and Y-max, respectively. + * If this returns false, #BLI_rctf_sanitize() can be called to address this. + * + * This is not a hard constraint or invariant for rectangles, in some cases it may be useful to + * have max < min. Usually this is what you'd want though. + */ +bool BLI_rctf_is_valid(const rctf *rect) +{ + return (rect->xmin <= rect->xmax) && (rect->ymin <= rect->ymax); +} + +bool BLI_rcti_is_valid(const rcti *rect) +{ + return (rect->xmin <= rect->xmax) && (rect->ymin <= rect->ymax); +} + +/** + * Ensure X-min and Y-min are less than or equal to X-max and Y-max, respectively. + */ +void BLI_rctf_sanitize(rctf *rect) +{ + if (rect->xmin > rect->xmax) { + SWAP(float, rect->xmin, rect->xmax); + } + if (rect->ymin > rect->ymax) { + SWAP(float, rect->ymin, rect->ymax); + } + + BLI_assert(BLI_rctf_is_valid(rect)); +} + +void BLI_rcti_sanitize(rcti *rect) +{ + if (rect->xmin > rect->xmax) { + SWAP(int, rect->xmin, rect->xmax); + } + if (rect->ymin > rect->ymax) { + SWAP(int, rect->ymin, rect->ymax); + } + + BLI_assert(BLI_rcti_is_valid(rect)); +} + void BLI_rctf_init_pt_radius(rctf *rect, const float xy[2], float size) { rect->xmin = xy[0] - size; |