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