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);
     }