aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers/debug.rs
blob: 6843aeb4b5e0301d5d225dba75cffc567881e960 (plain)
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));
    }
}