From e43998419aad9024494c9c91bf1f44a12d84ef1c Mon Sep 17 00:00:00 2001
From: griffi-gh <prasol258@gmail.com>
Date: Tue, 11 Mar 2025 13:39:46 +0100
Subject: [PATCH] allocate -> add to be consistent with fonts api, minor public
 api changes

---
 hui-examples/examples/mom_downloader.rs      |  2 +-
 hui-examples/examples/ui_test_2_loading.rs   |  2 +-
 hui-examples/examples/ui_test_3_transform.rs |  2 +-
 hui-examples/examples/vscode_layout.rs       |  2 +-
 hui-painter/src/text/ftm.rs                  |  4 +-
 hui-painter/src/texture.rs                   | 28 +++++------
 hui/src/instance.rs                          | 49 +++++++++++++++++---
 7 files changed, 62 insertions(+), 27 deletions(-)

diff --git a/hui-examples/examples/mom_downloader.rs b/hui-examples/examples/mom_downloader.rs
index 3cd2724..cbbe307 100644
--- a/hui-examples/examples/mom_downloader.rs
+++ b/hui-examples/examples/mom_downloader.rs
@@ -20,7 +20,7 @@ ui_main!{
   "Mom downloader 2000",
   init: |ui| {
     let font_handle = ui.add_font(include_bytes!("../assets/roboto/Roboto-Regular.ttf"));
-    ui.push_font(font_handle);
+    ui.push_font_stack(font_handle);
     Instant::now()
   },
   run: |ui, max_size, instant| {
diff --git a/hui-examples/examples/ui_test_2_loading.rs b/hui-examples/examples/ui_test_2_loading.rs
index 73e484e..aa0e6c9 100644
--- a/hui-examples/examples/ui_test_2_loading.rs
+++ b/hui-examples/examples/ui_test_2_loading.rs
@@ -21,7 +21,7 @@ ui_main!(
   "hUI: Loading screen demo",
   init: |ui| {
     let font = ui.add_font(include_bytes!("../assets/blink/Blink-ynYZ.otf"));
-    ui.push_font(font);
+    ui.push_font_stack(font);
     (std::time::Instant::now(),)
   },
   run: |ui, size, (instant,)| {
diff --git a/hui-examples/examples/ui_test_3_transform.rs b/hui-examples/examples/ui_test_3_transform.rs
index 9b94d62..aa20bc6 100644
--- a/hui-examples/examples/ui_test_3_transform.rs
+++ b/hui-examples/examples/ui_test_3_transform.rs
@@ -23,7 +23,7 @@ ui_main!(
   "hUI: Transform API demo",
   init: |ui| {
     let font = ui.add_font(include_bytes!("../assets/blink/Blink-ynYZ.otf"));
-    ui.push_font(font);
+    ui.push_font_stack(font);
     (std::time::Instant::now(),)
   },
   run: |ui, size, (instant,)| {
diff --git a/hui-examples/examples/vscode_layout.rs b/hui-examples/examples/vscode_layout.rs
index e249a94..8e5f93a 100644
--- a/hui-examples/examples/vscode_layout.rs
+++ b/hui-examples/examples/vscode_layout.rs
@@ -25,7 +25,7 @@ ui_main!(
   "hUI: vscode demo",
   init: |ui| {
     let handle = ui.add_font(include_bytes!("../assets/fira/FiraSans-Light.ttf"));
-    ui.push_font(handle);
+    ui.push_font_stack(handle);
     Stuff {
       vscode_icon: ui.add_image(SourceTextureFormat::RGBA8, include_bytes!("../assets/icons/visual-studio-code-icon_32x32.rgba"), 32),
     }
diff --git a/hui-painter/src/text/ftm.rs b/hui-painter/src/text/ftm.rs
index 022b424..fe0eaad 100644
--- a/hui-painter/src/text/ftm.rs
+++ b/hui-painter/src/text/ftm.rs
@@ -36,7 +36,7 @@ impl FontTextureManager {
   pub(crate) fn drop_font(&mut self, font: FontHandle, atlas: &mut TextureAtlas) {
     let dump = self.partition.remove(&font.0).expect("Font handle is invalid");
     for (_, item) in dump {
-      atlas.deallocate(item.handle);
+      atlas.remove(item.handle);
     }
   }
 
@@ -77,7 +77,7 @@ impl FontTextureManager {
 
     // Rasterize the font and copy the texture data
     let (metrics, data) = font.rasterize_config(config);
-    let handle = atlas.allocate_with_data(SourceTextureFormat::A8, &data, metrics.width);
+    let handle = atlas.add_with_data(SourceTextureFormat::A8, &data, metrics.width);
 
     // Create a texture item struct and insert it into the partition
     let itm = RasterizedGlyphInternal { handle, metrics };
diff --git a/hui-painter/src/texture.rs b/hui-painter/src/texture.rs
index c8e8959..f55960f 100644
--- a/hui-painter/src/texture.rs
+++ b/hui-painter/src/texture.rs
@@ -186,7 +186,7 @@ impl TextureAtlas {
     let mut this = Self::new_internal(size);
 
     // HACK?: ensure 0,0 is a white pixel
-    let h = this.allocate_with_data(SourceTextureFormat::A8, &[255], 1);
+    let h = this.add_with_data(SourceTextureFormat::A8, &[255], 1);
     debug_assert!(
       h.size == uvec2(1, 1) && h.id == 0,
       "The texture handle was not allocated correctly"
@@ -284,7 +284,7 @@ impl TextureAtlas {
   ///
   /// # Panics
   /// - If any of the dimensions of the texture are zero or exceed `i32::MAX`.
-  pub fn allocate(&mut self, size: UVec2) -> TextureHandle {
+  pub fn add_empty(&mut self, size: UVec2) -> TextureHandle {
     assert_size(size);
 
     // Check if any deallocated allocations can be reused
@@ -344,7 +344,7 @@ impl TextureAtlas {
   ///
   /// # Panics
   /// - If the texture handle is invalid for this atlas.
-  pub fn deallocate(&mut self, handle: TextureHandle) {
+  pub fn remove(&mut self, handle: TextureHandle) {
     // Remove the allocation from the active allocations
     let allocation = self.allocations
       .remove(&handle.id)
@@ -439,7 +439,7 @@ impl TextureAtlas {
   /// # Panics
   /// - If any of the dimensions of the texture are zero or exceed `i32::MAX`.
   /// - The length of the data array is zero or not a multiple of the stride (stride = width * bytes per pixel).
-  pub fn allocate_with_data(&mut self, format: SourceTextureFormat, data: &[u8], width: usize) -> TextureHandle {
+  pub fn add_with_data(&mut self, format: SourceTextureFormat, data: &[u8], width: usize) -> TextureHandle {
     assert!(
       !data.is_empty(),
       "texture data must not be empty"
@@ -461,7 +461,7 @@ impl TextureAtlas {
     assert_size(size);
 
     // Allocate the texture
-    let handle = self.allocate(size);
+    let handle = self.add_empty(size);
 
     // Write the data to the texture
     self.update(handle, format, data);
@@ -545,16 +545,16 @@ mod tests {
   }
 
   #[test]
-  fn test_texture_atlas_allocate() {
+  fn test_texture_atlas_add_empty() {
     let mut atlas = TextureAtlas::new_internal(uvec2(128, 128));
-    let handle = atlas.allocate(uvec2(32, 32));
+    let handle = atlas.add_empty(uvec2(32, 32));
     assert_eq!(handle.size, uvec2(32, 32));
     assert_eq!(atlas.get_uv(handle).unwrap().bottom_right, vec2(32. / 128., 32. / 128.));
     assert_eq!(atlas.allocations.len(), 1);
   }
 
   #[test]
-  fn test_texture_atlas_allocate_with_data() {
+  fn test_texture_atlas_add_with_data() {
     fn make_data(o: u8)-> Vec<u8> {
       let mut data = vec![o; 32 * 32 * 4];
       for y in 0..32 {
@@ -570,7 +570,7 @@ mod tests {
     let mut atlas = TextureAtlas::new_internal(uvec2(128, 128));
 
     let data = make_data(1);
-    let handle = atlas.allocate_with_data(SourceTextureFormat::RGBA8, &data, 32);
+    let handle = atlas.add_with_data(SourceTextureFormat::RGBA8, &data, 32);
     assert_eq!(handle.size, uvec2(32, 32));
     assert_eq!(atlas.allocations.len(), 1);
     let uv = atlas.get_uv(handle).unwrap();
@@ -580,7 +580,7 @@ mod tests {
     assert_eq!(uv.bottom_right, vec2(32.0 / 128.0, 32.0 / 128.0));
 
     let data = make_data(2);
-    let handle = atlas.allocate_with_data(SourceTextureFormat::RGBA8, &data, 32);
+    let handle = atlas.add_with_data(SourceTextureFormat::RGBA8, &data, 32);
     assert_eq!(handle.size, uvec2(32, 32));
     assert_eq!(atlas.allocations.len(), 2);
     let uv = atlas.get_uv(handle).unwrap();
@@ -633,10 +633,10 @@ mod tests {
   // }
 
   #[test]
-  fn test_texture_atlas_deallocate() {
+  fn test_texture_atlas_remove() {
     let mut atlas = TextureAtlas::new_internal(uvec2(128, 128));
-    let handle = atlas.allocate(uvec2(32, 32));
-    atlas.deallocate(handle);
+    let handle = atlas.add_empty(uvec2(32, 32));
+    atlas.remove(handle);
     assert_eq!(atlas.allocations.len(), 0);
     assert_eq!(atlas.reuse_allocations.len(), 1);
   }
@@ -644,7 +644,7 @@ mod tests {
   #[test]
   fn test_texture_atlas_get_uv() {
     let mut atlas = TextureAtlas::new_internal(uvec2(128, 128));
-    let handle = atlas.allocate(uvec2(32, 32));
+    let handle = atlas.add_empty(uvec2(32, 32));
     let uv = atlas.get_uv(handle).unwrap();
     assert_eq!(uv.top_left, vec2(0.0, 0.0));
     assert_eq!(uv.top_right, vec2(32.0 / 128.0, 0.0));
diff --git a/hui/src/instance.rs b/hui/src/instance.rs
index a84465c..6a9d2fa 100644
--- a/hui/src/instance.rs
+++ b/hui/src/instance.rs
@@ -1,5 +1,5 @@
 use hui_painter::{
-  backend::BackendData, paint::command::{PaintCommand, PaintList}, presentation::Presentatation, text::FontHandle, texture::{SourceTextureFormat, TextureHandle}, PainterInstance
+  backend::BackendData, paint::command::{PaintCommand, PaintList}, presentation::Presentatation, text::{FontHandle, FontManager}, texture::{SourceTextureFormat, TextureAtlas, TextureHandle}, PainterInstance
 };
 use crate::{
   element::{MeasureContext, ProcessContext, UiElement},
@@ -49,6 +49,41 @@ impl UiInstance {
     }
   }
 
+
+  /// Returns a reference to the painter instance
+  pub fn painter(&self) -> &PainterInstance {
+    &self.painter
+  }
+
+  /// Returns a mutable reference to the painter instance
+  pub fn painter_mut(&mut self) -> &mut PainterInstance {
+    &mut self.painter
+  }
+
+  /// Returns a reference to the texture atlas
+  ///
+  /// Shorthand for:
+  /// ```
+  /// # let mut instance = hui::UiInstance::new();
+  /// instance.painter_mut().textures_mut()
+  /// # ;
+  /// ```
+  pub fn textures_mut(&mut self) -> &mut TextureAtlas {
+    self.painter.textures_mut()
+  }
+
+  /// Returns a reference to the font manager
+  ///
+  /// Shorthand for:
+  /// ```
+  /// # let mut instance = hui::UiInstance::new();
+  /// instance.painter_mut().fonts_mut()
+  /// # ;
+  /// ```
+  pub fn fonts_mut(&mut self) -> &mut FontManager {
+    self.painter.fonts_mut()
+  }
+
   /// Parse and add a font from a raw byte slice to the UI\
   /// TrueType (`.ttf`/`.ttc`) and OpenType (`.otf`) fonts are supported\
   ///
@@ -56,7 +91,7 @@ impl UiInstance {
   ///
   /// ## Panics:
   /// If the font data is invalid or corrupt
-  #[deprecated(note = "use painter.fonts_mut().add instead")]
+  #[deprecated(since = "0.1.0-alpha.7", note = "use instance.fonts_mut().add(...) instead")]
   pub fn add_font(&mut self, font: &[u8]) -> FontHandle {
     self.painter.fonts_mut().add(font)
   }
@@ -67,10 +102,10 @@ impl UiInstance {
   /// Returns an image handle ([`ImageHandle`])\
   /// This handle can be used to reference the texture in draw commands\
   /// It's a light reference and can be cloned/copied freely, but will not be cleaned up even when dropped
-  #[deprecated(note = "use painter.textures_mut().atlas_mut().allocate_with_data instead")]
+  #[deprecated(since = "0.1.0-alpha.7", note = "use instance.textures_mut().add_with_data(...) instead")]
   pub fn add_image(&mut self, format: SourceTextureFormat, data: &[u8], width: usize) -> TextureHandle {
     // self.atlas().add(width, data, format)
-    self.painter.textures_mut().allocate_with_data(format, data, width)
+    self.painter.textures_mut().add_with_data(format, data, width)
   }
 
   //TODO better error handling
@@ -120,7 +155,7 @@ impl UiInstance {
   ///
   /// This function is useful for replacing the default font, use sparingly\
   /// (This library attempts to be stateless, however passing the font to every text element is not very practical)
-  pub fn push_font(&mut self, font: FontHandle) {
+  pub fn push_font_stack(&mut self, font: FontHandle) {
     self.font_stack.push(font);
   }
 
@@ -128,11 +163,11 @@ impl UiInstance {
   ///
   /// ## Panics:
   /// If the font stack is empty
-  pub fn pop_font(&mut self) {
+  pub fn pop_font_stack(&mut self) {
     self.font_stack.pop();
   }
 
-  /// Get the current default font
+  /// Get the current default font from the font stack
   pub fn current_font(&self) -> Option<FontHandle> {
     self.font_stack.current()
   }