diff options
author | 2023-02-08 23:21:04 +0100 | |
---|---|---|
committer | 2023-02-24 13:37:32 +0100 | |
commit | 05c787c2efbd8c8bc11925e1605b8b09ba744268 (patch) | |
tree | 933c28610ae7415228e6be69b31160926481e763 /wgpu/src/text.rs | |
parent | ddbf93a82ff2ee0ca3265baf2f5b4442717b9101 (diff) | |
download | iced-05c787c2efbd8c8bc11925e1605b8b09ba744268.tar.gz iced-05c787c2efbd8c8bc11925e1605b8b09ba744268.tar.bz2 iced-05c787c2efbd8c8bc11925e1605b8b09ba744268.zip |
Grow atlas in `text::Pipeline` when necessary
Diffstat (limited to 'wgpu/src/text.rs')
-rw-r--r-- | wgpu/src/text.rs | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 655ad987..4406177a 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -86,7 +86,7 @@ impl Pipeline { bounds: Rectangle, scale_factor: f32, target_size: Size<u32>, - ) { + ) -> bool { self.system.as_mut().unwrap().with_mut(|fields| { if self.renderers.len() <= self.prepare_layer { self.renderers @@ -165,23 +165,39 @@ impl Pipeline { } }); - renderer - .prepare( - device, - queue, - &mut self.atlas, - glyphon::Resolution { - width: target_size.width, - height: target_size.height, - }, - text_areas, - glyphon::Color::rgb(0, 0, 0), - &mut glyphon::SwashCache::new(fields.fonts), - ) - .expect("Prepare text sections"); - - self.prepare_layer += 1; - }); + let result = renderer.prepare( + device, + queue, + &mut self.atlas, + glyphon::Resolution { + width: target_size.width, + height: target_size.height, + }, + text_areas, + glyphon::Color::rgb(0, 0, 0), + &mut glyphon::SwashCache::new(fields.fonts), + ); + + match result { + Ok(()) => { + self.prepare_layer += 1; + + true + } + Err(glyphon::PrepareError::AtlasFull(content_type)) => { + self.prepare_layer = 0; + + if self.atlas.grow(device, content_type) { + false + } else { + // If the atlas cannot grow, then all bets are off. + // Instead of panicking, we will just pray that the result + // will be somewhat readable... + true + } + } + } + }) } pub fn render<'a>( @@ -205,6 +221,8 @@ impl Pipeline { } pub fn end_frame(&mut self) { + self.atlas.trim(); + self.system .as_mut() .unwrap() |