PatchworkOS
Loading...
Searching...
No Matches
region.h
Go to the documentation of this file.
1#pragma once
2
3#include <libpatchwork/rect.h>
4#include <stdbool.h>
5#include <stdint.h>
6
7#define MAX_REGION_RECTS 128
8
9typedef struct
10{
13} region_t;
14
15#define REGION_CREATE {.count = 0}
16
17static inline void region_init(region_t* region)
18{
19 region->count = 0;
20}
21
22static inline void region_clear(region_t* region)
23{
24 region->count = 0;
25}
26
27static inline bool region_is_empty(const region_t* region)
28{
29 return region->count == 0;
30}
31
32static inline void region_add(region_t* region, const rect_t* rect)
33{
34 if (RECT_AREA(rect) == 0)
35 {
36 return;
37 }
38
39 rect_t newRect = *rect;
40 for (uint64_t i = 0; i < region->count; i++)
41 {
42 if (RECT_OVERLAP(&region->rects[i], rect))
43 {
44 RECT_EXPAND_TO_CONTAIN(&newRect, &region->rects[i]);
45 region->rects[i] = region->rects[region->count - 1];
46 region->count--;
47 i--;
48 }
49 }
50
51 if (region->count < MAX_REGION_RECTS)
52 {
53 region->rects[region->count] = newRect;
54 region->count++;
55 }
56 else
57 {
58 rect_t mergedRect = region->rects[0];
59 for (uint64_t i = 1; i < region->count; i++)
60 {
61 RECT_EXPAND_TO_CONTAIN(&mergedRect, &region->rects[i]);
62 }
63 RECT_EXPAND_TO_CONTAIN(&mergedRect, &newRect);
64 region->rects[0] = mergedRect;
65 region->count = 1;
66 }
67}
68
69static inline void region_subtract(region_t* region, const rect_t* subRect)
70{
71 region_t result = REGION_CREATE;
72
73 for (uint64_t i = 0; i < region->count; i++)
74 {
75 rect_subtract_t subRects;
76 RECT_SUBTRACT(&subRects, &region->rects[i], subRect);
77 for (uint64_t j = 0; j < subRects.count; j++)
78 {
79 region_add(&result, &subRects.rects[j]);
80 }
81 }
82
83 *region = result;
84}
85
86static inline void region_intersect(region_t* region, region_t* out, const rect_t* clipRect)
87{
88 region_clear(out);
89
90 for (uint64_t i = 0; i < region->count; i++)
91 {
92 rect_t intersect;
93 RECT_INTERSECT(&intersect, &region->rects[i], clipRect);
94 if (RECT_AREA(&intersect) > 0)
95 {
96 region_add(out, &intersect);
97 }
98 }
99}
#define RECT_OVERLAP(rect, other)
Definition rect.h:65
#define RECT_SUBTRACT(result, rect, other)
Definition rect.h:97
#define RECT_AREA(rect)
Definition rect.h:40
#define RECT_EXPAND_TO_CONTAIN(rect, other)
Definition rect.h:44
#define RECT_INTERSECT(dest, src1, src2)
Definition rect.h:129
static void region_intersect(region_t *region, region_t *out, const rect_t *clipRect)
Definition region.h:86
static bool region_is_empty(const region_t *region)
Definition region.h:27
static void region_add(region_t *region, const rect_t *rect)
Definition region.h:32
static void region_init(region_t *region)
Definition region.h:17
#define MAX_REGION_RECTS
Definition region.h:7
#define REGION_CREATE
Definition region.h:15
static void region_clear(region_t *region)
Definition region.h:22
static void region_subtract(region_t *region, const rect_t *subRect)
Definition region.h:69
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
uint8_t count
Definition rect.h:23
rect_t rects[4]
Definition rect.h:22
Definition rect.h:13
rect_t rects[MAX_REGION_RECTS]
Definition region.h:11
uint64_t count
Definition region.h:12