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