Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
scenefx/types/fx/clipped_region.c (2.2K)
1 #include "scenefx/types/fx/clipped_region.h"
2 #include "types/fx/clipped_region.h"
3
4 struct fx_corner_radii fx_corner_radii_extend(struct fx_corner_radii corners, int extend) {
5 return (struct fx_corner_radii) {
6 .top_left = corners.top_left == 0 ? 0 : (corners.top_left + extend),
7 .top_right = corners.top_right == 0 ? 0 : (corners.top_right + extend),
8 .bottom_left = corners.bottom_left == 0 ? 0 : (corners.bottom_left + extend),
9 .bottom_right = corners.bottom_right == 0 ? 0 : (corners.bottom_right + extend),
10 };
11 }
12
13 void fx_corner_radii_transform(enum wl_output_transform transform,
14 struct fx_corner_radii *corners) {
15 if (transform & WL_OUTPUT_TRANSFORM_FLIPPED) {
16 *corners = (struct fx_corner_radii){
17 corners->top_right,
18 corners->top_left,
19 corners->bottom_left,
20 corners->bottom_right
21 };
22 }
23
24 unsigned int turns = transform & (WL_OUTPUT_TRANSFORM_90 | WL_OUTPUT_TRANSFORM_180 | WL_OUTPUT_TRANSFORM_270);
25 if (turns > 0) {
26 uint16_t points[4] = {corners->top_left, corners->top_right, corners->bottom_right, corners->bottom_left};
27 *corners = (struct fx_corner_radii){
28 points[turns % 4],
29 points[(turns + 1) % 4],
30 points[(turns + 2) % 4],
31 points[(turns + 3) % 4],
32 };
33 }
34 }
35
36 struct fx_corner_fradii fx_corner_radii_scale(struct fx_corner_radii corners, float scale) {
37 return (struct fx_corner_fradii) {
38 (float)corners.top_left * scale,
39 (float)corners.top_right * scale,
40 (float)corners.bottom_right * scale,
41 (float)corners.bottom_left * scale,
42 };
43 }
44
45 bool fx_corner_radii_eq(const struct fx_corner_radii lhs, const struct fx_corner_radii rhs) {
46 return lhs.top_left == rhs.top_left
47 && lhs.top_right == rhs.top_right
48 && lhs.bottom_right == rhs.bottom_right
49 && lhs.bottom_left == rhs.bottom_left;
50 }
51
52 bool fx_corner_radii_is_empty(const struct fx_corner_radii* corners) {
53 return corners->top_left == 0
54 && corners->top_right == 0
55 && corners->bottom_right == 0
56 && corners->bottom_left == 0;
57 }
58
59 bool fx_corner_fradii_is_empty(const struct fx_corner_fradii* corners) {
60 return corners->top_left == 0.0
61 && corners->top_right == 0.0
62 && corners->bottom_right == 0.0
63 && corners->bottom_left == 0.0;
64 }
65
66 struct clipped_region clipped_region_get_default(void) {
67 return (struct clipped_region) {
68 .corners = {0},
69 .area = (struct wlr_box) {0},
70 };
71 }