git.lucas.co / cce-compositor
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 }