From 1be32529b161d6c67d51004062ee4e6280036fb3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 22 May 2020 14:17:46 +0200 Subject: [PATCH] common: add helper for subtracting rectangles Not sure if generally useful; the following commit uses it. --- common/common.c | 22 ++++++++++++++++++++++ common/common.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/common/common.c b/common/common.c index 0552bddda4..6607f95c3c 100644 --- a/common/common.c +++ b/common/common.c @@ -126,6 +126,28 @@ bool mp_rect_equals(struct mp_rect *rc1, struct mp_rect *rc2) rc1->x1 == rc2->x1 && rc1->y1 == rc2->y1; } +// Compute rc1-rc2, put result in res_array, return number of rectangles in +// res_array. In the worst case, there are 4 rectangles, so res_array must +// provide that much storage space. +int mp_rect_subtract(const struct mp_rect *rc1, const struct mp_rect *rc2, + struct mp_rect res[4]) +{ + struct mp_rect rc = *rc1; + if (!mp_rect_intersection(&rc, rc2)) + return 0; + + int cnt = 0; + if (rc1->y0 < rc.y0) + res[cnt++] = (struct mp_rect){rc1->x0, rc1->y0, rc1->x1, rc.y0}; + if (rc1->x0 < rc.x0) + res[cnt++] = (struct mp_rect){rc1->x0, rc.y0, rc.x0, rc.y1}; + if (rc1->x1 > rc.x1) + res[cnt++] = (struct mp_rect){rc.x1, rc.y0, rc1->x1, rc.y1}; + if (rc1->y1 > rc.y1) + res[cnt++] = (struct mp_rect){rc1->x0, rc.y1, rc1->x1, rc1->y1}; + return cnt; +} + // This works like snprintf(), except that it starts writing the first output // character to str[strlen(str)]. This returns the number of characters the // string would have *appended* assuming a large enough buffer, will make sure diff --git a/common/common.h b/common/common.h index 8dbb304625..af01e38e10 100644 --- a/common/common.h +++ b/common/common.h @@ -87,6 +87,8 @@ void mp_rect_union(struct mp_rect *rc, const struct mp_rect *src); bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2); bool mp_rect_contains(struct mp_rect *rc, int x, int y); bool mp_rect_equals(struct mp_rect *rc1, struct mp_rect *rc2); +int mp_rect_subtract(const struct mp_rect *rc1, const struct mp_rect *rc2, + struct mp_rect res_array[4]); unsigned int mp_log2(uint32_t v); uint32_t mp_round_next_power_of_2(uint32_t v);