Skip to main content

pfx_play/
paint.rs

1use pfx_gpu::wgpu;
2use pfx_live::flat::look::Look;
3use pfx_live::renderer::Renderer;
4
5#[derive(Clone, Copy, Debug, PartialEq)]
6pub struct PaintFrame {
7    pub format: wgpu::TextureFormat,
8    pub output: [u32; 2],
9    pub content: [f32; 4],
10    pub clip: Option<[u32; 4]>,
11    pub render: Option<[u32; 2]>,
12    pub layout: [f32; 2],
13    pub content_units: [f32; 4],
14    pub window_units: [f32; 2],
15    pub pixels_per_unit: f32,
16    pub frame: u64,
17    pub seed: u32,
18}
19
20#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
21pub enum Warming {
22    #[default]
23    Done,
24    More,
25}
26
27pub trait Warmer {
28    fn glyphs(
29        &mut self,
30        family: &str,
31        weight: u16,
32        sizes: &[f32],
33        chars: &str,
34    ) -> Result<usize, String>;
35
36    fn looks(&mut self, looks: &[Look]) -> Result<(), String>;
37
38    fn renderer(&mut self) -> Option<&mut Renderer>;
39}
40
41pub struct Warm<'a> {
42    warmer: &'a mut dyn Warmer,
43    pass: u32,
44    elapsed: f64,
45    budget: f64,
46}
47
48impl<'a> Warm<'a> {
49    pub fn new(warmer: &'a mut dyn Warmer, pass: u32, elapsed: f64, budget: f64) -> Self {
50        Self {
51            warmer,
52            pass,
53            elapsed,
54            budget,
55        }
56    }
57
58    pub fn glyphs(
59        &mut self,
60        family: &str,
61        weight: u16,
62        sizes: &[f32],
63        chars: &str,
64    ) -> Result<usize, String> {
65        self.warmer.glyphs(family, weight, sizes, chars)
66    }
67
68    pub fn looks(&mut self, looks: &[Look]) -> Result<(), String> {
69        self.warmer.looks(looks)
70    }
71
72    pub fn renderer(&mut self) -> Option<&mut Renderer> {
73        self.warmer.renderer()
74    }
75
76    pub fn pass(&self) -> u32 {
77        self.pass
78    }
79
80    pub fn elapsed(&self) -> f64 {
81        self.elapsed
82    }
83
84    pub fn budget(&self) -> f64 {
85        self.budget
86    }
87
88    pub fn left(&self) -> f64 {
89        (self.budget - self.elapsed).max(0.0)
90    }
91}
92
93pub struct NoWarmer;
94
95impl Warmer for NoWarmer {
96    fn glyphs(
97        &mut self,
98        _family: &str,
99        _weight: u16,
100        _sizes: &[f32],
101        _chars: &str,
102    ) -> Result<usize, String> {
103        Ok(0)
104    }
105
106    fn looks(&mut self, _looks: &[Look]) -> Result<(), String> {
107        Ok(())
108    }
109
110    fn renderer(&mut self) -> Option<&mut Renderer> {
111        None
112    }
113}