From 81671d02b82cbc609f6a73ad90e66e4d05e8cfe2 Mon Sep 17 00:00:00 2001 From: grovesNL Date: Mon, 16 May 2022 13:23:58 -0230 Subject: [PATCH] Validate shared screen resolution --- src/lib.rs | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6d8eced..4d17ca5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,7 +58,8 @@ impl Error for PrepareError {} #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum RenderError { - AtlasFull, + RemovedFromAtlas, + ScreenResolutionChanged, } impl Display for RenderError { @@ -328,6 +329,7 @@ pub struct TextRenderer { vertices_to_render: u32, atlas: TextAtlas, glyphs_in_use: HashSet, + screen_resolution: Resolution, } impl TextRenderer { @@ -356,6 +358,10 @@ impl TextRenderer { vertices_to_render: 0, atlas: atlas.clone(), glyphs_in_use: HashSet::new(), + screen_resolution: Resolution { + width: 0, + height: 0, + }, } } @@ -367,12 +373,14 @@ impl TextRenderer { fonts: &[Font], layouts: &[Layout], ) -> Result<(), PrepareError> { - let current_resolution = { + self.screen_resolution = screen_resolution; + + let atlas_current_resolution = { let atlas = self.atlas.inner.read().expect("atlas locked"); atlas.params.screen_resolution }; - if screen_resolution != current_resolution { + if screen_resolution != atlas_current_resolution { let mut atlas = self.atlas.inner.write().expect("atlas locked"); atlas.params.screen_resolution = screen_resolution; queue.write_buffer(&atlas.params_buffer, 0, unsafe { @@ -599,11 +607,19 @@ impl TextRenderer { return Ok(()); } - // Validate that glyphs haven't been evicted from cache since `prepare` - let atlas = self.atlas.inner.read().expect("atlas locked"); - for glyph in self.glyphs_in_use.iter() { - if !atlas.glyph_cache.contains_key(glyph) { - return Err(RenderError::AtlasFull); + { + let atlas = self.atlas.inner.read().expect("atlas locked"); + + // Validate that glyphs haven't been evicted from cache since `prepare` + for glyph in self.glyphs_in_use.iter() { + if !atlas.glyph_cache.contains_key(glyph) { + return Err(RenderError::RemovedFromAtlas); + } + } + + // Validate that screen resolution hasn't changed since `prepare` + if self.screen_resolution != atlas.params.screen_resolution { + return Err(RenderError::ScreenResolutionChanged); } }