15 #include "ui_rect_util.h"
22 ui_rect_t UI_RECT_get_minimum_bounding_rect(
const ui_rect_t rects[],
const size_t count) {
24 ui_rect_t result = rects[0];
25 for (
size_t i=1; i<count; i++) {
26 result = UI_RECT_get_minimum_bounding_rect_two_rects(&result, &rects[i]);
32 uint32_t UI_RECT_union(ui_rect_t output[3],
const ui_rect_t* first,
const ui_rect_t* second) {
34 if (UI_RECT_contains_rect(first, second)) {
36 UI_RECT_mark_empty(&output[1]);
37 UI_RECT_mark_empty(&output[2]);
39 }
else if (UI_RECT_contains_rect(second, first)) {
41 UI_RECT_mark_empty(&output[1]);
42 UI_RECT_mark_empty(&output[2]);
44 }
else if (!UI_RECT_intersects_rect(first, second)) {
47 UI_RECT_mark_empty(&output[2]);
50 const ui_rect_t* top_above = (first->y1 < second->y1) ? first : second;
51 const ui_rect_t* top_below = (first->y1 < second->y1) ? second : first;
52 const ui_rect_t* bottom_below = (first->y2 > second->y2) ? first : second;
53 const ui_rect_t* bottom_above = (first->y2 > second->y2) ? second : first;
57 output[count] = UI_RECT_new_xyxy(top_above->x1, top_above->y1, top_above->x2, top_below->y1-1);
58 if (!UI_RECT_is_empty(output)) {
62 output[count] = UI_RECT_new_xyxy(MIN(first->x1, second->x1), top_below->y1, MAX(first->x2, second->x2), bottom_above->y2);
63 if (!UI_RECT_is_empty(output)) {
67 output[count] = UI_RECT_new_xyxy(bottom_below->x1, bottom_above->y2+1, bottom_below->x2, bottom_below->y2);
68 if (!UI_RECT_is_empty(output)) {
78 uint32_t UI_RECT_subtract(ui_rect_t output[4],
const ui_rect_t* first,
const ui_rect_t* second) {
80 if (UI_RECT_contains_rect(first, second)) {
81 output[0] = UI_RECT_new_xyxy(first->x1, first->y1, first->x2, second->y1-1);
82 output[1] = UI_RECT_new_xyxy(first->x1, second->y1, second->x1-1, second->y2);
83 output[2] = UI_RECT_new_xyxy(second->x2+1, second->y1, first->x2, second->y2);
84 output[3] = UI_RECT_new_xyxy(first->x1, second->y2+1, first->x2, first->y2);
86 }
else if (UI_RECT_contains_rect(second, first)) {
87 UI_RECT_mark_empty(&output[0]);
88 UI_RECT_mark_empty(&output[1]);
89 UI_RECT_mark_empty(&output[2]);
90 UI_RECT_mark_empty(&output[3]);
92 }
else if (!UI_RECT_intersects_rect(first, second)) {
94 UI_RECT_mark_empty(&output[1]);
95 UI_RECT_mark_empty(&output[2]);
96 UI_RECT_mark_empty(&output[3]);
99 output[0] = UI_RECT_new_xyxy(first->x1, first->y1, first->x2, second->y1-1);
100 output[1] = UI_RECT_new_xyxy(first->x1, MAX(first->y1, second->y1), second->x1-1, MIN(first->y2, second->y2));
101 output[2] = UI_RECT_new_xyxy(second->x2+1, MAX(first->y1, second->y1), first->x2, MIN(first->y2, second->y2));
102 output[3] = UI_RECT_new_xyxy(first->x1, second->y2+1, first->x2, first->y2);