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}