1
1
Fork 0
mirror of https://github.com/griffi-gh/hUI.git synced 2025-04-13 19:27:21 -05:00

allocate -> add to be consistent with fonts api, minor public api changes

This commit is contained in:
griffi-gh 2025-03-11 13:39:46 +01:00
parent 119b9ad077
commit e43998419a
7 changed files with 62 additions and 27 deletions

View file

@ -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| {

View file

@ -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,)| {

View file

@ -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,)| {

View file

@ -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),
}

View file

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

View file

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

View file

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