From 71898056f3df055568ff0082161543667bd093a4 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Fri, 7 Nov 2025 22:21:57 +0100 Subject: [PATCH] add `WguiFontSystem`, remove `FONT_SYSTEM` singleton, custom fonts, add `Light` font weight there are a few gzip-compressed ttf as for now, looks like variable fonts aren't parsed properly by cosmic_text. Not sure why. Also, we probably need to have a fallback for CJK characters in the future, or just fallback to the built-in ones in the OS. --- Cargo.lock | 5 +- dash-frontend/assets/Quicksand-Bold.ttf.gz | Bin 0 -> 36602 bytes dash-frontend/assets/Quicksand-Light.ttf.gz | Bin 0 -> 36566 bytes dash-frontend/assets/Quicksand-Regular.ttf.gz | Bin 0 -> 38354 bytes dash-frontend/assets/gui/dashboard.xml | 4 +- dash-frontend/src/frontend.rs | 21 ++++++-- dash-frontend/src/tab/home.rs | 16 ++++--- dash-frontend/src/tab/mod.rs | 1 - uidev/src/main.rs | 29 +++++++---- uidev/src/testbed/testbed_any.rs | 2 + uidev/src/testbed/testbed_generic.rs | 4 +- wgui/Cargo.toml | 1 + wgui/src/assets.rs | 9 ++++ wgui/src/components/checkbox.rs | 5 +- wgui/src/components/mod.rs | 1 + wgui/src/components/slider.rs | 3 +- wgui/src/drawing.rs | 3 ++ wgui/src/event.rs | 1 - wgui/src/font_config.rs | 45 ++++++++++++++++++ wgui/src/globals.rs | 13 ++++- wgui/src/i18n.rs | 2 +- wgui/src/layout.rs | 9 +++- wgui/src/lib.rs | 1 + wgui/src/parser/mod.rs | 4 +- wgui/src/parser/style.rs | 1 + wgui/src/renderer_vk/context.rs | 15 ++++-- wgui/src/renderer_vk/text/mod.rs | 3 +- wgui/src/widget/label.rs | 22 +++++---- wgui/src/widget/mod.rs | 9 ++-- wgui/src/widget/sprite.rs | 6 ++- wlx-overlay-s/src/gui/panel/label.rs | 8 ++-- wlx-overlay-s/src/gui/panel/mod.rs | 18 +++++-- wlx-overlay-s/src/state.rs | 6 ++- 33 files changed, 202 insertions(+), 65 deletions(-) create mode 100644 dash-frontend/assets/Quicksand-Bold.ttf.gz create mode 100644 dash-frontend/assets/Quicksand-Light.ttf.gz create mode 100644 dash-frontend/assets/Quicksand-Regular.ttf.gz create mode 100644 wgui/src/font_config.rs diff --git a/Cargo.lock b/Cargo.lock index c7a1e2c..f7ea700 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1852,9 +1852,9 @@ checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -6278,6 +6278,7 @@ dependencies = [ "anyhow", "cosmic-text", "etagere", + "flate2", "glam", "image", "log", diff --git a/dash-frontend/assets/Quicksand-Bold.ttf.gz b/dash-frontend/assets/Quicksand-Bold.ttf.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0467a60ac6ec33b30127a1393d2d3311bb704bd GIT binary patch literal 36602 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 literal 0 HcmV?d00001 diff --git a/dash-frontend/assets/Quicksand-Light.ttf.gz b/dash-frontend/assets/Quicksand-Light.ttf.gz new file mode 100644 index 0000000000000000000000000000000000000000..dbda8da0848478323172b33fd123c9ddf4709bc4 GIT binary patch literal 36566 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 literal 0 HcmV?d00001 diff --git a/dash-frontend/assets/Quicksand-Regular.ttf.gz b/dash-frontend/assets/Quicksand-Regular.ttf.gz new file mode 100644 index 0000000000000000000000000000000000000000..f31c5b69e157147ec40e72ab1b683913771b46ab GIT binary patch literal 38354 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
-
diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index 42db205..48cdb69 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -3,9 +3,9 @@ use std::{cell::RefCell, collections::VecDeque, rc::Rc}; use chrono::Timelike; use glam::Vec2; use wgui::{ - assets::AssetPath, + assets::{AssetPath, AssetProvider}, components::button::ComponentButton, - event::{CallbackDataCommon, EventAlterables}, + font_config::WguiFontConfig, globals::WguiGlobals, i18n::Translation, layout::{LayoutParams, RcLayout, WidgetID}, @@ -54,7 +54,22 @@ pub enum FrontendTask { impl Frontend { pub fn new(params: InitParams) -> anyhow::Result<(RcFrontend, RcLayout)> { - let globals = WguiGlobals::new(Box::new(assets::Asset {}), wgui::globals::Defaults::default())?; + let mut assets = Box::new(assets::Asset {}); + + let font_binary_bold = assets.load_from_path_gzip("Quicksand-Bold.ttf.gz")?; + let font_binary_regular = assets.load_from_path_gzip("Quicksand-Regular.ttf.gz")?; + let font_binary_light = assets.load_from_path_gzip("Quicksand-Light.ttf.gz")?; + + let globals = WguiGlobals::new( + assets, + wgui::globals::Defaults::default(), + &WguiFontConfig { + binaries: vec![&font_binary_regular, &font_binary_bold, &font_binary_light], + family_name_sans_serif: "Quicksand", + family_name_serif: "Quicksand", + family_name_monospace: "", + }, + )?; let (layout, state) = wgui::parser::new_layout_from_assets( &ParseDocumentParams { diff --git a/dash-frontend/src/tab/home.rs b/dash-frontend/src/tab/home.rs index 7472a9c..2ea9df0 100644 --- a/dash-frontend/src/tab/home.rs +++ b/dash-frontend/src/tab/home.rs @@ -1,7 +1,9 @@ use wgui::{ assets::AssetPath, components::button::ComponentButton, + event::CallbackDataCommon, i18n::Translation, + layout::Widget, parser::{Fetchable, ParseDocumentParams, ParserState}, widget::label::WidgetLabel, }; @@ -23,7 +25,7 @@ impl Tab for TabHome { } } -fn configure_label_hello(label_hello: &mut WidgetLabel, i18n: &mut wgui::i18n::I18n, settings: &settings::Settings) { +fn configure_label_hello(common: &mut CallbackDataCommon, label_hello: Widget, settings: &settings::Settings) { let mut username = various::get_username(); // first character as uppercase if let Some(first) = username.chars().next() { @@ -32,12 +34,13 @@ fn configure_label_hello(label_hello: &mut WidgetLabel, i18n: &mut wgui::i18n::I } let translated = if !settings.home_screen.hide_username { - i18n.translate_and_replace("HELLO_USER", ("{USER}", &username)) + common.i18n().translate_and_replace("HELLO_USER", ("{USER}", &username)) } else { - i18n.translate("HELLO").to_string() + common.i18n().translate("HELLO").to_string() }; - label_hello.set_text_simple(i18n, Translation::from_raw_text(&translated)); + let mut label_hello = label_hello.get_as_mut::().unwrap(); + label_hello.set_text(common, Translation::from_raw_text(&translated)); } impl TabHome { @@ -52,8 +55,9 @@ impl TabHome { params.parent_id, )?; - let mut label_hello = state.fetch_widget_as::(¶ms.layout.state, "label_hello")?; - configure_label_hello(&mut label_hello, &mut params.globals.i18n(), params.settings); + let mut c = params.layout.start_common(); + let widget_label = state.fetch_widget(&c.layout.state, "label_hello")?.widget; + configure_label_hello(&mut c.common(), widget_label, params.settings); let btn_apps = state.fetch_component_as::("btn_apps")?; let btn_games = state.fetch_component_as::("btn_games")?; diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs index d13c34f..9139ea7 100644 --- a/dash-frontend/src/tab/mod.rs +++ b/dash-frontend/src/tab/mod.rs @@ -2,7 +2,6 @@ use std::rc::Rc; use wgui::{ components::button::ComponentButton, - event::CallbackDataCommon, globals::WguiGlobals, layout::{Layout, WidgetID}, }; diff --git a/uidev/src/main.rs b/uidev/src/main.rs index 8e178b0..d627240 100644 --- a/uidev/src/main.rs +++ b/uidev/src/main.rs @@ -1,26 +1,26 @@ -use glam::{vec2, Vec2}; +use glam::{Vec2, vec2}; use std::sync::Arc; -use testbed::{testbed_any::TestbedAny, Testbed}; +use testbed::{Testbed, testbed_any::TestbedAny}; use timestep::Timestep; +use tracing_subscriber::EnvFilter; use tracing_subscriber::filter::LevelFilter; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::EnvFilter; use vulkan::init_window; use vulkano::{ + Validated, VulkanError, command_buffer::CommandBufferUsage, format::Format, - image::{view::ImageView, ImageUsage}, + image::{ImageUsage, view::ImageView}, swapchain::{ - acquire_next_image, CompositeAlpha, PresentMode, Surface, SurfaceInfo, Swapchain, - SwapchainCreateInfo, SwapchainPresentInfo, + CompositeAlpha, PresentMode, Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, + SwapchainPresentInfo, acquire_next_image, }, sync::GpuFuture, - Validated, VulkanError, }; use wgui::{ event::{MouseButtonIndex, MouseDownEvent, MouseMotionEvent, MouseUpEvent, MouseWheelEvent}, - gfx::{cmd::WGfxClearMode, WGfx}, + gfx::{WGfx, cmd::WGfxClearMode}, renderer_vk::{self}, }; use winit::{ @@ -32,7 +32,7 @@ use winit::{ use crate::{ rate_limiter::RateLimiter, testbed::{ - testbed_dashboard::TestbedDashboard, testbed_generic::TestbedGeneric, TestbedUpdateParams, + TestbedUpdateParams, testbed_dashboard::TestbedDashboard, testbed_generic::TestbedGeneric, }, }; @@ -337,7 +337,11 @@ fn main() -> Result<(), Box> { .unwrap(); let mut layout = testbed.layout().borrow_mut(); + let globals = layout.state.globals.clone(); + let mut globals = globals.get(); + let mut draw_params = wgui::drawing::DrawParams { + globals: &mut globals, layout: &mut layout, debug_draw: debug_draw_enabled, alpha: timestep.alpha, @@ -347,7 +351,12 @@ fn main() -> Result<(), Box> { drop(layout); let draw_result = render_context - .draw(&mut shared_context, &mut cmd_buf, &primitives) + .draw( + &globals.font_system, + &mut shared_context, + &mut cmd_buf, + &primitives, + ) .unwrap(); if debug_draw_enabled { diff --git a/uidev/src/testbed/testbed_any.rs b/uidev/src/testbed/testbed_any.rs index 472714a..e453132 100644 --- a/uidev/src/testbed/testbed_any.rs +++ b/uidev/src/testbed/testbed_any.rs @@ -5,6 +5,7 @@ use crate::{ use glam::Vec2; use wgui::{ assets::AssetPath, + font_config::WguiFontConfig, globals::WguiGlobals, layout::{LayoutParams, RcLayout}, parser::{ParseDocumentParams, ParserState}, @@ -24,6 +25,7 @@ impl TestbedAny { let globals = WguiGlobals::new( Box::new(assets::Asset {}), wgui::globals::Defaults::default(), + &WguiFontConfig::default(), )?; let (layout, state) = wgui::parser::new_layout_from_assets( diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index c14fa7d..6e790fb 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -8,11 +8,12 @@ use glam::Vec2; use wgui::{ assets::AssetPath, components::{ + Component, button::{ButtonClickCallback, ComponentButton}, checkbox::ComponentCheckbox, - Component, }, drawing::Color, + font_config::WguiFontConfig, globals::WguiGlobals, i18n::Translation, layout::{Layout, LayoutParams, RcLayout, Widget}, @@ -76,6 +77,7 @@ impl TestbedGeneric { let globals = WguiGlobals::new( Box::new(assets::Asset {}), wgui::globals::Defaults::default(), + &WguiFontConfig::default(), )?; let extra = ParseDocumentExtra { diff --git a/wgui/Cargo.toml b/wgui/Cargo.toml index 4d7b251..d57feb3 100644 --- a/wgui/Cargo.toml +++ b/wgui/Cargo.toml @@ -30,3 +30,4 @@ taffy = "0.9.1" vulkano = { workspace = true } vulkano-shaders = { workspace = true } rust-embed = { workspace = true } +flate2 = "1.1.5" diff --git a/wgui/src/assets.rs b/wgui/src/assets.rs index b70d26c..cdceac1 100644 --- a/wgui/src/assets.rs +++ b/wgui/src/assets.rs @@ -1,3 +1,5 @@ +use flate2::read::GzDecoder; +use std::io::Read; use std::path::{Path, PathBuf}; #[derive(Clone, Copy)] @@ -74,6 +76,13 @@ impl Default for AssetPathOwned { pub trait AssetProvider { fn load_from_path(&mut self, path: &str) -> anyhow::Result>; + fn load_from_path_gzip(&mut self, path: &str) -> anyhow::Result> { + let compressed = self.load_from_path(path)?; + let mut gz = GzDecoder::new(&compressed[..]); + let mut out = Vec::new(); + gz.read_to_end(&mut out)?; + Ok(out) + } } // replace "./foo/bar/../file.txt" with "./foo/file.txt" diff --git a/wgui/src/components/checkbox.rs b/wgui/src/components/checkbox.rs index 63f7287..0138ccc 100644 --- a/wgui/src/components/checkbox.rs +++ b/wgui/src/components/checkbox.rs @@ -8,9 +8,9 @@ use crate::{ animation::{Animation, AnimationEasing}, components::{Component, ComponentBase, ComponentTrait, InitData}, drawing::Color, - event::{CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerID, EventListenerKind}, + event::{CallbackDataCommon, EventListenerCollection, EventListenerID, EventListenerKind}, i18n::Translation, - layout::{self, LayoutState, WidgetID, WidgetPair}, + layout::{self, WidgetID, WidgetPair}, renderer_vk::text::{FontWeight, TextStyle}, widget::{ ConstructEssentials, EventResult, @@ -53,6 +53,7 @@ struct State { #[allow(clippy::struct_field_names)] struct Data { + #[allow(dead_code)] id_container: WidgetID, // Rectangle, transparent if not hovered //id_outer_box: WidgetID, // Rectangle, parent of container diff --git a/wgui/src/components/mod.rs b/wgui/src/components/mod.rs index 2d24642..c659579 100644 --- a/wgui/src/components/mod.rs +++ b/wgui/src/components/mod.rs @@ -17,6 +17,7 @@ pub struct InitData<'a> { // common component data #[derive(Default)] pub struct ComponentBase { + #[allow(dead_code)] lhandles: Vec, } diff --git a/wgui/src/components/slider.rs b/wgui/src/components/slider.rs index 7768cc7..37e92f2 100644 --- a/wgui/src/components/slider.rs +++ b/wgui/src/components/slider.rs @@ -53,7 +53,8 @@ struct State { } struct Data { - body: WidgetID, // Div + #[allow(dead_code)] + body: WidgetID, // Div slider_handle_rect_id: WidgetID, // Rectangle slider_text_id: WidgetID, // Text slider_handle_node: taffy::NodeId, diff --git a/wgui/src/drawing.rs b/wgui/src/drawing.rs index 75b20f6..2a1ee56 100644 --- a/wgui/src/drawing.rs +++ b/wgui/src/drawing.rs @@ -7,6 +7,7 @@ use taffy::TraversePartialTree; use crate::{ drawing, event::EventAlterables, + globals::Globals, layout::Widget, renderer_vk::text::{TextShadow, custom_glyph::CustomGlyph}, stack::{self, ScissorBoundary, ScissorStack, TransformStack}, @@ -169,6 +170,7 @@ pub enum RenderPrimitive { } pub struct DrawParams<'a> { + pub globals: &'a Globals, pub layout: &'a mut Layout, pub debug_draw: bool, pub alpha: f32, // timestep alpha, 0.0 - 1.0, used for motion interpolation if rendering above tick rate: smoother animations or scrolling @@ -347,6 +349,7 @@ pub fn draw(params: &mut DrawParams) -> anyhow::Result> { let mut alterables = EventAlterables::default(); let mut state = DrawState { + globals: params.globals, primitives: &mut primitives, transform_stack: &mut transform_stack, scissor_stack: &mut scissor_stack, diff --git a/wgui/src/event.rs b/wgui/src/event.rs index beaef43..0b80ffa 100644 --- a/wgui/src/event.rs +++ b/wgui/src/event.rs @@ -2,7 +2,6 @@ use std::{ any::{Any, TypeId}, cell::RefMut, collections::HashSet, - ops::Deref, }; use glam::Vec2; diff --git a/wgui/src/font_config.rs b/wgui/src/font_config.rs new file mode 100644 index 0000000..d6278e7 --- /dev/null +++ b/wgui/src/font_config.rs @@ -0,0 +1,45 @@ +use parking_lot::Mutex; + +#[derive(Default)] +pub struct WguiFontConfig<'a> { + pub binaries: Vec<&'a [u8]>, + pub family_name_sans_serif: &'a str, + pub family_name_serif: &'a str, + pub family_name_monospace: &'a str, +} + +pub struct WguiFontSystem { + pub system: Mutex, +} + +impl WguiFontSystem { + pub fn new(config: &WguiFontConfig) -> Self { + let mut db = cosmic_text::fontdb::Database::new(); + + let system = if config.binaries.is_empty() { + cosmic_text::FontSystem::new() + } else { + for binary in &config.binaries { + // binary data is copied and preserved here + db.load_font_data(binary.to_vec()); + } + + if !config.family_name_sans_serif.is_empty() { + db.set_sans_serif_family(config.family_name_sans_serif); + } + + if !config.family_name_serif.is_empty() { + db.set_serif_family(config.family_name_serif); + } + + // we don't require anything special, at least for now + let locale = String::from("C"); + + cosmic_text::FontSystem::new_with_locale_and_db(locale, db) + }; + + Self { + system: Mutex::new(system), + } + } +} diff --git a/wgui/src/globals.rs b/wgui/src/globals.rs index d0219dc..5250d5a 100644 --- a/wgui/src/globals.rs +++ b/wgui/src/globals.rs @@ -7,6 +7,7 @@ use std::{ use crate::{ assets::{AssetPath, AssetProvider}, assets_internal, drawing, + font_config::{WguiFontConfig, WguiFontSystem}, i18n::I18n, }; @@ -31,13 +32,18 @@ pub struct Globals { pub assets_builtin: Box, pub i18n_builtin: I18n, pub defaults: Defaults, + pub font_system: WguiFontSystem, } #[derive(Clone)] pub struct WguiGlobals(Rc>); impl WguiGlobals { - pub fn new(mut assets_builtin: Box, defaults: Defaults) -> anyhow::Result { + pub fn new( + mut assets_builtin: Box, + defaults: Defaults, + font_config: &WguiFontConfig, + ) -> anyhow::Result { let i18n_builtin = I18n::new(&mut assets_builtin)?; let assets_internal = Box::new(assets_internal::AssetInternal {}); @@ -46,6 +52,7 @@ impl WguiGlobals { assets_builtin, i18n_builtin, defaults, + font_system: WguiFontSystem::new(font_config), })))) } @@ -81,4 +88,8 @@ impl WguiGlobals { pub fn assets_builtin(&self) -> RefMut<'_, Box> { RefMut::map(self.0.borrow_mut(), |x| &mut x.assets_builtin) } + + pub fn font_system(&self) -> RefMut<'_, WguiFontSystem> { + RefMut::map(self.0.borrow_mut(), |x| &mut x.font_system) + } } diff --git a/wgui/src/i18n.rs b/wgui/src/i18n.rs index 9fee6c5..5b5d432 100644 --- a/wgui/src/i18n.rs +++ b/wgui/src/i18n.rs @@ -75,7 +75,7 @@ impl I18n { log::info!("Guessed system language: {lang}"); match lang.as_str() { - "en" | "pl" | "it" | "ja" | "es" => {} + "en" | "pl" | "it" | "ja" | "es" | "de" => {} _ => { log::warn!("Unsupported language \"{}\", defaulting to \"en\".", lang.as_str()); diff --git a/wgui/src/layout.rs b/wgui/src/layout.rs index 5b647a4..285e3b1 100644 --- a/wgui/src/layout.rs +++ b/wgui/src/layout.rs @@ -198,7 +198,7 @@ fn add_child_internal( pub struct LayoutCommon<'a> { alterables: EventAlterables, - layout: &'a mut Layout, + pub layout: &'a mut Layout, } impl LayoutCommon<'_> { @@ -564,6 +564,8 @@ impl Layout { log::debug!("re-computing layout, size {}x{}", size.x, size.y); self.prev_size = size; + let globals = self.state.globals.get(); + self.state.tree.compute_layout_with_measure( self.tree_root_node, taffy::Size { @@ -583,7 +585,10 @@ impl Layout { None => taffy::Size::ZERO, Some(h) => { if let Some(w) = self.state.widgets.get(*h) { - w.0.borrow_mut().obj.measure(known_dimensions, available_space) + w.0 + .borrow_mut() + .obj + .measure(&globals, known_dimensions, available_space) } else { taffy::Size::ZERO } diff --git a/wgui/src/lib.rs b/wgui/src/lib.rs index 682dd71..2e4a45e 100644 --- a/wgui/src/lib.rs +++ b/wgui/src/lib.rs @@ -27,6 +27,7 @@ mod assets_internal; pub mod components; pub mod drawing; pub mod event; +pub mod font_config; pub mod gfx; pub mod globals; pub mod i18n; diff --git a/wgui/src/parser/mod.rs b/wgui/src/parser/mod.rs index 14c3e53..bdc96df 100644 --- a/wgui/src/parser/mod.rs +++ b/wgui/src/parser/mod.rs @@ -8,7 +8,7 @@ mod widget_rectangle; mod widget_sprite; use crate::{ - assets::{normalize_path, AssetPath, AssetPathOwned}, + assets::{AssetPath, AssetPathOwned, normalize_path}, components::{Component, ComponentWeak}, drawing::{self}, globals::WguiGlobals, @@ -624,7 +624,7 @@ pub fn replace_vars(input: &str, vars: &HashMap, Rc>) -> Rc { if let Some(replacement) = vars.get(input_var) { replacement.clone() } else { - log::warn!("failed to replace var named \"{input_var}\" (not found)"); + // failed to find var, return an empty string Rc::from("") } }); diff --git a/wgui/src/parser/style.rs b/wgui/src/parser/style.rs index a3f6094..9180099 100644 --- a/wgui/src/parser/style.rs +++ b/wgui/src/parser/style.rs @@ -65,6 +65,7 @@ pub fn parse_text_style(attribs: &[AttribPair]) -> TextStyle { } }, "weight" => match value { + "light" => style.weight = Some(FontWeight::Light), "normal" => style.weight = Some(FontWeight::Normal), "bold" => style.weight = Some(FontWeight::Bold), _ => { diff --git a/wgui/src/renderer_vk/context.rs b/wgui/src/renderer_vk/context.rs index 2a20aea..3f3247b 100644 --- a/wgui/src/renderer_vk/context.rs +++ b/wgui/src/renderer_vk/context.rs @@ -7,13 +7,14 @@ use vulkano::pipeline::graphics::viewport; use crate::{ drawing::{self}, + font_config, gfx::{WGfx, cmd::GfxCommandBuffer}, }; use super::{ rect::{RectPipeline, RectRenderer}, text::{ - DEFAULT_METRICS, FONT_SYSTEM, SWASH_CACHE, TextArea, TextBounds, + DEFAULT_METRICS, SWASH_CACHE, TextArea, TextBounds, text_atlas::{TextAtlas, TextPipeline}, text_renderer::TextRenderer, }, @@ -51,6 +52,7 @@ impl RendererPass<'_> { fn submit( &mut self, + font_system: &font_config::WguiFontSystem, gfx: &Arc, viewport: &mut Viewport, cmd_buf: &mut GfxCommandBuffer, @@ -90,7 +92,7 @@ impl RendererPass<'_> { self.rect_renderer.render(gfx, viewport, &vk_scissor, cmd_buf)?; { - let mut font_system = FONT_SYSTEM.lock(); + let mut font_system = font_system.system.lock(); let mut swash_cache = SWASH_CACHE.lock(); self.text_renderer.prepare( @@ -217,6 +219,7 @@ impl Context { pub fn draw( &mut self, + font_system: &font_config::WguiFontSystem, shared: &mut SharedContext, cmd_buf: &mut GfxCommandBuffer, primitives: &[drawing::RenderPrimitive], @@ -302,7 +305,13 @@ impl Context { }; for mut pass in passes { - pass.submit(&shared.gfx, &mut self.viewport, cmd_buf, &mut atlas.text_atlas)?; + pass.submit( + font_system, + &shared.gfx, + &mut self.viewport, + cmd_buf, + &mut atlas.text_atlas, + )?; } Ok(res) diff --git a/wgui/src/renderer_vk/text/mod.rs b/wgui/src/renderer_vk/text/mod.rs index 96b587c..8bb5463 100644 --- a/wgui/src/renderer_vk/text/mod.rs +++ b/wgui/src/renderer_vk/text/mod.rs @@ -13,7 +13,6 @@ use parking_lot::Mutex; use crate::drawing::{self}; -pub static FONT_SYSTEM: LazyLock> = LazyLock::new(|| Mutex::new(FontSystem::new())); pub static SWASH_CACHE: LazyLock> = LazyLock::new(|| Mutex::new(SwashCache::new())); /// Used in case no `font_size` is defined @@ -102,6 +101,7 @@ impl From for Style { #[derive(Default, Debug, Clone, Copy)] pub enum FontWeight { + Light, #[default] Normal, Bold, @@ -110,6 +110,7 @@ pub enum FontWeight { impl From for Weight { fn from(value: FontWeight) -> Self { match value { + FontWeight::Light => Self::LIGHT, FontWeight::Normal => Self::NORMAL, FontWeight::Bold => Self::BOLD, } diff --git a/wgui/src/widget/label.rs b/wgui/src/widget/label.rs index a22de38..ef73ecd 100644 --- a/wgui/src/widget/label.rs +++ b/wgui/src/widget/label.rs @@ -8,9 +8,9 @@ use crate::{ drawing::{self, Boundary, PrimitiveExtent}, event::CallbackDataCommon, globals::Globals, - i18n::{I18n, Translation}, + i18n::Translation, layout::WidgetID, - renderer_vk::text::{TextStyle, FONT_SYSTEM}, + renderer_vk::text::TextStyle, }; use super::{WidgetObj, WidgetState}; @@ -41,7 +41,7 @@ impl WidgetLabel { let mut buffer = Buffer::new_empty(metrics); { - let mut font_system = FONT_SYSTEM.lock(); + let mut font_system = globals.font_system.system.lock(); let mut buffer = buffer.borrow_with(&mut font_system); buffer.set_wrap(wrap); @@ -63,19 +63,19 @@ impl WidgetLabel { // set text without layout/re-render update. // Not recommended unless the widget wasn't rendered yet (first init). - pub fn set_text_simple(&mut self, i18n: &mut I18n, translation: Translation) -> bool { + pub fn set_text_simple(&mut self, globals: &mut Globals, translation: Translation) -> bool { if self.params.content == translation { return false; } self.params.content = translation; let attrs = Attrs::from(&self.params.style); - let mut font_system = FONT_SYSTEM.lock(); + let mut font_system = globals.font_system.system.lock(); let mut buffer = self.buffer.borrow_mut(); buffer.set_rich_text( &mut font_system, - [(self.params.content.generate(i18n).as_ref(), attrs)], + [(self.params.content.generate(&mut globals.i18n_builtin).as_ref(), attrs)], &Attrs::new(), Shaping::Advanced, self.params.style.align.map(Into::into), @@ -93,7 +93,9 @@ impl WidgetLabel { // set text and check if it needs to be re-rendered/re-layouted pub fn set_text(&mut self, common: &mut CallbackDataCommon, translation: Translation) { - if self.set_text_simple(&mut common.i18n(), translation) { + let mut globals = common.state.globals.get(); + + if self.set_text_simple(&mut globals, translation) { common.mark_widget_dirty(self.id); } } @@ -113,7 +115,7 @@ impl WidgetObj for WidgetLabel { if self.last_boundary != boundary { self.last_boundary = boundary; - let mut font_system = FONT_SYSTEM.lock(); + let mut font_system = state.globals.font_system.system.lock(); let mut buffer = self.buffer.borrow_mut(); buffer.set_size(&mut font_system, Some(boundary.size.x), Some(boundary.size.y)); } @@ -130,6 +132,7 @@ impl WidgetObj for WidgetLabel { fn measure( &mut self, + globals: &Globals, known_dimensions: taffy::Size>, available_space: taffy::Size, ) -> taffy::Size { @@ -140,7 +143,8 @@ impl WidgetObj for WidgetLabel { AvailableSpace::Definite(width) => Some(width), }); - let mut font_system = FONT_SYSTEM.lock(); + let wgui_font_system = &globals.font_system; + let mut font_system = wgui_font_system.system.lock(); let mut buffer = self.buffer.borrow_mut(); buffer.set_size(&mut font_system, width_constraint, None); diff --git a/wgui/src/widget/mod.rs b/wgui/src/widget/mod.rs index a69eefa..0b4b7c3 100644 --- a/wgui/src/widget/mod.rs +++ b/wgui/src/widget/mod.rs @@ -10,6 +10,7 @@ use crate::{ EventListenerKind::{self, InternalStateChange, MouseLeave}, MouseWheelEvent, }, + globals::Globals, layout::{Layout, LayoutState, WidgetID}, stack::{ScissorStack, TransformStack}, }; @@ -108,6 +109,7 @@ impl WidgetState { // global draw params pub struct DrawState<'a> { + pub globals: &'a Globals, pub layout: &'a Layout, pub primitives: &'a mut Vec, pub transform_stack: &'a mut TransformStack, @@ -151,6 +153,7 @@ pub trait WidgetObj: AnyTrait { fn measure( &mut self, + _globals: &Globals, _known_dimensions: taffy::Size>, _available_space: taffy::Size, ) -> taffy::Size { @@ -181,11 +184,7 @@ impl EventResult { #[must_use] pub fn merge(self, other: Self) -> Self { - if self > other { - self - } else { - other - } + if self > other { self } else { other } } } diff --git a/wgui/src/widget/sprite.rs b/wgui/src/widget/sprite.rs index 7bc9ec3..f1efce4 100644 --- a/wgui/src/widget/sprite.rs +++ b/wgui/src/widget/sprite.rs @@ -5,10 +5,11 @@ use slotmap::Key; use crate::{ drawing::{self, PrimitiveExtent}, + globals::Globals, layout::WidgetID, renderer_vk::text::{ + DEFAULT_METRICS, custom_glyph::{CustomGlyph, CustomGlyphData}, - DEFAULT_METRICS, FONT_SYSTEM, }, }; @@ -67,7 +68,7 @@ impl WidgetObj for WidgetSprite { let mut buffer = Buffer::new_empty(DEFAULT_METRICS); { - let mut font_system = FONT_SYSTEM.lock(); + let mut font_system = state.globals.font_system.system.lock(); let mut buffer = buffer.borrow_with(&mut font_system); let attrs = Attrs::new().color(Color::rgb(255, 0, 255)).weight(Weight::BOLD); @@ -88,6 +89,7 @@ impl WidgetObj for WidgetSprite { fn measure( &mut self, + _globals: &Globals, _known_dimensions: taffy::Size>, _available_space: taffy::Size, ) -> taffy::Size { diff --git a/wlx-overlay-s/src/gui/panel/label.rs b/wlx-overlay-s/src/gui/panel/label.rs index 23a392e..d812585 100644 --- a/wlx-overlay-s/src/gui/panel/label.rs +++ b/wlx-overlay-s/src/gui/panel/label.rs @@ -15,8 +15,8 @@ use wgui::{ event::{self, EventCallback}, i18n::Translation, layout::Layout, - parser::{parse_color_hex, CustomAttribsInfoOwned}, - widget::{label::WidgetLabel, EventResult}, + parser::{CustomAttribsInfoOwned, parse_color_hex}, + widget::{EventResult, label::WidgetLabel}, }; use crate::state::AppState; @@ -123,13 +123,13 @@ pub(super) fn setup_custom_label( let pretty_tz = maybe_pretty_tz.as_ref().map_or("Local", |x| x.as_str()); - let mut i18n = layout.state.globals.i18n(); + let mut globals = layout.state.globals.get(); layout .state .widgets .get_as::(attribs.widget_id) .unwrap() - .set_text_simple(&mut i18n, Translation::from_raw_text(pretty_tz)); + .set_text_simple(&mut globals, Translation::from_raw_text(pretty_tz)); // does not need to be dynamic return; diff --git a/wlx-overlay-s/src/gui/panel/mod.rs b/wlx-overlay-s/src/gui/panel/mod.rs index 954a2f3..43ab0fa 100644 --- a/wlx-overlay-s/src/gui/panel/mod.rs +++ b/wlx-overlay-s/src/gui/panel/mod.rs @@ -1,7 +1,7 @@ use std::{cell::RefCell, rc::Rc, sync::Arc}; use button::setup_custom_button; -use glam::{vec2, Affine2, Vec2}; +use glam::{Affine2, Vec2, vec2}; use label::setup_custom_label; use vulkano::{command_buffer::CommandBufferUsage, image::view::ImageView}; use wgui::{ @@ -15,14 +15,14 @@ use wgui::{ layout::{Layout, LayoutParams, WidgetID}, parser::ParserState, renderer_vk::context::Context as WguiContext, - widget::{label::WidgetLabel, rectangle::WidgetRectangle, EventResult}, + widget::{EventResult, label::WidgetLabel, rectangle::WidgetRectangle}, }; use crate::{ backend::input::{Haptics, HoverResult, PointerHit, PointerMode}, graphics::{CommandBuffers, ExtentExt}, state::AppState, - windowing::backend::{ui_transform, FrameMeta, OverlayBackend, ShouldRender}, + windowing::backend::{FrameMeta, OverlayBackend, ShouldRender, ui_transform}, }; use super::{timer::GuiTimer, timestep::Timestep}; @@ -237,13 +237,21 @@ impl OverlayBackend for GuiPanel { wgui::gfx::cmd::WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.0]), )?; + let globals = self.layout.state.globals.clone(); // sorry + let mut globals = globals.get(); + let primitives = wgui::drawing::draw(&mut wgui::drawing::DrawParams { + globals: &mut globals, layout: &mut self.layout, debug_draw: false, alpha, })?; - self.context - .draw(&mut app.wgui_shared, &mut cmd_buf, &primitives)?; + self.context.draw( + &globals.font_system, + &mut app.wgui_shared, + &mut cmd_buf, + &primitives, + )?; cmd_buf.end_rendering()?; buf.push(cmd_buf.build()?); diff --git a/wlx-overlay-s/src/state.rs b/wlx-overlay-s/src/state.rs index c0511fb..ea9d23b 100644 --- a/wlx-overlay-s/src/state.rs +++ b/wlx-overlay-s/src/state.rs @@ -1,10 +1,11 @@ use glam::Affine3A; use idmap::IdMap; use serde::{Deserialize, Serialize}; -use smallvec::{smallvec, SmallVec}; +use smallvec::{SmallVec, smallvec}; use std::sync::Arc; use wgui::{ - gfx::WGfx, globals::WguiGlobals, renderer_vk::context::SharedContext as WSharedContext, + font_config::WguiFontConfig, gfx::WGfx, globals::WguiGlobals, + renderer_vk::context::SharedContext as WSharedContext, }; #[cfg(feature = "wayvr")] @@ -97,6 +98,7 @@ impl AppState { wgui_globals: WguiGlobals::new( Box::new(gui::asset::GuiAsset {}), wgui::globals::Defaults::default(), + &WguiFontConfig::default(), )?, #[cfg(feature = "osc")]