Skip to main content

oxiui_render_wgpu/
quality.rs

1//! Configurable render-quality settings.
2//!
3//! Quality presets are provided for convenience; callers may also construct
4//! a [`RenderQuality`] manually for fine-grained control.
5
6// ── Shadow quality ─────────────────────────────────────────────────────────────
7
8/// Controls the fidelity of box-shadow rendering.
9#[derive(Clone, Debug, PartialEq)]
10pub enum ShadowQuality {
11    /// Shadows are not rendered.
12    Off,
13    /// Low-quality (fast) shadow approximation.
14    Low,
15    /// High-quality (expensive) shadow blur.
16    High,
17}
18
19// ── Text quality ──────────────────────────────────────────────────────────────
20
21/// Controls the anti-aliasing strategy used for text rendering.
22#[derive(Clone, Debug, PartialEq)]
23pub enum TextQuality {
24    /// Greyscale anti-aliasing (single-channel coverage).
25    Grayscale,
26    /// Subpixel anti-aliasing (RGB stripe).
27    Subpixel,
28    /// Signed-distance-field glyph rendering (resolution-independent).
29    Sdf,
30}
31
32// ── RenderQuality ─────────────────────────────────────────────────────────────
33
34/// Aggregated quality settings for the wgpu render pipeline.
35///
36/// Use one of the preset constructors ([`low`], [`balanced`], [`high`]) or
37/// construct directly for custom tuning.
38///
39/// [`low`]: RenderQuality::low
40/// [`balanced`]: RenderQuality::balanced
41/// [`high`]: RenderQuality::high
42#[derive(Clone, Debug)]
43pub struct RenderQuality {
44    /// MSAA sample count.  Must be a power of two; 1 disables MSAA.
45    pub msaa: u32,
46    /// Shadow rendering quality.
47    pub shadow: ShadowQuality,
48    /// Text rendering quality.
49    pub text: TextQuality,
50}
51
52impl RenderQuality {
53    /// Low-quality preset: no MSAA, no shadows, greyscale text.
54    pub fn low() -> Self {
55        Self {
56            msaa: 1,
57            shadow: ShadowQuality::Off,
58            text: TextQuality::Grayscale,
59        }
60    }
61
62    /// Balanced preset: 4× MSAA, low-quality shadows, SDF text.
63    pub fn balanced() -> Self {
64        Self {
65            msaa: 4,
66            shadow: ShadowQuality::Low,
67            text: TextQuality::Sdf,
68        }
69    }
70
71    /// High-quality preset: 8× MSAA, high-quality shadows, SDF text.
72    pub fn high() -> Self {
73        Self {
74            msaa: 8,
75            shadow: ShadowQuality::High,
76            text: TextQuality::Sdf,
77        }
78    }
79}
80
81// ── Tests ─────────────────────────────────────────────────────────────────────
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn quality_presets_correct_values() {
89        let low = RenderQuality::low();
90        assert_eq!(low.msaa, 1);
91        assert_eq!(low.shadow, ShadowQuality::Off);
92        assert_eq!(low.text, TextQuality::Grayscale);
93
94        let balanced = RenderQuality::balanced();
95        assert_eq!(balanced.msaa, 4);
96        assert_eq!(balanced.shadow, ShadowQuality::Low);
97        assert_eq!(balanced.text, TextQuality::Sdf);
98
99        let high = RenderQuality::high();
100        assert_eq!(high.msaa, 8);
101        assert_eq!(high.shadow, ShadowQuality::High);
102        assert_eq!(high.text, TextQuality::Sdf);
103    }
104}