1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
use smithay::backend::renderer::damage::OutputDamageTracker;
use smithay::backend::renderer::element::{Element, Id, Kind};
use smithay::backend::renderer::utils::CommitCounter;
use smithay::backend::renderer::Color32F;
use smithay::utils::Scale;
use super::renderer::NiriRenderer;
use super::solid_color::SolidColorRenderElement;
use crate::niri::OutputRenderElements;
pub fn draw_opaque_regions<R: NiriRenderer>(
elements: &mut Vec<OutputRenderElements<R>>,
scale: Scale<f64>,
) {
let _span = tracy_client::span!("draw_opaque_regions");
let mut i = 0;
while i < elements.len() {
let elem = &elements[i];
i += 1;
// HACK
if format!("{elem:?}").contains("ExtraDamage") {
continue;
}
let geo = elem.geometry(scale);
let mut opaque = elem.opaque_regions(scale).to_vec();
for rect in &mut opaque {
rect.loc += geo.loc;
}
let semitransparent = geo.subtract_rects(opaque.iter().copied());
for rect in opaque {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0., 0., 0.2, 0.2]),
Kind::Unspecified,
);
elements.insert(i - 1, OutputRenderElements::SolidColor(color));
i += 1;
}
for rect in semitransparent {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0.3, 0., 0., 0.3]),
Kind::Unspecified,
);
elements.insert(i - 1, OutputRenderElements::SolidColor(color));
i += 1;
}
}
}
pub fn draw_damage<R: NiriRenderer>(
damage_tracker: &mut OutputDamageTracker,
elements: &mut Vec<OutputRenderElements<R>>,
) {
let _span = tracy_client::span!("draw_damage");
let Ok((_, scale, _)) = damage_tracker.mode().try_into() else {
return;
};
let Ok((Some(damage), _)) = damage_tracker.damage_output(1, elements) else {
return;
};
for rect in damage {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0.3, 0., 0., 0.3]),
Kind::Unspecified,
);
elements.insert(0, OutputRenderElements::SolidColor(color));
}
}
|