diff options
Diffstat (limited to 'firmware/export/rectangle.h')
-rw-r--r-- | firmware/export/rectangle.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/firmware/export/rectangle.h b/firmware/export/rectangle.h new file mode 100644 index 0000000000..0962611791 --- /dev/null +++ b/firmware/export/rectangle.h @@ -0,0 +1,75 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2022 Aidan MacDonald + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _RECTANGLE_H_ +#define _RECTANGLE_H_ + +#include <stdbool.h> + +struct rectangle +{ + int x, y, w, h; +}; + +/** Returns true if the rectangle is non-degenerate (positive width/height). */ +static inline bool rect_valid(const struct rectangle *r) +{ + return r->w > 0 && r->h > 0; +} + +/** Returns true if ra contains rb. */ +bool rect_contains(const struct rectangle *ra, const struct rectangle *rb); + +/** Returns true if ra and rb overlap. */ +bool rect_overlap(const struct rectangle *ra, const struct rectangle *rb); + +/** + * Computes the biggest rectangle contained in ra and rb. + * Returns true if the intersection exists, and writes it to r_out. + * + * Returns false if there is no intersection, or either input + * rectangle is degenerate. In this case r_out may be uninitialized. + */ +bool rect_intersect(const struct rectangle *ra, const struct rectangle *rb, + struct rectangle *r_out); + +/** + * Computes the smallest rectangle containing both ra and rb. + * + * If one input is degenerate, and the other is not, the output is a + * copy of the non-degenerate input. If both inputs are degenerate, + * then the output is degenerate but is otherwise unspecified. + */ +void rect_union(const struct rectangle *ra, const struct rectangle *rb, + struct rectangle *r_out); + +/** + * Computes the result of subtracting 'rsub' from 'rect'. Up to four + * non-overlapping output rectangles will written to 'rects_out'; the + * return value is the number of rectangles written. + * + * If 'rsub' does not overlap 'rect', or if either of the inputs are + * degenerate, the output is a single rectangle: a copy of 'rect'. + */ +int rect_difference(const struct rectangle *rect, + const struct rectangle *rsub, + struct rectangle rects_out[4]); + +#endif /* _RECTANGLE_H_ */ |