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}