git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

scenefx/types/fx/blur_data.c (2K)

 1 #include "scenefx/types/fx/blur_data.h"
 2 
 3 struct blur_data blur_data_get_default(void) {
 4 	return (struct blur_data) {
 5 		.radius = 5,
 6 		.num_passes = 3,
 7 		.noise = 0.02,
 8 		.brightness = 0.9,
 9 		.contrast = 0.9,
10 		.saturation = 1.1,
11 	};
12 }
13 
14 bool is_scene_blur_enabled(struct blur_data *blur_data) {
15 	return blur_data->radius > 0 && blur_data->num_passes > 0;
16 }
17 
18 bool blur_data_should_parameters_blur_effects(struct blur_data *blur_data) {
19 	return blur_data->brightness != 1.0f
20 		|| blur_data->saturation != 1.0f
21 		|| blur_data->contrast != 1.0f
22 		|| blur_data->noise > 0.0f;
23 }
24 
25 int blur_data_calc_size(struct blur_data *blur_data) {
26 	return pow(2, blur_data->num_passes + 1) * blur_data->radius;
27 }
28 
29 static float lerp(float a, float b, float f) {
30 	return (a * (1.0 - f)) + (b * f);
31 }
32 
33 static void adjust_post_effects(struct blur_data *blur_data, float strength) {
34 	blur_data->brightness = lerp(1.0, blur_data->brightness, strength);
35 	blur_data->contrast = lerp(1.0, blur_data->contrast, strength);
36 	blur_data->noise = lerp(0.0, blur_data->noise, strength);
37 	blur_data->saturation = lerp(1.0, blur_data->saturation, strength);
38 }
39 
40 struct blur_data blur_data_apply_strength(struct blur_data *ref_blur_data, float strength) {
41 	struct blur_data blur_data = *ref_blur_data;
42 
43 	if (strength >= 1.0f) {
44 		adjust_post_effects(&blur_data, 1.0f);
45 		return blur_data;
46 	} else if (strength <= 0.0f) {
47 		adjust_post_effects(&blur_data, 0.0f);
48 		blur_data.num_passes = 0;
49 		blur_data.radius = 0.0f;
50 		return blur_data;
51 	}
52 
53 	// Calculate the new blur strength from the new alpha multiplied blur size
54 	// Also make sure that the values are never larger than the initial values
55 	int new_size = blur_data_calc_size(ref_blur_data) * strength;
56 	blur_data.num_passes = fmax(0, fmin(ref_blur_data->num_passes, ceilf(log2(new_size / ref_blur_data->radius))));
57 	blur_data.radius = fmax(0, fmin(ref_blur_data->radius, new_size / pow(2, blur_data.num_passes + 1)));
58 
59 	adjust_post_effects(&blur_data, strength);
60 
61 	return blur_data;
62 }
63