From 433d25618bd7b26eb518dd986129fa2f88ecbd1a Mon Sep 17 00:00:00 2001 From: griffi-gh <prasol258@gmail.com> Date: Mon, 31 Mar 2025 14:21:33 +0200 Subject: [PATCH] fix resize logic --- hui-painter/Cargo.toml | 1 + hui-painter/src/texture.rs | 28 +++++++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/hui-painter/Cargo.toml b/hui-painter/Cargo.toml index 8df1bb4..3f70b7e 100644 --- a/hui-painter/Cargo.toml +++ b/hui-painter/Cargo.toml @@ -25,6 +25,7 @@ hashbrown = "0.15" nohash-hasher = "0.2" fontdue = "0.9" rustc-hash = "2.0" +log = "0.4" [features] default = ["default-font"] diff --git a/hui-painter/src/texture.rs b/hui-painter/src/texture.rs index a28fce4..56d0570 100644 --- a/hui-painter/src/texture.rs +++ b/hui-painter/src/texture.rs @@ -240,6 +240,15 @@ impl TextureAtlas { handle } + /// Returns the next size the canvas should be resized to in case we run out of space + pub(crate) fn next_size(size: UVec2) -> UVec2 { + size * if size.x >= size.y { + uvec2(1, 2) + } else { + uvec2(2, 1) + } + } + // TODO resize test /// Resize the atlas to the specified size @@ -259,7 +268,11 @@ impl TextureAtlas { let old_size = self.size; self.size = new_size; - self.packer.resize(new_size.x as i32, new_size.y as i32); + log::debug!("resize canvas {old_size} -> {new_size}"); + + if self.packer.size() != (new_size.x as i32, new_size.y as i32) { + self.packer.resize(new_size.x as i32, new_size.y as i32); + } let new_data_len = (new_size.y as usize * new_size.x as usize) * RGBA_BYTES_PER_PIXEL; self.data.resize(new_data_len, 0); @@ -307,16 +320,17 @@ impl TextureAtlas { } } - if !self.packer.can_pack( + let mut new_size = self.size; + while !self.packer.can_pack( size.x as i32, size.y as i32, false ) { - let new_size = self.size * if self.size.x >= self.size.y { - uvec2(1, 2) - } else { - uvec2(2, 1) - }; + new_size = Self::next_size(new_size); + log::trace!("need to resize, is {new_size} enough?"); + self.packer.resize(new_size.x as i32, new_size.y as i32); + } + if new_size != self.size { self.resize(new_size); }